localstack-core 4.7.1.dev79__py3-none-any.whl → 4.7.1.dev82__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (22) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model.py +45 -2
  2. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +73 -19
  3. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +16 -5
  4. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +10 -1
  5. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +9 -0
  6. localstack/services/cloudformation/v2/entities.py +4 -3
  7. localstack/services/cloudformation/v2/provider.py +24 -18
  8. localstack/services/cloudformation/v2/types.py +4 -3
  9. localstack/testing/pytest/cloudformation/transformers.py +0 -0
  10. localstack/utils/docker_utils.py +6 -1
  11. localstack/version.py +2 -2
  12. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/METADATA +1 -1
  13. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/RECORD +21 -20
  14. localstack_core-4.7.1.dev82.dist-info/plux.json +1 -0
  15. localstack_core-4.7.1.dev79.dist-info/plux.json +0 -1
  16. {localstack_core-4.7.1.dev79.data → localstack_core-4.7.1.dev82.data}/scripts/localstack +0 -0
  17. {localstack_core-4.7.1.dev79.data → localstack_core-4.7.1.dev82.data}/scripts/localstack-supervisor +0 -0
  18. {localstack_core-4.7.1.dev79.data → localstack_core-4.7.1.dev82.data}/scripts/localstack.bat +0 -0
  19. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/WHEEL +0 -0
  20. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/entry_points.txt +0 -0
  21. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/licenses/LICENSE.txt +0 -0
  22. {localstack_core-4.7.1.dev79.dist-info → localstack_core-4.7.1.dev82.dist-info}/top_level.txt +0 -0
@@ -372,17 +372,20 @@ class NodeTransform(ChangeSetNode):
372
372
  class NodeResources(ChangeSetNode):
373
373
  resources: Final[list[NodeResource]]
374
374
  fn_transform: Final[Maybe[NodeIntrinsicFunctionFnTransform]]
375
+ fn_foreaches: Final[list[NodeForEach]]
375
376
 
376
377
  def __init__(
377
378
  self,
378
379
  scope: Scope,
379
380
  resources: list[NodeResource],
380
381
  fn_transform: Maybe[NodeIntrinsicFunctionFnTransform],
382
+ fn_foreaches: list[NodeForEach],
381
383
  ):
382
- change_type = parent_change_type_of(resources)
384
+ change_type = parent_change_type_of(resources + [fn_transform] + fn_foreaches)
383
385
  super().__init__(scope=scope, change_type=change_type)
384
386
  self.resources = resources
385
387
  self.fn_transform = fn_transform
388
+ self.fn_foreaches = fn_foreaches
386
389
 
387
390
 
388
391
  class NodeResource(ChangeSetNode):
@@ -492,6 +495,20 @@ class NodeIntrinsicFunctionFnTransform(NodeIntrinsicFunction):
492
495
  self.after_siblings = after_siblings
493
496
 
494
497
 
498
+ class NodeForEach(ChangeSetNode):
499
+ def __init__(
500
+ self,
501
+ scope: Scope,
502
+ change_type: Final[ChangeType],
503
+ arguments: Final[ChangeSetEntity],
504
+ ):
505
+ super().__init__(
506
+ scope=scope,
507
+ change_type=change_type,
508
+ )
509
+ self.arguments = arguments
510
+
511
+
495
512
  class NodeObject(ChangeSetNode):
496
513
  bindings: Final[dict[str, ChangeSetEntity]]
497
514
 
@@ -709,6 +726,18 @@ class ChangeSetModel:
709
726
  self._visited_scopes[scope] = node_intrinsic_function
710
727
  return node_intrinsic_function
711
728
 
729
+ def _visit_foreach(
730
+ self, scope: Scope, before_arguments: Maybe[list], after_arguments: Maybe[list]
731
+ ) -> NodeForEach:
732
+ node_foreach = self._visited_scopes.get(scope)
733
+ if isinstance(node_foreach, NodeForEach):
734
+ return node_foreach
735
+ arguments_scope = scope.open_scope("args")
736
+ arguments = self._visit_array(
737
+ arguments_scope, before_array=before_arguments, after_array=after_arguments
738
+ )
739
+ return NodeForEach(scope=scope, change_type=arguments.change_type, arguments=arguments)
740
+
712
741
  def _resolve_intrinsic_function_fn_sub(self, arguments: ChangeSetEntity) -> ChangeType:
713
742
  # TODO: This routine should instead export the implicit Ref and GetAtt calls within the first
714
743
  # string template parameter and compute the respective change set types. Currently,
@@ -1165,6 +1194,7 @@ class ChangeSetModel:
1165
1194
  resources: list[NodeResource] = []
1166
1195
  resource_names = self._safe_keys_of(before_resources, after_resources)
1167
1196
  fn_transform = Nothing
1197
+ fn_foreaches = []
1168
1198
  for resource_name in resource_names:
1169
1199
  resource_scope, (before_resource, after_resource) = self._safe_access_in(
1170
1200
  scope, resource_name, before_resources, after_resources
@@ -1177,6 +1207,14 @@ class ChangeSetModel:
1177
1207
  after_arguments=after_resource,
1178
1208
  )
1179
1209
  continue
1210
+ elif resource_name.startswith("Fn::ForEach"):
1211
+ fn_for_each = self._visit_foreach(
1212
+ scope=resource_scope,
1213
+ before_arguments=before_resource,
1214
+ after_arguments=after_resource,
1215
+ )
1216
+ fn_foreaches.append(fn_for_each)
1217
+ continue
1180
1218
  resource = self._visit_resource(
1181
1219
  scope=resource_scope,
1182
1220
  resource_name=resource_name,
@@ -1184,7 +1222,12 @@ class ChangeSetModel:
1184
1222
  after_resource=after_resource,
1185
1223
  )
1186
1224
  resources.append(resource)
1187
- return NodeResources(scope=scope, resources=resources, fn_transform=fn_transform)
1225
+ return NodeResources(
1226
+ scope=scope,
1227
+ resources=resources,
1228
+ fn_transform=fn_transform,
1229
+ fn_foreaches=fn_foreaches,
1230
+ )
1188
1231
 
1189
1232
  def _visit_mapping(
1190
1233
  self, scope: Scope, name: str, before_mapping: Maybe[dict], after_mapping: Maybe[dict]
@@ -53,6 +53,7 @@ EventOperationFromAction = {"Add": "CREATE", "Modify": "UPDATE", "Remove": "DELE
53
53
  class ChangeSetModelExecutorResult:
54
54
  resources: dict[str, ResolvedResource]
55
55
  outputs: list[Output]
56
+ failure_message: str | None = None
56
57
 
57
58
 
58
59
  class DeferredAction(Protocol):
@@ -65,6 +66,16 @@ class Deferred:
65
66
  action: DeferredAction
66
67
 
67
68
 
69
+ class TriggerRollback(Exception):
70
+ """
71
+ Sentinel exception to signal that the deployment should be stopped for a reason
72
+ """
73
+
74
+ def __init__(self, logical_resource_id: str, reason: str | None):
75
+ self.logical_resource_id = logical_resource_id
76
+ self.reason = reason
77
+
78
+
68
79
  class ChangeSetModelExecutor(ChangeSetModelPreproc):
69
80
  # TODO: add typing for resolved resources and parameters.
70
81
  resources: Final[dict[str, ResolvedResource]]
@@ -83,10 +94,23 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
83
94
 
84
95
  def execute(self) -> ChangeSetModelExecutorResult:
85
96
  # constructive process
86
- self.process()
97
+ failure_message = None
98
+ try:
99
+ self.process()
100
+ except TriggerRollback as e:
101
+ failure_message = e.reason
102
+ except Exception as e:
103
+ failure_message = str(e)
87
104
 
88
105
  if self._deferred_actions:
89
- self._change_set.stack.set_stack_status(StackStatus.UPDATE_COMPLETE_CLEANUP_IN_PROGRESS)
106
+ if failure_message:
107
+ # TODO: differentiate between update and create
108
+ self._change_set.stack.set_stack_status(StackStatus.ROLLBACK_IN_PROGRESS)
109
+ else:
110
+ # TODO: correct status
111
+ self._change_set.stack.set_stack_status(
112
+ StackStatus.UPDATE_COMPLETE_CLEANUP_IN_PROGRESS
113
+ )
90
114
 
91
115
  # perform all deferred actions such as deletions. These must happen in reverse from their
92
116
  # defined order so that resource dependencies are honoured
@@ -95,9 +119,12 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
95
119
  LOG.debug("executing deferred action: '%s'", deferred.name)
96
120
  deferred.action()
97
121
 
122
+ if failure_message:
123
+ # TODO: differentiate between update and create
124
+ self._change_set.stack.set_stack_status(StackStatus.ROLLBACK_COMPLETE)
125
+
98
126
  return ChangeSetModelExecutorResult(
99
- resources=self.resources,
100
- outputs=self.outputs,
127
+ resources=self.resources, outputs=self.outputs, failure_message=failure_message
101
128
  )
102
129
 
103
130
  def _defer_action(self, name: str, action: DeferredAction):
@@ -137,9 +164,10 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
137
164
  else:
138
165
  status = f"{status_from_action}_{event_status.name}"
139
166
 
167
+ physical_resource_id = self._get_physical_id(logical_resource_id, False)
140
168
  self._change_set.stack.set_resource_status(
141
169
  logical_resource_id=logical_resource_id,
142
- physical_resource_id=self._get_physical_id(logical_resource_id, False) or "",
170
+ physical_resource_id=physical_resource_id,
143
171
  resource_type=resource_type,
144
172
  status=ResourceStatus(status),
145
173
  resource_status_reason=reason,
@@ -219,10 +247,24 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
219
247
  # Update the latest version of this resource for downstream references.
220
248
  if not is_nothing(after):
221
249
  after_logical_id = after.logical_id
222
- after_physical_id: str = self._after_resource_physical_id(
223
- resource_logical_id=after_logical_id
224
- )
225
- after.physical_resource_id = after_physical_id
250
+ resource = self.resources[after_logical_id]
251
+ resource_failed_to_deploy = resource["ResourceStatus"] in {
252
+ ResourceStatus.CREATE_FAILED,
253
+ ResourceStatus.UPDATE_FAILED,
254
+ }
255
+ if not resource_failed_to_deploy:
256
+ after_physical_id: str = self._after_resource_physical_id(
257
+ resource_logical_id=after_logical_id
258
+ )
259
+ after.physical_resource_id = after_physical_id
260
+ after.status = resource["ResourceStatus"]
261
+
262
+ # terminate the deployment process
263
+ if resource_failed_to_deploy:
264
+ raise TriggerRollback(
265
+ logical_resource_id=after_logical_id,
266
+ reason=resource.get("ResourceStatusReason"),
267
+ )
226
268
  return delta
227
269
 
228
270
  def visit_node_output(
@@ -291,6 +333,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
291
333
  resource_type=before.resource_type,
292
334
  before_properties=before_properties,
293
335
  after_properties=None,
336
+ part_of_replacement=True,
294
337
  )
295
338
  self._process_event(
296
339
  action=ChangeAction.Remove,
@@ -425,6 +468,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
425
468
  resource_type: str,
426
469
  before_properties: PreprocProperties | None,
427
470
  after_properties: PreprocProperties | None,
471
+ part_of_replacement: bool = False,
428
472
  ) -> ProgressEvent:
429
473
  LOG.debug("Executing resource action: %s for resource '%s'", action, logical_resource_id)
430
474
  payload = self.create_resource_provider_payload(
@@ -481,6 +525,19 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
481
525
  message=f"Resource type {resource_type} not supported",
482
526
  )
483
527
 
528
+ if part_of_replacement and action == ChangeAction.Remove:
529
+ # Early return as we don't want to update internal state of the executor if this is a
530
+ # cleanup of an old resource. The new resource has already been created and the state
531
+ # updated
532
+ return event
533
+
534
+ status_from_action = EventOperationFromAction[action.value]
535
+ resolved_resource = ResolvedResource(
536
+ Properties=event.resource_model,
537
+ LogicalResourceId=logical_resource_id,
538
+ Type=resource_type,
539
+ LastUpdatedTimestamp=datetime.now(UTC),
540
+ )
484
541
  match event.status:
485
542
  case OperationStatus.SUCCESS:
486
543
  # merge the resources state with the external state
@@ -495,33 +552,30 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
495
552
 
496
553
  # Don't update the resolved resources if we have deleted that resource
497
554
  if action != ChangeAction.Remove:
498
- status_from_action = EventOperationFromAction[action.value]
499
555
  physical_resource_id = (
500
556
  extra_resource_properties["PhysicalResourceId"]
501
557
  if resource_provider
502
558
  else MOCKED_REFERENCE
503
559
  )
504
- resolved_resource = ResolvedResource(
505
- Properties=event.resource_model,
506
- LogicalResourceId=logical_resource_id,
507
- Type=resource_type,
508
- LastUpdatedTimestamp=datetime.now(UTC),
509
- ResourceStatus=ResourceStatus(f"{status_from_action}_COMPLETE"),
510
- PhysicalResourceId=physical_resource_id,
560
+ resolved_resource["PhysicalResourceId"] = physical_resource_id
561
+ resolved_resource["ResourceStatus"] = ResourceStatus(
562
+ f"{status_from_action}_COMPLETE"
511
563
  )
512
564
  # TODO: do we actually need this line?
513
565
  resolved_resource.update(extra_resource_properties)
514
566
 
515
- self.resources[logical_resource_id] = resolved_resource
516
-
517
567
  case OperationStatus.FAILED:
518
568
  reason = event.message
519
569
  LOG.warning(
520
570
  "Resource provider operation failed: '%s'",
521
571
  reason,
522
572
  )
573
+ resolved_resource["ResourceStatus"] = ResourceStatus(f"{status_from_action}_FAILED")
574
+ resolved_resource["ResourceStatusReason"] = reason
523
575
  case other:
524
576
  raise NotImplementedError(f"Event status '{other}' not handled")
577
+
578
+ self.resources[logical_resource_id] = resolved_resource
525
579
  return event
526
580
 
527
581
  def create_resource_provider_payload(
@@ -9,6 +9,7 @@ from typing import Any, Final, Generic, TypeVar
9
9
  from botocore.exceptions import ClientError
10
10
 
11
11
  from localstack import config
12
+ from localstack.aws.api.cloudformation import ResourceStatus
12
13
  from localstack.aws.api.ec2 import AvailabilityZoneList, DescribeAvailabilityZonesResult
13
14
  from localstack.aws.connect import connect_to
14
15
  from localstack.services.cloudformation.engine.v2.change_set_model import (
@@ -52,6 +53,7 @@ from localstack.services.cloudformation.stores import (
52
53
  exports_map,
53
54
  )
54
55
  from localstack.services.cloudformation.v2.entities import ChangeSet
56
+ from localstack.services.cloudformation.v2.types import ResolvedResource
55
57
  from localstack.utils.aws.arns import get_partition
56
58
  from localstack.utils.objects import get_value_from_path
57
59
  from localstack.utils.run import to_str
@@ -113,6 +115,7 @@ class PreprocResource:
113
115
  properties: PreprocProperties
114
116
  depends_on: list[str] | None
115
117
  requires_replacement: bool
118
+ status: ResourceStatus | None
116
119
 
117
120
  def __init__(
118
121
  self,
@@ -123,6 +126,7 @@ class PreprocResource:
123
126
  properties: PreprocProperties,
124
127
  depends_on: list[str] | None,
125
128
  requires_replacement: bool,
129
+ status: ResourceStatus | None = None,
126
130
  ):
127
131
  self.logical_id = logical_id
128
132
  self.physical_resource_id = physical_resource_id
@@ -131,6 +135,7 @@ class PreprocResource:
131
135
  self.properties = properties
132
136
  self.depends_on = depends_on
133
137
  self.requires_replacement = requires_replacement
138
+ self.status = status
134
139
 
135
140
  @staticmethod
136
141
  def _compare_conditions(c1: bool, c2: bool):
@@ -486,9 +491,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
486
491
  delta: PreprocEntityDelta = self.visit(change_set_entity=change_set_entity)
487
492
  delta_before = delta.before
488
493
  delta_after = delta.after
489
- if not is_nothing(before) and not is_nothing(delta_before) and delta_before is not None:
494
+ if not is_nothing(before) and not is_nothing(delta_before):
490
495
  before[name] = delta_before
491
- if not is_nothing(after) and not is_nothing(delta_after) and delta_after is not None:
496
+ if not is_nothing(after) and not is_nothing(delta_after):
492
497
  after[name] = delta_after
493
498
  return PreprocEntityDelta(before=before, after=after)
494
499
 
@@ -946,11 +951,17 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
946
951
  return delta
947
952
 
948
953
  def _resource_physical_resource_id_from(
949
- self, logical_resource_id: str, resolved_resources: dict
950
- ) -> str:
954
+ self, logical_resource_id: str, resolved_resources: dict[str, ResolvedResource]
955
+ ) -> str | None:
951
956
  # TODO: typing around resolved resources is needed and should be reflected here.
952
957
  resolved_resource = resolved_resources.get(logical_resource_id, {})
953
- physical_resource_id: str | None = resolved_resource.get("PhysicalResourceId")
958
+ if resolved_resource.get("ResourceStatus") not in {
959
+ ResourceStatus.CREATE_COMPLETE,
960
+ ResourceStatus.UPDATE_COMPLETE,
961
+ }:
962
+ return None
963
+
964
+ physical_resource_id = resolved_resource.get("PhysicalResourceId")
954
965
  if not isinstance(physical_resource_id, str):
955
966
  raise RuntimeError(f"No PhysicalResourceId found for resource '{logical_resource_id}'")
956
967
  return physical_resource_id
@@ -23,6 +23,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
23
23
  ChangeType,
24
24
  FnTransform,
25
25
  Maybe,
26
+ NodeForEach,
26
27
  NodeGlobalTransform,
27
28
  NodeIntrinsicFunction,
28
29
  NodeIntrinsicFunctionFnTransform,
@@ -356,6 +357,9 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
356
357
 
357
358
  return result_template
358
359
 
360
+ def visit_node_for_each(self, node_foreach: NodeForEach) -> PreprocEntityDelta:
361
+ return PreprocEntityDelta()
362
+
359
363
  def visit_node_intrinsic_function_fn_transform(
360
364
  self, node_intrinsic_function: NodeIntrinsicFunctionFnTransform
361
365
  ) -> PreprocEntityDelta:
@@ -411,7 +415,12 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
411
415
  node_intrinsic_function=node_resource.fn_transform
412
416
  )
413
417
 
414
- return super().visit_node_resource(node_resource)
418
+ try:
419
+ if delta := super().visit_node_resource(node_resource):
420
+ return delta
421
+ return super().visit_node_properties(node_resource.properties)
422
+ except RuntimeError:
423
+ return super().visit_node_properties(node_resource.properties)
415
424
 
416
425
  def visit_node_resources(self, node_resources: NodeResources) -> PreprocEntityDelta:
417
426
  if not is_nothing(node_resources.fn_transform):
@@ -4,6 +4,7 @@ from typing import Any
4
4
  from localstack.services.cloudformation.engine.v2.change_set_model import (
5
5
  Maybe,
6
6
  NodeIntrinsicFunction,
7
+ NodeResource,
7
8
  NodeTemplate,
8
9
  Nothing,
9
10
  is_nothing,
@@ -165,3 +166,11 @@ class ChangeSetModelValidator(ChangeSetModelPreproc):
165
166
  return super().visit_node_intrinsic_function_fn_select(node_intrinsic_function)
166
167
  except RuntimeError:
167
168
  return self.visit(node_intrinsic_function.arguments)
169
+
170
+ def visit_node_resource(self, node_resource: NodeResource) -> PreprocEntityDelta:
171
+ try:
172
+ if delta := super().visit_node_resource(node_resource):
173
+ return delta
174
+ return super().visit_node_properties(node_resource.properties)
175
+ except RuntimeError:
176
+ return super().visit_node_properties(node_resource.properties)
@@ -9,6 +9,7 @@ from localstack.aws.api.cloudformation import (
9
9
  CreateStackInput,
10
10
  CreateStackSetInput,
11
11
  ExecutionStatus,
12
+ Output,
12
13
  ResourceStatus,
13
14
  StackEvent,
14
15
  StackInstanceComprehensiveStatus,
@@ -51,9 +52,9 @@ class Stack:
51
52
  template_body: str | None
52
53
 
53
54
  # state after deploy
54
- resolved_parameters: dict[str, str]
55
+ resolved_parameters: dict[str, EngineParameter]
55
56
  resolved_resources: dict[str, ResolvedResource]
56
- resolved_outputs: dict[str, str]
57
+ resolved_outputs: list[Output]
57
58
  resource_states: dict[str, StackResource]
58
59
  resolved_exports: dict[str, str]
59
60
 
@@ -94,7 +95,7 @@ class Stack:
94
95
  # state after deploy
95
96
  self.resolved_parameters = {}
96
97
  self.resolved_resources = {}
97
- self.resolved_outputs = {}
98
+ self.resolved_outputs = []
98
99
  self.resource_states = {}
99
100
  self.events = []
100
101
  self.resolved_exports = {}
@@ -52,6 +52,7 @@ from localstack.aws.api.cloudformation import (
52
52
  NextToken,
53
53
  Parameter,
54
54
  PhysicalResourceId,
55
+ ResourceStatus,
55
56
  RetainExceptOnCreate,
56
57
  RetainResources,
57
58
  RoleARN,
@@ -349,6 +350,7 @@ class CloudformationProviderV2(CloudformationProvider):
349
350
  # the transformations.
350
351
  update_model.before_runtime_cache.update(raw_update_model.before_runtime_cache)
351
352
  update_model.after_runtime_cache.update(raw_update_model.after_runtime_cache)
353
+ change_set.set_update_model(update_model)
352
354
 
353
355
  # perform validations
354
356
  validator = ChangeSetModelValidator(
@@ -361,7 +363,6 @@ class CloudformationProviderV2(CloudformationProvider):
361
363
  if transform.global_transforms:
362
364
  # global transforms should always be considered "MODIFIED"
363
365
  update_model.node_template.change_type = ChangeType.MODIFIED
364
- change_set.set_update_model(update_model)
365
366
  change_set.processed_template = transformed_after_template
366
367
 
367
368
  @handler("CreateChangeSet", expand=False)
@@ -557,15 +558,15 @@ class CloudformationProviderV2(CloudformationProvider):
557
558
  )
558
559
 
559
560
  def _run(*args):
560
- try:
561
- result = change_set_executor.execute()
561
+ result = change_set_executor.execute()
562
+ change_set.stack.resolved_parameters = change_set.resolved_parameters
563
+ change_set.stack.resolved_resources = result.resources
564
+ if not result.failure_message:
562
565
  new_stack_status = StackStatus.UPDATE_COMPLETE
563
566
  if change_set.change_set_type == ChangeSetType.CREATE:
564
567
  new_stack_status = StackStatus.CREATE_COMPLETE
565
568
  change_set.stack.set_stack_status(new_stack_status)
566
569
  change_set.set_execution_status(ExecutionStatus.EXECUTE_COMPLETE)
567
- change_set.stack.resolved_resources = result.resources
568
- change_set.stack.resolved_parameters = change_set.resolved_parameters
569
570
  change_set.stack.resolved_outputs = result.outputs
570
571
 
571
572
  change_set.stack.resolved_exports = {}
@@ -582,20 +583,15 @@ class CloudformationProviderV2(CloudformationProvider):
582
583
  change_set.stack.description = change_set.template.get("Description")
583
584
  change_set.stack.processed_template = change_set.processed_template
584
585
  change_set.stack.template_body = change_set.template_body
585
- except Exception as e:
586
+ else:
586
587
  LOG.error(
587
588
  "Execute change set failed: %s",
588
- e,
589
+ result.failure_message,
589
590
  exc_info=LOG.isEnabledFor(logging.DEBUG) and config.CFN_VERBOSE_ERRORS,
590
591
  )
591
- new_stack_status = StackStatus.UPDATE_FAILED
592
- if change_set.change_set_type == ChangeSetType.CREATE:
593
- new_stack_status = StackStatus.CREATE_FAILED
594
-
595
- change_set.stack.set_stack_status(new_stack_status)
592
+ # stack status is taken care of in the executor
596
593
  change_set.set_execution_status(ExecutionStatus.EXECUTE_FAILED)
597
- change_set.stack.change_set_id = change_set.change_set_id
598
- change_set.stack.change_set_ids.append(change_set.change_set_id)
594
+ change_set.stack.deletion_time = datetime.now(tz=UTC)
599
595
 
600
596
  start_worker_thread(_run)
601
597
 
@@ -787,6 +783,8 @@ class CloudformationProviderV2(CloudformationProvider):
787
783
  if change_set.status == ChangeSetStatus.FAILED:
788
784
  return CreateStackOutput(StackId=stack.stack_id)
789
785
 
786
+ stack.processed_template = change_set.processed_template
787
+
790
788
  # deployment process
791
789
  stack.set_stack_status(StackStatus.CREATE_IN_PROGRESS)
792
790
  change_set_executor = ChangeSetModelExecutor(change_set)
@@ -794,9 +792,16 @@ class CloudformationProviderV2(CloudformationProvider):
794
792
  def _run(*args):
795
793
  try:
796
794
  result = change_set_executor.execute()
797
- stack.set_stack_status(StackStatus.CREATE_COMPLETE)
798
795
  stack.resolved_resources = result.resources
799
796
  stack.resolved_outputs = result.outputs
797
+ if all(
798
+ resource["ResourceStatus"] == ResourceStatus.CREATE_COMPLETE
799
+ for resource in stack.resolved_resources.values()
800
+ ):
801
+ stack.set_stack_status(StackStatus.CREATE_COMPLETE)
802
+ else:
803
+ stack.set_stack_status(StackStatus.CREATE_FAILED)
804
+
800
805
  # if the deployment succeeded, update the stack's template representation to that
801
806
  # which was just deployed
802
807
  stack.template = change_set.template
@@ -807,7 +812,6 @@ class CloudformationProviderV2(CloudformationProvider):
807
812
  for output in result.outputs:
808
813
  if export_name := output.get("ExportName"):
809
814
  stack.resolved_exports[export_name] = output["OutputValue"]
810
- stack.processed_template = change_set.processed_template
811
815
  except Exception as e:
812
816
  LOG.error(
813
817
  "Create Stack set failed: %s",
@@ -857,7 +861,6 @@ class CloudformationProviderV2(CloudformationProvider):
857
861
  stack_description = ApiStack(
858
862
  Description=stack.description,
859
863
  CreationTime=stack.creation_time,
860
- DeletionTime=stack.deletion_time,
861
864
  StackId=stack.stack_id,
862
865
  StackName=stack.stack_name,
863
866
  StackStatus=stack.status,
@@ -873,6 +876,8 @@ class CloudformationProviderV2(CloudformationProvider):
873
876
  if stack.status != StackStatus.REVIEW_IN_PROGRESS:
874
877
  # TODO: actually track updated time
875
878
  stack_description["LastUpdatedTime"] = stack.creation_time
879
+ if stack.deletion_time:
880
+ stack_description["DeletionTime"] = stack.deletion_time
876
881
  if stack.capabilities:
877
882
  stack_description["Capabilities"] = stack.capabilities
878
883
  # TODO: confirm the logic for this
@@ -1489,6 +1494,8 @@ class CloudformationProviderV2(CloudformationProvider):
1489
1494
  stack.deletion_time = datetime.now(tz=UTC)
1490
1495
  return
1491
1496
 
1497
+ stack.set_stack_status(StackStatus.DELETE_IN_PROGRESS)
1498
+
1492
1499
  previous_update_model = None
1493
1500
  if stack.change_set_id:
1494
1501
  if previous_change_set := find_change_set_v2(state, stack.change_set_id):
@@ -1511,7 +1518,6 @@ class CloudformationProviderV2(CloudformationProvider):
1511
1518
 
1512
1519
  def _run(*args):
1513
1520
  try:
1514
- stack.set_stack_status(StackStatus.DELETE_IN_PROGRESS)
1515
1521
  change_set_executor.execute()
1516
1522
  stack.set_stack_status(StackStatus.DELETE_COMPLETE)
1517
1523
  stack.deletion_time = datetime.now(tz=UTC)
@@ -28,6 +28,7 @@ class ResolvedResource(TypedDict):
28
28
  LogicalResourceId: str
29
29
  Type: str
30
30
  Properties: dict
31
- ResourceStatus: ResourceStatus
32
- PhysicalResourceId: str | None
33
- LastUpdatedTimestamp: datetime | None
31
+ LastUpdatedTimestamp: datetime
32
+ ResourceStatus: NotRequired[ResourceStatus]
33
+ PhysicalResourceId: NotRequired[str]
34
+ ResourceStatusReason: NotRequired[str]
@@ -9,6 +9,7 @@ from localstack.constants import DEFAULT_VOLUME_DIR, DOCKER_IMAGE_NAME
9
9
  from localstack.utils.collections import ensure_list
10
10
  from localstack.utils.container_utils.container_client import (
11
11
  ContainerClient,
12
+ DockerNotAvailable,
12
13
  PortMappings,
13
14
  VolumeInfo,
14
15
  )
@@ -153,10 +154,14 @@ def container_ports_can_be_bound(
153
154
  ports=port_mappings,
154
155
  remove=True,
155
156
  )
157
+ except DockerNotAvailable as e:
158
+ LOG.warning("Cannot perform port check because Docker is not available.")
159
+ raise e
156
160
  except Exception as e:
157
161
  if "port is already allocated" not in str(e) and "address already in use" not in str(e):
158
162
  LOG.warning(
159
- "Unexpected error when attempting to determine container port status", exc_info=e
163
+ "Unexpected error when attempting to determine container port status",
164
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
160
165
  )
161
166
  return False
162
167
  # TODO(srw): sometimes the command output from the docker container is "None", particularly when this function is
localstack/version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '4.7.1.dev79'
32
- __version_tuple__ = version_tuple = (4, 7, 1, 'dev79')
31
+ __version__ = version = '4.7.1.dev82'
32
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev82')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.7.1.dev79
3
+ Version: 4.7.1.dev82
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=78Sf99fgH3ckJ20a9SMqsu01r1cm5GgcomkuY4yDMDo,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=XR5ERj31WxRZO0edpd5vZVaIlOiYKEKargmPkzLYl6E,719
7
+ localstack/version.py,sha256=B8fghWNrftW5YuX3tftIppc__e3D27BeF1P_Etbf1UI,719
8
8
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
10
10
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -311,12 +311,12 @@ localstack/services/cloudformation/engine/types.py,sha256=JQF2aM5DUtnJhvQ30RTaKv
311
311
  localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
312
312
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
313
313
  localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
314
- localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=SvYRG45MwSMluMrv7bAijXH2-g5ZMkHLVBf8cavvMUw,65799
314
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=wjU1keXKFvIc-23xEXIioe7ejKFHcuIV5QyzKac7JMA,67286
315
315
  localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=caQJ9reGmJ2EsJ2-bDVC30hLQQilXyBAsI7bJd2TYgI,11299
316
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=LMHqYuNlE0BFt1qYHFEPscyZDhyoqOe7USniqbQ-drk,27102
317
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=IrzhFicS0KBqBnWj2E76wVHqJTeXL-sDznCHoE1EYZ0,52978
318
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=bico-1XilsMuH62QnkVyIOyz9jqDsjFQbkOdHg1KwXg,22400
319
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=Zj7r42OxwtF_uct56aFgVCUgieWbiiHua-MhXhrGiqA,7558
316
+ localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=OTadK7kOtGdcqvlZNjZUz5LyQeOKmvDiWorUE9hoCCU,29328
317
+ localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=U7reKuxX6Qzd57xrdUyXPa5QXrL0HqawyM1JM4GofNo,53366
318
+ localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=M8td7akrqBI-8nLHfvS3g6bA3hppiDEICBiX_Yg2il8,22769
319
+ localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=ZRQ_AaIPX_sE40Ggx-JmJW0V1mIe09cKEVDsZTr30J8,7952
320
320
  localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=ygUVPgM3b8SAXLLhLeGSD2k_Oo81ukFkug6bcmvRSJg,7843
321
321
  localstack/services/cloudformation/engine/v2/resolving.py,sha256=ot76GycQsw6Y9SvxB8sAlK7tRntJb5CTrKYqyEnfiHc,4002
322
322
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
@@ -336,9 +336,9 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
336
336
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=W4qA6eMNejKWLEhYL340DZEE2D9Bdkcl0Jmp0C7VnWc,30964
337
337
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=id7l43zsJsTgUyQ8F3jpfbpEoicc8GC6cB2ESEktDxc,7936
338
338
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
- localstack/services/cloudformation/v2/entities.py,sha256=SqSmdcw3toeRdxuIHyel5DCKlhRIeNHCRASBTpMGnbc,9001
340
- localstack/services/cloudformation/v2/provider.py,sha256=xEXBGEVONXlEMBZkIqnWnyqWQ1Sw5lCxJDZheHs6S74,63743
341
- localstack/services/cloudformation/v2/types.py,sha256=5Fg9550Sd1i2phJAFdo_XBvWXlYbND78csmNVNgIKvg,902
339
+ localstack/services/cloudformation/v2/entities.py,sha256=JLL9oX15cxzY_U23sa0zySyzx20rEXpIUl9CuQMnCGw,9023
340
+ localstack/services/cloudformation/v2/provider.py,sha256=WLhidQkP8awrDItcXtu3aw1Opeq8SCsrkSFjmP_FnR4,63825
341
+ localstack/services/cloudformation/v2/types.py,sha256=x_oDGQwxkViQ1fpcaSbBWiCODHZJAQgCej45EN-YZDs,957
342
342
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
343
343
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
344
344
  localstack/services/cloudwatch/alarm_scheduler.py,sha256=HPzQgZvDVXIXaEkjJ39L-jBwlOi_-ZlAyJ3D_suWngk,15761
@@ -1185,6 +1185,7 @@ localstack/testing/pytest/util.py,sha256=TQAAb_Cj5gTSX0VkenAbSabvyCkl7THxEj70PrT
1185
1185
  localstack/testing/pytest/validation_tracking.py,sha256=x19q7qCJWBOZRP5fuHTrljSce5DooZVznK93x-ULAHE,5619
1186
1186
  localstack/testing/pytest/cloudformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1187
1187
  localstack/testing/pytest/cloudformation/fixtures.py,sha256=cXGN83wB-yP2mASQSYe8P7cebwdj9S8cONC3nIDBqOw,10534
1188
+ localstack/testing/pytest/cloudformation/transformers.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1188
1189
  localstack/testing/pytest/stepfunctions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1189
1190
  localstack/testing/pytest/stepfunctions/fixtures.py,sha256=sF3kLQ6EQP2r-ecZO2O2THoTt9BVQyyVidj-8sw7J7Q,32801
1190
1191
  localstack/testing/pytest/stepfunctions/utils.py,sha256=jVyEilUC7sGONAR339ZWKaikteBxjbRKPDFNlPZ_8fg,32792
@@ -1218,7 +1219,7 @@ localstack/utils/container_networking.py,sha256=AUfBhDddnNiAWwmeN6d-k0YeoQAMv9lh
1218
1219
  localstack/utils/coverage_docs.py,sha256=Suz07XICh3VIJN1gYLRpIwwdYv-wuK22_mK75VJ0cCA,908
1219
1220
  localstack/utils/crypto.py,sha256=pQCdhjZNuoMtJYpB_DNPnwqfBsMavBtZ9V8CkcnJRwE,7266
1220
1221
  localstack/utils/diagnose.py,sha256=46nu0KAS3VSBTKqdPtQmzPA3zbEGkJgovwfEgoflzFA,4723
1221
- localstack/utils/docker_utils.py,sha256=gN1SLrQ76nZel6upyxx_sEcI97v_18XJLI8k36WJB2M,9629
1222
+ localstack/utils/docker_utils.py,sha256=2_In4V8C8qZHX6DvGBpen5aIJy62yw3-YPNOqrjyiDQ,9834
1222
1223
  localstack/utils/event_matcher.py,sha256=_DtCZI0ba4Zcit_-TwCUSIG_NXiYgIjmWbuKuMrsZkk,2024
1223
1224
  localstack/utils/files.py,sha256=5fdQLiLzh2ovwDfjr-K80IaPojzghPHhu4E4jxlsb0Q,9545
1224
1225
  localstack/utils/functions.py,sha256=02gBo3o4cii3W5jztgbn7DN9OjipG3DydjU1DVffJlU,2968
@@ -1287,13 +1288,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1287
1288
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1288
1289
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1289
1290
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1290
- localstack_core-4.7.1.dev79.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1291
- localstack_core-4.7.1.dev79.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1292
- localstack_core-4.7.1.dev79.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1293
- localstack_core-4.7.1.dev79.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1294
- localstack_core-4.7.1.dev79.dist-info/METADATA,sha256=pD1_K4ENbw6rcHLKNC5axOI6IE1WDT3C25sc8S9rOz8,5569
1295
- localstack_core-4.7.1.dev79.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1296
- localstack_core-4.7.1.dev79.dist-info/entry_points.txt,sha256=QVR0SdbvA7isjrtgvO1C8_mZAnD7DIRNsjCtZ-ddbIs,20771
1297
- localstack_core-4.7.1.dev79.dist-info/plux.json,sha256=lUVeKfay1SEwn2mdktk6IibI49vzJvnA6FPuPKYi58s,20995
1298
- localstack_core-4.7.1.dev79.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1299
- localstack_core-4.7.1.dev79.dist-info/RECORD,,
1291
+ localstack_core-4.7.1.dev82.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1292
+ localstack_core-4.7.1.dev82.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1293
+ localstack_core-4.7.1.dev82.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1294
+ localstack_core-4.7.1.dev82.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1295
+ localstack_core-4.7.1.dev82.dist-info/METADATA,sha256=d6-4t712l0a-5RgJM2sjT3LGPWu0T0ycRpjHDIgmtU4,5569
1296
+ localstack_core-4.7.1.dev82.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1297
+ localstack_core-4.7.1.dev82.dist-info/entry_points.txt,sha256=QVR0SdbvA7isjrtgvO1C8_mZAnD7DIRNsjCtZ-ddbIs,20771
1298
+ localstack_core-4.7.1.dev82.dist-info/plux.json,sha256=5nTYe3w6sN-XcocFbUrqCYoZ96uJlphQq1NVkbP7iag,20995
1299
+ localstack_core-4.7.1.dev82.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1300
+ localstack_core-4.7.1.dev82.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["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::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "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::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "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::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "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::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "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::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "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::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "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::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "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::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin"], "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.packages": ["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", "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", "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"], "localstack.hooks.on_infra_start": ["_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", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "eager_load_services=localstack.services.plugins:eager_load_services", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "apply_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", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start"], "localstack.hooks.on_infra_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", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "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.hooks.on_infra_ready": ["publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment", "_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "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.hooks.on_infra_ready": ["publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment", "_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.cloudformation.resource_providers": ["AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "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", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "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::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin"], "localstack.hooks.on_infra_start": ["register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_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", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "eager_load_services=localstack.services.plugins:eager_load_services"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_shutdown": ["stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_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.publisher:publish_metrics"], "localstack.packages": ["opensearch/community=localstack.services.opensearch.plugins:opensearch_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", "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", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package"], "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.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "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"]}