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

@@ -4,17 +4,18 @@ import abc
4
4
  import enum
5
5
  from collections.abc import Generator
6
6
  from itertools import zip_longest
7
- from typing import TYPE_CHECKING, Any, Final, TypedDict, cast
7
+ from typing import Any, Final, TypedDict, cast
8
8
 
9
9
  from typing_extensions import TypeVar
10
10
 
11
11
  from localstack.aws.api.cloudformation import ChangeAction
12
12
  from localstack.services.cloudformation.resource_provider import ResourceProviderExecutor
13
+ from localstack.services.cloudformation.v2.types import (
14
+ EngineParameter,
15
+ engine_parameter_value,
16
+ )
13
17
  from localstack.utils.strings import camel_to_snake_case
14
18
 
15
- if TYPE_CHECKING:
16
- from localstack.services.cloudformation.v2.entities import EngineParameter
17
-
18
19
  T = TypeVar("T")
19
20
 
20
21
 
@@ -356,6 +357,8 @@ class NodeResource(ChangeSetNode):
356
357
  condition_reference: Final[Maybe[TerminalValue]]
357
358
  depends_on: Final[Maybe[NodeDependsOn]]
358
359
  requires_replacement: Final[bool]
360
+ deletion_policy: Final[Maybe[ChangeSetTerminal]]
361
+ update_replace_policy: Final[Maybe[ChangeSetTerminal]]
359
362
 
360
363
  def __init__(
361
364
  self,
@@ -367,6 +370,8 @@ class NodeResource(ChangeSetNode):
367
370
  condition_reference: Maybe[TerminalValue],
368
371
  depends_on: Maybe[NodeDependsOn],
369
372
  requires_replacement: bool,
373
+ deletion_policy: Maybe[ChangeSetTerminal],
374
+ update_replace_policy: Maybe[ChangeSetTerminal],
370
375
  ):
371
376
  super().__init__(scope=scope, change_type=change_type)
372
377
  self.name = name
@@ -375,6 +380,8 @@ class NodeResource(ChangeSetNode):
375
380
  self.condition_reference = condition_reference
376
381
  self.depends_on = depends_on
377
382
  self.requires_replacement = requires_replacement
383
+ self.deletion_policy = deletion_policy
384
+ self.update_replace_policy = update_replace_policy
378
385
 
379
386
 
380
387
  class NodeProperties(ChangeSetNode):
@@ -481,6 +488,8 @@ ValueKey: Final[str] = "Value"
481
488
  ExportKey: Final[str] = "Export"
482
489
  OutputsKey: Final[str] = "Outputs"
483
490
  DependsOnKey: Final[str] = "DependsOn"
491
+ DeletionPolicyKey: Final[str] = "DeletionPolicy"
492
+ UpdateReplacePolicyKey: Final[str] = "UpdateReplacePolicy"
484
493
  # TODO: expand intrinsic functions set.
485
494
  RefKey: Final[str] = "Ref"
486
495
  RefConditionKey: Final[str] = "Condition"
@@ -902,6 +911,30 @@ class ChangeSetModel:
902
911
  raise RuntimeError()
903
912
  return value
904
913
 
914
+ def _visit_deletion_policy(
915
+ self, scope: Scope, before_deletion_policy: Any, after_deletion_policy: Any
916
+ ) -> TerminalValue:
917
+ value = self._visit_value(
918
+ scope=scope, before_value=before_deletion_policy, after_value=after_deletion_policy
919
+ )
920
+ if not isinstance(value, TerminalValue):
921
+ # TODO: decide where template schema validation should occur.
922
+ raise RuntimeError()
923
+ return value
924
+
925
+ def _visit_update_replace_policy(
926
+ self, scope: Scope, before_update_replace_policy: Any, after_deletion_policy: Any
927
+ ) -> TerminalValue:
928
+ value = self._visit_value(
929
+ scope=scope,
930
+ before_value=before_update_replace_policy,
931
+ after_value=after_deletion_policy,
932
+ )
933
+ if not isinstance(value, TerminalValue):
934
+ # TODO: decide where template schema validation should occur.
935
+ raise RuntimeError()
936
+ return value
937
+
905
938
  def _visit_resource(
906
939
  self,
907
940
  scope: Scope,
@@ -947,8 +980,30 @@ class ChangeSetModel:
947
980
  after_properties=after_properties,
948
981
  )
949
982
 
983
+ deletion_policy = Nothing
984
+ scope_deletion_policy, (before_deletion_policy, after_deletion_policy) = (
985
+ self._safe_access_in(scope, DeletionPolicyKey, before_resource, after_resource)
986
+ )
987
+ if before_deletion_policy or after_deletion_policy:
988
+ deletion_policy = self._visit_deletion_policy(
989
+ scope_deletion_policy, before_deletion_policy, after_deletion_policy
990
+ )
991
+
992
+ update_replace_policy = Nothing
993
+ scope_update_replace_policy, (before_update_replace_policy, after_update_replace_policy) = (
994
+ self._safe_access_in(scope, UpdateReplacePolicyKey, before_resource, after_resource)
995
+ )
996
+ if before_update_replace_policy or after_update_replace_policy:
997
+ update_replace_policy = self._visit_update_replace_policy(
998
+ scope_update_replace_policy,
999
+ before_update_replace_policy,
1000
+ after_update_replace_policy,
1001
+ )
1002
+
950
1003
  change_type = change_type_of(
951
- before_resource, after_resource, [properties, condition_reference, depends_on]
1004
+ before_resource,
1005
+ after_resource,
1006
+ [properties, condition_reference, depends_on, deletion_policy, update_replace_policy],
952
1007
  )
953
1008
  requires_replacement = self._resolve_requires_replacement(
954
1009
  node_properties=properties, resource_type=terminal_value_type
@@ -962,6 +1017,8 @@ class ChangeSetModel:
962
1017
  condition_reference=condition_reference,
963
1018
  depends_on=depends_on,
964
1019
  requires_replacement=requires_replacement,
1020
+ deletion_policy=deletion_policy,
1021
+ update_replace_policy=update_replace_policy,
965
1022
  )
966
1023
  self._visited_scopes[scope] = node_resource
967
1024
  return node_resource
@@ -1019,18 +1076,14 @@ class ChangeSetModel:
1019
1076
 
1020
1077
  before_parameter = Nothing
1021
1078
  if not is_nothing(before_parameter_dct):
1022
- before_parameter = (
1023
- before_parameter_dct.get("resolved_value")
1024
- or before_parameter_dct["given_value"]
1025
- or before_parameter_dct.get("default_value")
1079
+ before_parameter = before_parameter_dct.get("resolved_value") or engine_parameter_value(
1080
+ before_parameter_dct
1026
1081
  )
1027
1082
 
1028
1083
  after_parameter = Nothing
1029
1084
  if not is_nothing(after_parameter_dct):
1030
- after_parameter = (
1031
- after_parameter_dct.get("resolved_value")
1032
- or after_parameter_dct["given_value"]
1033
- or after_parameter_dct.get("default_value")
1085
+ after_parameter = after_parameter_dct.get("resolved_value") or engine_parameter_value(
1086
+ after_parameter_dct
1034
1087
  )
1035
1088
 
1036
1089
  parameter = self._visit_value(
@@ -8,6 +8,7 @@ from typing import Final, Protocol
8
8
  from localstack import config
9
9
  from localstack.aws.api.cloudformation import (
10
10
  ChangeAction,
11
+ Output,
11
12
  ResourceStatus,
12
13
  StackStatus,
13
14
  )
@@ -50,8 +51,7 @@ EventOperationFromAction = {"Add": "CREATE", "Modify": "UPDATE", "Remove": "DELE
50
51
  @dataclass
51
52
  class ChangeSetModelExecutorResult:
52
53
  resources: dict[str, ResolvedResource]
53
- outputs: dict
54
- exports: dict
54
+ outputs: list[Output]
55
55
 
56
56
 
57
57
  class DeferredAction(Protocol):
@@ -61,15 +61,13 @@ class DeferredAction(Protocol):
61
61
  class ChangeSetModelExecutor(ChangeSetModelPreproc):
62
62
  # TODO: add typing for resolved resources and parameters.
63
63
  resources: Final[dict[str, ResolvedResource]]
64
- outputs: Final[dict]
65
- exports: Final[dict]
64
+ outputs: Final[list[Output]]
66
65
  _deferred_actions: list[DeferredAction]
67
66
 
68
67
  def __init__(self, change_set: ChangeSet):
69
68
  super().__init__(change_set=change_set)
70
69
  self.resources = dict()
71
- self.outputs = dict()
72
- self.exports = dict()
70
+ self.outputs = []
73
71
  self._deferred_actions = list()
74
72
  self.resource_provider_executor = ResourceProviderExecutor(
75
73
  stack_name=change_set.stack.stack_name,
@@ -92,7 +90,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
92
90
  return ChangeSetModelExecutorResult(
93
91
  resources=self.resources,
94
92
  outputs=self.outputs,
95
- exports=self.exports,
96
93
  )
97
94
 
98
95
  def _defer_action(self, action: DeferredAction):
@@ -228,11 +225,15 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
228
225
  if is_nothing(after) or (isinstance(after, PreprocOutput) and after.condition is False):
229
226
  return delta
230
227
 
231
- # TODO validate export name duplication in same template and all exports
232
- if delta.after.export:
233
- self.exports[delta.after.export.get("Name")] = delta.after.value
234
-
235
- self.outputs[delta.after.name] = delta.after.value
228
+ output = Output(
229
+ OutputKey=delta.after.name,
230
+ OutputValue=delta.after.value,
231
+ # TODO
232
+ # Description=delta.after.description
233
+ )
234
+ if after.export:
235
+ output["ExportName"] = after.export["Name"]
236
+ self.outputs.append(output)
236
237
  return delta
237
238
 
238
239
  def _execute_resource_change(
@@ -9,10 +9,7 @@ from localstack.aws.api.cloudformation import (
9
9
  CreateStackInput,
10
10
  CreateStackSetInput,
11
11
  ExecutionStatus,
12
- Output,
13
12
  ResourceStatus,
14
- StackDriftInformation,
15
- StackDriftStatus,
16
13
  StackEvent,
17
14
  StackInstanceComprehensiveStatus,
18
15
  StackInstanceDetailedStatus,
@@ -25,9 +22,6 @@ from localstack.aws.api.cloudformation import (
25
22
  from localstack.aws.api.cloudformation import (
26
23
  Parameter as ApiParameter,
27
24
  )
28
- from localstack.aws.api.cloudformation import (
29
- Stack as ApiStack,
30
- )
31
25
  from localstack.services.cloudformation.engine.entities import (
32
26
  StackIdentifier,
33
27
  )
@@ -35,33 +29,14 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
35
29
  ChangeType,
36
30
  UpdateModel,
37
31
  )
32
+ from localstack.services.cloudformation.v2.types import ResolvedResource
38
33
  from localstack.utils.aws import arns
39
34
  from localstack.utils.strings import long_uid, short_uid
40
35
 
41
36
 
42
- # TODO: turn into class/dataclass
43
- class EngineParameter(TypedDict):
44
- """
45
- Parameters supplied by the user. The resolved value field is populated by the engine
46
- """
47
-
48
- type_: str
49
- given_value: NotRequired[str | None]
50
- resolved_value: NotRequired[str | None]
51
- default_value: NotRequired[str | None]
52
-
53
-
54
- class ResolvedResource(TypedDict):
55
- LogicalResourceId: str
56
- Type: str
57
- Properties: dict
58
- ResourceStatus: ResourceStatus
59
- PhysicalResourceId: str | None
60
- LastUpdatedTimestamp: datetime | None
61
-
62
-
63
37
  class Stack:
64
38
  stack_name: str
39
+ description: str | None
65
40
  parameters: list[ApiParameter]
66
41
  change_set_id: str | None
67
42
  status: StackStatus
@@ -123,6 +98,7 @@ class Stack:
123
98
  self.resource_states = {}
124
99
  self.events = []
125
100
  self.resolved_exports = {}
101
+ self.description = None
126
102
 
127
103
  def set_stack_status(self, status: StackStatus, reason: StackStatusReason | None = None):
128
104
  self.status = status
@@ -197,44 +173,6 @@ class Stack:
197
173
 
198
174
  self.events.insert(0, event)
199
175
 
200
- def describe_details(self) -> ApiStack:
201
- result = {
202
- "CreationTime": self.creation_time,
203
- "DeletionTime": self.deletion_time,
204
- "StackId": self.stack_id,
205
- "StackName": self.stack_name,
206
- "StackStatus": self.status,
207
- "StackStatusReason": self.status_reason,
208
- # fake values
209
- "DisableRollback": False,
210
- "DriftInformation": StackDriftInformation(
211
- StackDriftStatus=StackDriftStatus.NOT_CHECKED
212
- ),
213
- "EnableTerminationProtection": self.enable_termination_protection,
214
- "LastUpdatedTime": self.creation_time,
215
- "RollbackConfiguration": {},
216
- "Tags": [],
217
- "NotificationARNs": [],
218
- "Capabilities": self.capabilities,
219
- }
220
- # TODO: confirm the logic for this
221
- if change_set_id := self.change_set_id:
222
- result["ChangeSetId"] = change_set_id
223
-
224
- if self.resolved_outputs:
225
- describe_outputs = []
226
- for key, value in self.resolved_outputs.items():
227
- describe_outputs.append(
228
- Output(
229
- # TODO(parity): Description, ExportName
230
- # TODO(parity): what happens on describe stack when the stack has not been deployed yet?
231
- OutputKey=key,
232
- OutputValue=value,
233
- )
234
- )
235
- result["Outputs"] = describe_outputs
236
- return result
237
-
238
176
  def is_active(self) -> bool:
239
177
  return self.status != StackStatus.DELETE_COMPLETE
240
178
 
@@ -255,6 +193,7 @@ class ChangeSet:
255
193
  creation_time: datetime
256
194
  processed_template: dict | None
257
195
  resolved_parameters: list[ApiParameter]
196
+ description: str | None
258
197
 
259
198
  def __init__(
260
199
  self,
@@ -275,6 +214,7 @@ class ChangeSet:
275
214
 
276
215
  self.change_set_name = request_payload["ChangeSetName"]
277
216
  self.change_set_type = request_payload.get("ChangeSetType", ChangeSetType.UPDATE)
217
+ self.description = request_payload.get("Description")
278
218
  self.change_set_id = arns.cloudformation_change_set_arn(
279
219
  self.change_set_name,
280
220
  change_set_id=short_uid(),
@@ -3,7 +3,6 @@ import json
3
3
  import logging
4
4
  from collections import defaultdict
5
5
  from datetime import UTC, datetime
6
- from typing import Any
7
6
 
8
7
  from localstack import config
9
8
  from localstack.aws.api import RequestContext, handler
@@ -50,7 +49,6 @@ from localstack.aws.api.cloudformation import (
50
49
  ListStacksOutput,
51
50
  LogicalResourceId,
52
51
  NextToken,
53
- Output,
54
52
  Parameter,
55
53
  PhysicalResourceId,
56
54
  RetainExceptOnCreate,
@@ -112,11 +110,11 @@ from localstack.services.cloudformation.stores import (
112
110
  )
113
111
  from localstack.services.cloudformation.v2.entities import (
114
112
  ChangeSet,
115
- EngineParameter,
116
113
  Stack,
117
114
  StackInstance,
118
115
  StackSet,
119
116
  )
117
+ from localstack.services.cloudformation.v2.types import EngineParameter
120
118
  from localstack.utils.collections import select_attributes
121
119
  from localstack.utils.strings import short_uid
122
120
  from localstack.utils.threads import start_worker_thread
@@ -427,17 +425,7 @@ class CloudformationProviderV2(CloudformationProvider):
427
425
  # is needed for the update graph building, or only looked up in downstream tasks (metadata).
428
426
  request_parameters = request.get("Parameters", list())
429
427
  # TODO: handle parameter defaults and resolution
430
- after_parameters = {}
431
- for parameter in request_parameters:
432
- key = parameter["ParameterKey"]
433
- if parameter.get("UsePreviousValue", False):
434
- # todo: what if the parameter does not exist in the before parameters
435
- after_parameters[key] = before_parameters[key]
436
- continue
437
-
438
- if "ParameterValue" in parameter:
439
- after_parameters[key] = parameter["ParameterValue"]
440
- continue
428
+ after_parameters = self._extract_after_parameters(request_parameters, before_parameters)
441
429
 
442
430
  # TODO: update this logic to always pass the clean template object if one exists. The
443
431
  # current issue with relaying on stack.template_original is that this appears to have
@@ -480,7 +468,6 @@ class CloudformationProviderV2(CloudformationProvider):
480
468
 
481
469
  change_set.set_change_set_status(ChangeSetStatus.CREATE_COMPLETE)
482
470
 
483
- stack.change_set_id = change_set.change_set_id
484
471
  stack.change_set_ids.append(change_set.change_set_id)
485
472
  state.change_sets[change_set.change_set_id] = change_set
486
473
 
@@ -539,11 +526,19 @@ class CloudformationProviderV2(CloudformationProvider):
539
526
  change_set.stack.resolved_resources = result.resources
540
527
  change_set.stack.resolved_parameters = change_set.resolved_parameters
541
528
  change_set.stack.resolved_outputs = result.outputs
542
- change_set.stack.resolved_exports = result.exports
529
+
530
+ change_set.stack.resolved_exports = {}
531
+ for output in result.outputs:
532
+ if export_name := output.get("ExportName"):
533
+ change_set.stack.resolved_exports[export_name] = output["OutputValue"]
534
+
535
+ change_set.stack.change_set_id = change_set.change_set_id
536
+ change_set.stack.change_set_ids.append(change_set.change_set_id)
543
537
 
544
538
  # if the deployment succeeded, update the stack's template representation to that
545
539
  # which was just deployed
546
540
  change_set.stack.template = change_set.template
541
+ change_set.stack.description = change_set.template.get("Description")
547
542
  change_set.stack.processed_template = change_set.processed_template
548
543
  change_set.stack.template_body = change_set.template_body
549
544
  except Exception as e:
@@ -558,6 +553,8 @@ class CloudformationProviderV2(CloudformationProvider):
558
553
 
559
554
  change_set.stack.set_stack_status(new_stack_status)
560
555
  change_set.set_execution_status(ExecutionStatus.EXECUTE_FAILED)
556
+ change_set.stack.change_set_id = change_set.change_set_id
557
+ change_set.stack.change_set_ids.append(change_set.change_set_id)
561
558
 
562
559
  start_worker_thread(_run)
563
560
 
@@ -587,15 +584,20 @@ class CloudformationProviderV2(CloudformationProvider):
587
584
  StackId=change_set.stack.stack_id,
588
585
  StackName=change_set.stack.stack_name,
589
586
  CreationTime=change_set.creation_time,
590
- Parameters=[
591
- # TODO: add masking support.
592
- Parameter(ParameterKey=key, ParameterValue=value)
593
- for (key, value) in change_set.resolved_parameters.items()
594
- ],
595
587
  Changes=changes,
596
588
  Capabilities=change_set.stack.capabilities,
597
589
  StatusReason=change_set.status_reason,
590
+ Description=change_set.description,
591
+ # TODO: static information
592
+ IncludeNestedStacks=False,
593
+ NotificationARNs=[],
598
594
  )
595
+ if change_set.resolved_parameters:
596
+ result["Parameters"] = [
597
+ # TODO: add masking support.
598
+ Parameter(ParameterKey=key, ParameterValue=value)
599
+ for (key, value) in change_set.resolved_parameters.items()
600
+ ]
599
601
  return result
600
602
 
601
603
  @handler("DescribeChangeSet")
@@ -707,10 +709,7 @@ class CloudformationProviderV2(CloudformationProvider):
707
709
  # is needed for the update graph building, or only looked up in downstream tasks (metadata).
708
710
  request_parameters = request.get("Parameters", list())
709
711
  # TODO: handle parameter defaults and resolution
710
- after_parameters: dict[str, Any] = {
711
- parameter["ParameterKey"]: parameter["ParameterValue"]
712
- for parameter in request_parameters
713
- }
712
+ after_parameters = self._extract_after_parameters(request_parameters)
714
713
  after_template = structured_template
715
714
 
716
715
  # Create internal change set to execute
@@ -744,6 +743,11 @@ class CloudformationProviderV2(CloudformationProvider):
744
743
  stack.template = change_set.template
745
744
  stack.template_body = change_set.template_body
746
745
  stack.resolved_parameters = change_set.resolved_parameters
746
+ stack.resolved_exports = {}
747
+ for output in result.outputs:
748
+ if export_name := output.get("ExportName"):
749
+ stack.resolved_exports[export_name] = output["OutputValue"]
750
+ stack.processed_template = change_set.processed_template
747
751
  except Exception as e:
748
752
  LOG.error(
749
753
  "Create Stack set failed: %s",
@@ -785,59 +789,55 @@ class CloudformationProviderV2(CloudformationProvider):
785
789
 
786
790
  describe_stack_output: list[ApiStack] = []
787
791
  for stack in stacks:
788
- stack_description = ApiStack(
789
- CreationTime=stack.creation_time,
790
- DeletionTime=stack.deletion_time,
791
- StackId=stack.stack_id,
792
- StackName=stack.stack_name,
793
- StackStatus=stack.status,
794
- StackStatusReason=stack.status_reason,
795
- # fake values
796
- DisableRollback=False,
797
- DriftInformation=StackDriftInformation(
798
- StackDriftStatus=StackDriftStatus.NOT_CHECKED
799
- ),
800
- EnableTerminationProtection=stack.enable_termination_protection,
801
- LastUpdatedTime=stack.creation_time,
802
- RollbackConfiguration=RollbackConfiguration(),
803
- Tags=[],
804
- NotificationARNs=[],
805
- Capabilities=stack.capabilities,
806
- # "Parameters": stack.resolved_parameters,
807
- )
808
- # TODO: confirm the logic for this
809
- if change_set_id := stack.change_set_id:
810
- stack_description["ChangeSetId"] = change_set_id
811
-
812
- if stack.resolved_parameters:
813
- stack_description["Parameters"] = []
814
- for name, resolved_parameter in stack.resolved_parameters.items():
815
- parameter = Parameter(
816
- ParameterKey=name,
817
- ParameterValue=resolved_parameter.get("given_value")
818
- or resolved_parameter.get("default_value"),
819
- )
820
- if resolved_value := resolved_parameter.get("resolved_value"):
821
- parameter["ResolvedValue"] = resolved_value
822
- stack_description["Parameters"].append(parameter)
823
-
824
- if stack.resolved_outputs:
825
- describe_outputs = []
826
- for key, value in stack.resolved_outputs.items():
827
- describe_outputs.append(
828
- Output(
829
- # TODO(parity): Description, ExportName
830
- # TODO(parity): what happens on describe stack when the stack has not been deployed yet?
831
- OutputKey=key,
832
- OutputValue=value,
833
- )
834
- )
835
- stack_description["Outputs"] = describe_outputs
836
-
837
- describe_stack_output.append(stack_description)
792
+ describe_stack_output.append(self._describe_stack(stack))
838
793
 
839
794
  return DescribeStacksOutput(Stacks=describe_stack_output)
840
795
 
796
+ @staticmethod
797
+ def _describe_stack(stack: Stack) -> ApiStack:
798
+ stack_description = ApiStack(
799
+ Description=stack.description,
800
+ CreationTime=stack.creation_time,
801
+ DeletionTime=stack.deletion_time,
802
+ StackId=stack.stack_id,
803
+ StackName=stack.stack_name,
804
+ StackStatus=stack.status,
805
+ StackStatusReason=stack.status_reason,
806
+ # fake values
807
+ DisableRollback=False,
808
+ DriftInformation=StackDriftInformation(StackDriftStatus=StackDriftStatus.NOT_CHECKED),
809
+ EnableTerminationProtection=stack.enable_termination_protection,
810
+ RollbackConfiguration=RollbackConfiguration(),
811
+ Tags=[],
812
+ NotificationARNs=[],
813
+ # "Parameters": stack.resolved_parameters,
814
+ )
815
+ if stack.status != StackStatus.REVIEW_IN_PROGRESS:
816
+ # TODO: actually track updated time
817
+ stack_description["LastUpdatedTime"] = stack.creation_time
818
+ if stack.capabilities:
819
+ stack_description["Capabilities"] = stack.capabilities
820
+ # TODO: confirm the logic for this
821
+ if change_set_id := stack.change_set_id:
822
+ stack_description["ChangeSetId"] = change_set_id
823
+
824
+ if stack.resolved_parameters:
825
+ stack_description["Parameters"] = []
826
+ for name, resolved_parameter in stack.resolved_parameters.items():
827
+ parameter = Parameter(
828
+ ParameterKey=name,
829
+ ParameterValue=resolved_parameter.get("given_value")
830
+ or resolved_parameter.get("default_value"),
831
+ )
832
+ if resolved_value := resolved_parameter.get("resolved_value"):
833
+ parameter["ResolvedValue"] = resolved_value
834
+ stack_description["Parameters"].append(parameter)
835
+
836
+ if stack.resolved_outputs:
837
+ stack_description["Outputs"] = stack.resolved_outputs
838
+
839
+ return stack_description
840
+
841
841
  @handler("ListStacks")
842
842
  def list_stacks(
843
843
  self,
@@ -849,7 +849,7 @@ class CloudformationProviderV2(CloudformationProvider):
849
849
  state = get_cloudformation_store(context.account_id, context.region)
850
850
 
851
851
  stacks = [
852
- s.describe_details()
852
+ self._describe_stack(s)
853
853
  for s in state.stacks_v2.values()
854
854
  if not stack_status_filter or s.status in stack_status_filter
855
855
  ]
@@ -1330,10 +1330,8 @@ class CloudformationProviderV2(CloudformationProvider):
1330
1330
  # is needed for the update graph building, or only looked up in downstream tasks (metadata).
1331
1331
  request_parameters = request.get("Parameters", list())
1332
1332
  # TODO: handle parameter defaults and resolution
1333
- after_parameters: dict[str, Any] = {
1334
- parameter["ParameterKey"]: parameter["ParameterValue"]
1335
- for parameter in request_parameters
1336
- }
1333
+ after_parameters = self._extract_after_parameters(request_parameters, before_parameters)
1334
+
1337
1335
  before_template = stack.template
1338
1336
  after_template = structured_template
1339
1337
 
@@ -1377,6 +1375,10 @@ class CloudformationProviderV2(CloudformationProvider):
1377
1375
  stack.template = change_set.template
1378
1376
  stack.template_body = change_set.template_body
1379
1377
  stack.resolved_parameters = change_set.resolved_parameters
1378
+ stack.resolved_exports = {}
1379
+ for output in result.outputs:
1380
+ if export_name := output.get("ExportName"):
1381
+ stack.resolved_exports[export_name] = output["OutputValue"]
1380
1382
  except Exception as e:
1381
1383
  LOG.error(
1382
1384
  "Update Stack failed: %s",
@@ -1387,9 +1389,31 @@ class CloudformationProviderV2(CloudformationProvider):
1387
1389
 
1388
1390
  start_worker_thread(_run)
1389
1391
 
1390
- # TODO: stack id
1391
1392
  return UpdateStackOutput(StackId=stack.stack_id)
1392
1393
 
1394
+ @staticmethod
1395
+ def _extract_after_parameters(
1396
+ request_parameters, before_parameters: dict[str, str] | None = None
1397
+ ) -> dict[str, str]:
1398
+ before_parameters = before_parameters or {}
1399
+ after_parameters = {}
1400
+ for parameter in request_parameters:
1401
+ key = parameter["ParameterKey"]
1402
+ if parameter.get("UsePreviousValue", False):
1403
+ # todo: what if the parameter does not exist in the before parameters
1404
+ before = before_parameters[key]
1405
+ after_parameters[key] = (
1406
+ before.get("resolved_value")
1407
+ or before.get("given_value")
1408
+ or before.get("default_value")
1409
+ )
1410
+ continue
1411
+
1412
+ if "ParameterValue" in parameter:
1413
+ after_parameters[key] = parameter["ParameterValue"]
1414
+ continue
1415
+ return after_parameters
1416
+
1393
1417
  @handler("DeleteStack")
1394
1418
  def delete_stack(
1395
1419
  self,
@@ -0,0 +1,32 @@
1
+ from datetime import datetime
2
+ from typing import NotRequired, TypedDict
3
+
4
+ from localstack.aws.api.cloudformation import ResourceStatus
5
+
6
+
7
+ class EngineParameter(TypedDict):
8
+ """
9
+ Parameters supplied by the user. The resolved value field is populated by the engine
10
+ """
11
+
12
+ type_: str
13
+ given_value: NotRequired[str | None]
14
+ resolved_value: NotRequired[str | None]
15
+ default_value: NotRequired[str | None]
16
+
17
+
18
+ def engine_parameter_value(parameter: EngineParameter) -> str:
19
+ value = parameter.get("given_value") or parameter.get("default_value")
20
+ if value is None:
21
+ raise RuntimeError("Parameter value is None")
22
+
23
+ return value
24
+
25
+
26
+ class ResolvedResource(TypedDict):
27
+ LogicalResourceId: str
28
+ Type: str
29
+ Properties: dict
30
+ ResourceStatus: ResourceStatus
31
+ PhysicalResourceId: str | None
32
+ LastUpdatedTimestamp: datetime | None
@@ -1,6 +1,7 @@
1
1
  # LocalStack Resource Provider Scaffolding v2
2
2
  from __future__ import annotations
3
3
 
4
+ import json
4
5
  from pathlib import Path
5
6
  from typing import TypedDict
6
7
 
@@ -66,12 +67,14 @@ class EC2VPCEndpointProvider(ResourceProvider[EC2VPCEndpointProperties]):
66
67
 
67
68
  """
68
69
  model = request.desired_state
70
+ ec2 = request.aws_client_factory.ec2
71
+
69
72
  create_params = util.select_attributes(
70
- model,
71
- [
72
- "PolidyDocument",
73
+ model=model,
74
+ params=[
75
+ "PolicyDocument",
73
76
  "PrivateDnsEnabled",
74
- "RouteTablesIds",
77
+ "RouteTableIds",
75
78
  "SecurityGroupIds",
76
79
  "ServiceName",
77
80
  "SubnetIds",
@@ -80,12 +83,18 @@ class EC2VPCEndpointProvider(ResourceProvider[EC2VPCEndpointProperties]):
80
83
  ],
81
84
  )
82
85
 
86
+ if policy := model.get("PolicyDocument"):
87
+ create_params["PolicyDocument"] = json.dumps(policy)
88
+
83
89
  if not request.custom_context.get(REPEATED_INVOCATION):
84
- response = request.aws_client_factory.ec2.create_vpc_endpoint(**create_params)
90
+ response = ec2.create_vpc_endpoint(**create_params)
85
91
  model["Id"] = response["VpcEndpoint"]["VpcEndpointId"]
86
92
  model["DnsEntries"] = response["VpcEndpoint"]["DnsEntries"]
87
- model["CreationTimestamp"] = response["VpcEndpoint"]["CreationTimestamp"]
93
+ model["CreationTimestamp"] = response["VpcEndpoint"]["CreationTimestamp"].isoformat()
88
94
  model["NetworkInterfaceIds"] = response["VpcEndpoint"]["NetworkInterfaceIds"]
95
+ model["VpcEndpointType"] = model.get("VpcEndpointType") or "Gateway"
96
+ model["PrivateDnsEnabled"] = bool(model.get("VpcEndpointType", False))
97
+
89
98
  request.custom_context[REPEATED_INVOCATION] = True
90
99
  return ProgressEvent(
91
100
  status=OperationStatus.IN_PROGRESS,
@@ -93,9 +102,7 @@ class EC2VPCEndpointProvider(ResourceProvider[EC2VPCEndpointProperties]):
93
102
  custom_context=request.custom_context,
94
103
  )
95
104
 
96
- response = request.aws_client_factory.ec2.describe_vpc_endpoints(
97
- VpcEndpointIds=[model["Id"]]
98
- )
105
+ response = ec2.describe_vpc_endpoints(VpcEndpointIds=[model["Id"]])
99
106
  if not response["VpcEndpoints"]:
100
107
  return ProgressEvent(
101
108
  status=OperationStatus.FAILED,
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.dev33'
32
- __version_tuple__ = version_tuple = (4, 7, 1, 'dev33')
31
+ __version__ = version = '4.7.1.dev35'
32
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev35')
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.dev33
3
+ Version: 4.7.1.dev35
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=aHDeoj-zirBAo-XFl5jYivoAVHQSHCojRuACTd3RuWg,719
7
+ localstack/version.py,sha256=KhvVf9gXmPYp1dNXTxr8wokA-7KRdqxJdILYpxZARcE,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,9 +311,9 @@ 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=EErVcOi3PtMfDSTJfPpgM0LabgnkE95JyG6AM8-6a3o,58218
314
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=wbDl3SiTmWl4gH15uTCXCZFS3XbQcnfTVVOgUo-L6Ak,60617
315
315
  localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=m5L2DRkQjxU-CXEHhdMwptQuYWwXHpcDNv1kqt15cYI,10401
316
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=P26nKtTcK_bxSONY9JiS0DSYpxjQIooXQAOlbX-cTmk,25839
316
+ localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=Hrsd2iSoQ2kAEyPCZ5rEZNRYyo7ns2JmCrGS2Tj2PWY,25811
317
317
  localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=QnH7Ok9RMV8KlfLU9FtsWGdMdJdka_QHvmMiHOybbek,52550
318
318
  localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=vynAvpnRQv7F0G0Z6g3gFmwtfdaeX71TBlZWMKctawg,13395
319
319
  localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=tfFIQaY27v0PI9L2tMZfhQ47ODrMWg9czucXa6iePeE,6345
@@ -336,8 +336,9 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
336
336
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=K25POLQlhmM_-lGfse1xo4UJLQOIoK35VqQInjXS91Y,30959
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=LOqBpe-H0eKumd9HSbXwriUumrjrmw5YO2hvChbv7aQ,10944
340
- localstack/services/cloudformation/v2/provider.py,sha256=2jPv6-d5Mvk-BtaYpIGUDyFgO6158ZXe4gEfKV6Qn0c,60169
339
+ localstack/services/cloudformation/v2/entities.py,sha256=Q-3ixLWSmmjhClBIzGo6469oU73-DAPa8ZSXWixuUHk,8976
340
+ localstack/services/cloudformation/v2/provider.py,sha256=Q6MuoZpl5y6-u2mMIeeaBtMDTY0C9VMNF1hgs-stQw4,61493
341
+ localstack/services/cloudformation/v2/types.py,sha256=YOKERHmgRjK3RCjqKwQ3ZxZKfa0D-Uwjt2W9GaFDkiM,864
341
342
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
342
343
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
343
344
  localstack/services/cloudwatch/alarm_scheduler.py,sha256=ZgvNwcWn-uI51zCz2Vecchu2jhLlJr2eh9QryE34Pv0,15630
@@ -427,7 +428,7 @@ localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plug
427
428
  localstack/services/ec2/resource_providers/aws_ec2_vpc.py,sha256=REEy20S1onXbaerCuYotAUz-w3lx0SuEgnnJ-S_XTAE,7905
428
429
  localstack/services/ec2/resource_providers/aws_ec2_vpc.schema.json,sha256=Dt3lMG_UqC7eoOPZyLtm0OyLgv1ht7M18g5rOhog1Gc,4974
429
430
  localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py,sha256=lXp1muNRrODywov-kiSt76hw6VWuzqbNTHrNvr-ig98,462
430
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py,sha256=SA5QdXO8V1WGSxi1NG8H_ufHoRtLedFKhjb5bnxmpj0,6003
431
+ localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py,sha256=20kyTov-U4953yn8W2z_hX4p6OcMxi1N3N4KMDilOfM,6290
431
432
  localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.schema.json,sha256=wqSXWl_2fYXIw5n_4mNzCmSiht9oGk07COVCw4o6yU4,3227
432
433
  localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py,sha256=M9BOmerj7DguvR-ol-Ye8u6JQ8dgzvHgMdD7AKevsWI,527
433
434
  localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py,sha256=-_MFfn2mcXK_F2Np34C3XlSwzqAOi1lkzM4Nia5TOWg,3625
@@ -1285,13 +1286,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1285
1286
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1286
1287
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1287
1288
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1288
- localstack_core-4.7.1.dev33.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1289
- localstack_core-4.7.1.dev33.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1290
- localstack_core-4.7.1.dev33.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1291
- localstack_core-4.7.1.dev33.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1292
- localstack_core-4.7.1.dev33.dist-info/METADATA,sha256=uff7nkobMBMQcBI6WY3TsRWQcRD9rStn-NjI5pDMits,5570
1293
- localstack_core-4.7.1.dev33.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1294
- localstack_core-4.7.1.dev33.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1295
- localstack_core-4.7.1.dev33.dist-info/plux.json,sha256=MFBzNO9c15eJFfMIlCdya7pIDjg62gdlE-JVrLZ3qkY,20891
1296
- localstack_core-4.7.1.dev33.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1297
- localstack_core-4.7.1.dev33.dist-info/RECORD,,
1289
+ localstack_core-4.7.1.dev35.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1290
+ localstack_core-4.7.1.dev35.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1291
+ localstack_core-4.7.1.dev35.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1292
+ localstack_core-4.7.1.dev35.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1293
+ localstack_core-4.7.1.dev35.dist-info/METADATA,sha256=MqWFlUktUhf0aeTmSAeY_f00oBTxdRNJf9ShATDcxR8,5570
1294
+ localstack_core-4.7.1.dev35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1295
+ localstack_core-4.7.1.dev35.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1296
+ localstack_core-4.7.1.dev35.dist-info/plux.json,sha256=eBjXYzsgx5iLltubFoIm_wXuyRRIECY-Txs2Sn_OUKI,20891
1297
+ localstack_core-4.7.1.dev35.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1298
+ localstack_core-4.7.1.dev35.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::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::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "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::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin"], "localstack.hooks.on_infra_start": ["conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "eager_load_services=localstack.services.plugins:eager_load_services", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "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", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_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", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "run_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.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "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::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "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::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "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::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::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "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::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "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::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "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", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "_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", "eager_load_services=localstack.services.plugins:eager_load_services", "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", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.packages": ["kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_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", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package"], "localstack.hooks.on_infra_shutdown": ["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", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "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.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "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"]}