localstack-core 4.5.1.dev25__py3-none-any.whl → 4.5.1.dev26__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model.py +98 -3
  2. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +1 -1
  3. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +155 -0
  4. localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +8 -0
  5. localstack/services/cloudformation/v2/entities.py +6 -19
  6. localstack/services/cloudformation/v2/provider.py +55 -6
  7. localstack/version.py +2 -2
  8. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/METADATA +1 -1
  9. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/RECORD +17 -16
  10. localstack_core-4.5.1.dev26.dist-info/plux.json +1 -0
  11. localstack_core-4.5.1.dev25.dist-info/plux.json +0 -1
  12. {localstack_core-4.5.1.dev25.data → localstack_core-4.5.1.dev26.data}/scripts/localstack +0 -0
  13. {localstack_core-4.5.1.dev25.data → localstack_core-4.5.1.dev26.data}/scripts/localstack-supervisor +0 -0
  14. {localstack_core-4.5.1.dev25.data → localstack_core-4.5.1.dev26.data}/scripts/localstack.bat +0 -0
  15. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/WHEEL +0 -0
  16. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/entry_points.txt +0 -0
  17. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/licenses/LICENSE.txt +0 -0
  18. {localstack_core-4.5.1.dev25.dist-info → localstack_core-4.5.1.dev26.dist-info}/top_level.txt +0 -0
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import abc
4
4
  import enum
5
5
  from itertools import zip_longest
6
- from typing import Any, Final, Generator, Optional, Union, cast
6
+ from typing import Any, Final, Generator, Optional, TypedDict, Union, cast
7
7
 
8
8
  from typing_extensions import TypeVar
9
9
 
@@ -78,6 +78,11 @@ def change_type_of(before: Maybe[Any], after: Maybe[Any], children: list[Maybe[C
78
78
  return change_type
79
79
 
80
80
 
81
+ class NormalisedGlobalTransformDefinition(TypedDict):
82
+ Name: Any
83
+ Parameters: Maybe[Any]
84
+
85
+
81
86
  class Scope(str):
82
87
  _ROOT_SCOPE: Final[str] = str()
83
88
  _SEPARATOR: Final[str] = "/"
@@ -143,6 +148,7 @@ class ChangeSetTerminal(ChangeSetEntity, abc.ABC): ...
143
148
 
144
149
 
145
150
  class NodeTemplate(ChangeSetNode):
151
+ transform: Final[NodeTransform]
146
152
  mappings: Final[NodeMappings]
147
153
  parameters: Final[NodeParameters]
148
154
  conditions: Final[NodeConditions]
@@ -152,14 +158,16 @@ class NodeTemplate(ChangeSetNode):
152
158
  def __init__(
153
159
  self,
154
160
  scope: Scope,
161
+ transform: NodeTransform,
155
162
  mappings: NodeMappings,
156
163
  parameters: NodeParameters,
157
164
  conditions: NodeConditions,
158
165
  resources: NodeResources,
159
166
  outputs: NodeOutputs,
160
167
  ):
161
- change_type = parent_change_type_of([resources, outputs])
168
+ change_type = parent_change_type_of([transform, resources, outputs])
162
169
  super().__init__(scope=scope, change_type=change_type)
170
+ self.transform = transform
163
171
  self.mappings = mappings
164
172
  self.parameters = parameters
165
173
  self.conditions = conditions
@@ -277,6 +285,29 @@ class NodeConditions(ChangeSetNode):
277
285
  self.conditions = conditions
278
286
 
279
287
 
288
+ class NodeGlobalTransform(ChangeSetNode):
289
+ name: Final[TerminalValue]
290
+ parameters: Final[Maybe[ChangeSetEntity]]
291
+
292
+ def __init__(self, scope: Scope, name: TerminalValue, parameters: Maybe[ChangeSetEntity]):
293
+ if not is_nothing(parameters):
294
+ change_type = parent_change_type_of([name, parameters])
295
+ else:
296
+ change_type = name.change_type
297
+ super().__init__(scope=scope, change_type=change_type)
298
+ self.name = name
299
+ self.parameters = parameters
300
+
301
+
302
+ class NodeTransform(ChangeSetNode):
303
+ global_transforms: Final[list[NodeGlobalTransform]]
304
+
305
+ def __init__(self, scope: Scope, global_transforms: list[NodeGlobalTransform]):
306
+ change_type = parent_change_type_of(global_transforms)
307
+ super().__init__(scope=scope, change_type=change_type)
308
+ self.global_transforms = global_transforms
309
+
310
+
280
311
  class NodeResources(ChangeSetNode):
281
312
  resources: Final[list[NodeResource]]
282
313
 
@@ -401,6 +432,8 @@ class TerminalValueUnchanged(TerminalValue):
401
432
  super().__init__(scope=scope, change_type=ChangeType.UNCHANGED, value=value)
402
433
 
403
434
 
435
+ NameKey: Final[str] = "Name"
436
+ TransformKey: Final[str] = "Transform"
404
437
  TypeKey: Final[str] = "Type"
405
438
  ConditionKey: Final[str] = "Condition"
406
439
  ConditionsKey: Final[str] = "Conditions"
@@ -1098,10 +1131,72 @@ class ChangeSetModel:
1098
1131
  outputs.append(output)
1099
1132
  return NodeOutputs(scope=scope, outputs=outputs)
1100
1133
 
1134
+ def _visit_global_transform(
1135
+ self,
1136
+ scope: Scope,
1137
+ before_global_transform: Maybe[NormalisedGlobalTransformDefinition],
1138
+ after_global_transform: Maybe[NormalisedGlobalTransformDefinition],
1139
+ ) -> NodeGlobalTransform:
1140
+ name_scope, (before_name, after_name) = self._safe_access_in(
1141
+ scope, NameKey, before_global_transform, after_global_transform
1142
+ )
1143
+ name = self._visit_terminal_value(
1144
+ scope=name_scope, before_value=before_name, after_value=after_name
1145
+ )
1146
+
1147
+ parameters_scope, (before_parameters, after_parameters) = self._safe_access_in(
1148
+ scope, ParametersKey, before_global_transform, after_global_transform
1149
+ )
1150
+ parameters = self._visit_value(
1151
+ scope=parameters_scope, before_value=before_parameters, after_value=after_parameters
1152
+ )
1153
+
1154
+ return NodeGlobalTransform(scope=scope, name=name, parameters=parameters)
1155
+
1156
+ @staticmethod
1157
+ def _normalise_transformer_value(value: Maybe[str | list[Any]]) -> Maybe[list[Any]]:
1158
+ # To simplify downstream logics, reduce the type options to array of transformations.
1159
+ # TODO: add validation logic
1160
+ # TODO: should we sort to avoid detecting user-side ordering changes as template changes?
1161
+ if isinstance(value, NothingType):
1162
+ return value
1163
+ elif isinstance(value, str):
1164
+ value = [NormalisedGlobalTransformDefinition(Name=value, Parameters=Nothing)]
1165
+ elif not isinstance(value, list):
1166
+ raise RuntimeError(f"Invalid type for Transformer: '{value}'")
1167
+ return value
1168
+
1169
+ def _visit_transform(
1170
+ self, scope: Scope, before_transform: Maybe[Any], after_transform: Maybe[Any]
1171
+ ) -> NodeTransform:
1172
+ before_transform_normalised = self._normalise_transformer_value(before_transform)
1173
+ after_transform_normalised = self._normalise_transformer_value(after_transform)
1174
+ global_transforms = list()
1175
+ for index, (before_global_transform, after_global_transform) in enumerate(
1176
+ zip_longest(before_transform_normalised, after_transform_normalised, fillvalue=Nothing)
1177
+ ):
1178
+ global_transform_scope = scope.open_index(index=index)
1179
+ global_transform: NodeGlobalTransform = self._visit_global_transform(
1180
+ scope=global_transform_scope,
1181
+ before_global_transform=before_global_transform,
1182
+ after_global_transform=after_global_transform,
1183
+ )
1184
+ global_transforms.append(global_transform)
1185
+ return NodeTransform(scope=scope, global_transforms=global_transforms)
1186
+
1101
1187
  def _model(self, before_template: Maybe[dict], after_template: Maybe[dict]) -> NodeTemplate:
1102
1188
  root_scope = Scope()
1103
1189
  # TODO: visit other child types
1104
1190
 
1191
+ transform_scope, (before_transform, after_transform) = self._safe_access_in(
1192
+ root_scope, TransformKey, before_template, after_template
1193
+ )
1194
+ transform = self._visit_transform(
1195
+ scope=transform_scope,
1196
+ before_transform=before_transform,
1197
+ after_transform=after_transform,
1198
+ )
1199
+
1105
1200
  mappings_scope, (before_mappings, after_mappings) = self._safe_access_in(
1106
1201
  root_scope, MappingsKey, before_template, after_template
1107
1202
  )
@@ -1143,9 +1238,9 @@ class ChangeSetModel:
1143
1238
  scope=outputs_scope, before_outputs=before_outputs, after_outputs=after_outputs
1144
1239
  )
1145
1240
 
1146
- # TODO: compute the change_type of the template properly.
1147
1241
  return NodeTemplate(
1148
1242
  scope=root_scope,
1243
+ transform=transform,
1149
1244
  mappings=mappings,
1150
1245
  parameters=parameters,
1151
1246
  conditions=conditions,
@@ -170,7 +170,7 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
170
170
 
171
171
  def __init__(self, change_set: ChangeSet):
172
172
  self._change_set = change_set
173
- self._node_template = change_set.update_graph
173
+ self._node_template = change_set.update_model
174
174
  self._before_resolved_resources = change_set.stack.resolved_resources
175
175
  self._processed = dict()
176
176
 
@@ -0,0 +1,155 @@
1
+ import copy
2
+ import os
3
+ from typing import Final, Optional
4
+
5
+ import boto3
6
+ from samtranslator.translator.transform import transform as transform_sam
7
+
8
+ from localstack.services.cloudformation.engine.policy_loader import create_policy_loader
9
+ from localstack.services.cloudformation.engine.transformers import FailedTransformationException
10
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
11
+ ChangeType,
12
+ Maybe,
13
+ NodeGlobalTransform,
14
+ NodeTransform,
15
+ Nothing,
16
+ is_nothing,
17
+ )
18
+ from localstack.services.cloudformation.engine.v2.change_set_model_preproc import (
19
+ ChangeSetModelPreproc,
20
+ PreprocEntityDelta,
21
+ )
22
+ from localstack.services.cloudformation.v2.entities import ChangeSet
23
+
24
+ SERVERLESS_TRANSFORM = "AWS::Serverless-2016-10-31"
25
+
26
+
27
+ # TODO: evaluate the use of subtypes to represent and validate types of transforms
28
+ class GlobalTransform:
29
+ name: str
30
+ parameters: Maybe[dict]
31
+
32
+ def __init__(self, name: str, parameters: Maybe[dict]):
33
+ self.name = name
34
+ self.parameters = parameters
35
+
36
+
37
+ class ChangeSetModelTransform(ChangeSetModelPreproc):
38
+ _before_parameters: Final[dict]
39
+ _after_parameters: Final[dict]
40
+ _before_template: Final[Maybe[dict]]
41
+ _after_template: Final[Maybe[dict]]
42
+
43
+ def __init__(
44
+ self,
45
+ change_set: ChangeSet,
46
+ before_parameters: dict,
47
+ after_parameters: dict,
48
+ before_template: Optional[dict],
49
+ after_template: Optional[dict],
50
+ ):
51
+ super().__init__(change_set=change_set)
52
+ self._before_parameters = before_parameters
53
+ self._after_parameters = after_parameters
54
+ self._before_template = before_template or Nothing
55
+ self._after_template = after_template or Nothing
56
+
57
+ # Ported from v1:
58
+ @staticmethod
59
+ def _apply_serverless_transformation(
60
+ region_name: str, template: dict, parameters: dict
61
+ ) -> dict:
62
+ """only returns string when parsing SAM template, otherwise None"""
63
+ # TODO: we might also want to override the access key ID to account ID
64
+ region_before = os.environ.get("AWS_DEFAULT_REGION")
65
+ if boto3.session.Session().region_name is None:
66
+ os.environ["AWS_DEFAULT_REGION"] = region_name
67
+ loader = create_policy_loader()
68
+ # The following transformation function can carry out in-place changes ensure this cannot occur.
69
+ template = copy.deepcopy(template)
70
+ parameters = copy.deepcopy(parameters)
71
+ try:
72
+ transformed = transform_sam(template, parameters, loader)
73
+ return transformed
74
+ except Exception as e:
75
+ raise FailedTransformationException(transformation=SERVERLESS_TRANSFORM, message=str(e))
76
+ finally:
77
+ # Note: we need to fix boto3 region, otherwise AWS SAM transformer fails
78
+ os.environ.pop("AWS_DEFAULT_REGION", None)
79
+ if region_before is not None:
80
+ os.environ["AWS_DEFAULT_REGION"] = region_before
81
+
82
+ def _apply_global_transform(
83
+ self, global_transform: GlobalTransform, template: dict, parameters: dict
84
+ ) -> dict:
85
+ if global_transform.name == SERVERLESS_TRANSFORM:
86
+ return self._apply_serverless_transformation(
87
+ region_name=self._change_set.region_name,
88
+ template=template,
89
+ parameters=parameters,
90
+ )
91
+ # TODO: expand support
92
+ raise RuntimeError(f"Unsupported global transform '{global_transform.name}'")
93
+
94
+ def transform(self) -> tuple[dict, dict]:
95
+ transform_delta: PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]] = (
96
+ self.visit_node_transform(self._node_template.transform)
97
+ )
98
+ transform_before: Maybe[list[GlobalTransform]] = transform_delta.before
99
+ transform_after: Maybe[list[GlobalTransform]] = transform_delta.after
100
+
101
+ transformed_before_template = self._before_template
102
+ if not is_nothing(transform_before) and not is_nothing(self._before_template):
103
+ transformed_before_template = self._before_template
104
+ for before_global_transform in transform_before:
105
+ transformed_before_template = self._apply_global_transform(
106
+ global_transform=before_global_transform,
107
+ parameters=self._before_parameters,
108
+ template=transformed_before_template,
109
+ )
110
+
111
+ transformed_after_template = self._after_template
112
+ if not is_nothing(transform_before) and not is_nothing(self._after_template):
113
+ transformed_after_template = self._after_template
114
+ for after_global_transform in transform_after:
115
+ transformed_after_template = self._apply_global_transform(
116
+ global_transform=after_global_transform,
117
+ parameters=self._after_parameters,
118
+ template=transformed_after_template,
119
+ )
120
+
121
+ return transformed_before_template, transformed_after_template
122
+
123
+ def visit_node_global_transform(
124
+ self, node_global_transform: NodeGlobalTransform
125
+ ) -> PreprocEntityDelta[GlobalTransform, GlobalTransform]:
126
+ change_type = node_global_transform.change_type
127
+
128
+ name_delta = self.visit(node_global_transform.name)
129
+ parameters_delta = self.visit(node_global_transform.parameters)
130
+
131
+ before = Nothing
132
+ if change_type != ChangeType.CREATED:
133
+ before = GlobalTransform(name=name_delta.before, parameters=parameters_delta.before)
134
+ after = Nothing
135
+ if change_type != ChangeType.REMOVED:
136
+ after = GlobalTransform(name=name_delta.after, parameters=parameters_delta.after)
137
+ return PreprocEntityDelta(before=before, after=after)
138
+
139
+ def visit_node_transform(
140
+ self, node_transform: NodeTransform
141
+ ) -> PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]]:
142
+ change_type = node_transform.change_type
143
+ before = list() if change_type != ChangeType.CREATED else Nothing
144
+ after = list() if change_type != ChangeType.REMOVED else Nothing
145
+ for change_set_entity in node_transform.global_transforms:
146
+ delta: PreprocEntityDelta[GlobalTransform, GlobalTransform] = self.visit(
147
+ change_set_entity=change_set_entity
148
+ )
149
+ delta_before = delta.before
150
+ delta_after = delta.after
151
+ if not is_nothing(before) and not is_nothing(delta_before):
152
+ before.append(delta_before)
153
+ if not is_nothing(after) and not is_nothing(delta_after):
154
+ after.append(delta_after)
155
+ return PreprocEntityDelta(before=before, after=after)
@@ -7,6 +7,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
7
7
  NodeConditions,
8
8
  NodeDependsOn,
9
9
  NodeDivergence,
10
+ NodeGlobalTransform,
10
11
  NodeIntrinsicFunction,
11
12
  NodeMapping,
12
13
  NodeMappings,
@@ -20,6 +21,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
20
21
  NodeResource,
21
22
  NodeResources,
22
23
  NodeTemplate,
24
+ NodeTransform,
23
25
  TerminalValueCreated,
24
26
  TerminalValueModified,
25
27
  TerminalValueRemoved,
@@ -55,6 +57,12 @@ class ChangeSetModelVisitor(abc.ABC):
55
57
  self.visit(node_template.resources)
56
58
  self.visit(node_template.outputs)
57
59
 
60
+ def visit_node_transform(self, node_transform: NodeTransform):
61
+ self.visit_children(node_transform)
62
+
63
+ def visit_node_global_transform(self, node_global_transform: NodeGlobalTransform):
64
+ self.visit_children(node_global_transform)
65
+
58
66
  def visit_node_outputs(self, node_outputs: NodeOutputs):
59
67
  self.visit_children(node_outputs)
60
68
 
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime, timezone
2
- from typing import TypedDict
2
+ from typing import Optional, TypedDict
3
3
 
4
4
  from localstack.aws.api.cloudformation import (
5
5
  ChangeSetStatus,
@@ -23,7 +23,6 @@ from localstack.services.cloudformation.engine.entities import (
23
23
  StackTemplate,
24
24
  )
25
25
  from localstack.services.cloudformation.engine.v2.change_set_model import (
26
- ChangeSetModel,
27
26
  NodeTemplate,
28
27
  )
29
28
  from localstack.utils.aws import arns
@@ -154,7 +153,7 @@ class ChangeSet:
154
153
  change_set_name: str
155
154
  change_set_id: str
156
155
  change_set_type: ChangeSetType
157
- update_graph: NodeTemplate | None
156
+ update_model: Optional[NodeTemplate]
158
157
  status: ChangeSetStatus
159
158
  execution_status: ExecutionStatus
160
159
  creation_time: datetime
@@ -169,7 +168,7 @@ class ChangeSet:
169
168
  self.template = template
170
169
  self.status = ChangeSetStatus.CREATE_IN_PROGRESS
171
170
  self.execution_status = ExecutionStatus.AVAILABLE
172
- self.update_graph = None
171
+ self.update_model = None
173
172
  self.creation_time = datetime.now(tz=timezone.utc)
174
173
 
175
174
  self.change_set_name = request_payload["ChangeSetName"]
@@ -181,6 +180,9 @@ class ChangeSet:
181
180
  region_name=self.stack.region_name,
182
181
  )
183
182
 
183
+ def set_update_model(self, update_model: NodeTemplate) -> None:
184
+ self.update_model = update_model
185
+
184
186
  def set_change_set_status(self, status: ChangeSetStatus):
185
187
  self.status = status
186
188
 
@@ -194,18 +196,3 @@ class ChangeSet:
194
196
  @property
195
197
  def region_name(self) -> str:
196
198
  return self.stack.region_name
197
-
198
- def populate_update_graph(
199
- self,
200
- before_template: dict | None = None,
201
- after_template: dict | None = None,
202
- before_parameters: dict | None = None,
203
- after_parameters: dict | None = None,
204
- ) -> None:
205
- change_set_model = ChangeSetModel(
206
- before_template=before_template,
207
- after_template=after_template,
208
- before_parameters=before_parameters,
209
- after_parameters=after_parameters,
210
- )
211
- self.update_graph = change_set_model.get_update_model()
@@ -1,7 +1,7 @@
1
1
  import copy
2
2
  import logging
3
3
  from datetime import datetime, timezone
4
- from typing import Any
4
+ from typing import Any, Optional
5
5
 
6
6
  from localstack.aws.api import RequestContext, handler
7
7
  from localstack.aws.api.cloudformation import (
@@ -37,12 +37,19 @@ from localstack.aws.api.cloudformation import (
37
37
  )
38
38
  from localstack.services.cloudformation import api_utils
39
39
  from localstack.services.cloudformation.engine import template_preparer
40
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
41
+ ChangeSetModel,
42
+ NodeTemplate,
43
+ )
40
44
  from localstack.services.cloudformation.engine.v2.change_set_model_describer import (
41
45
  ChangeSetModelDescriber,
42
46
  )
43
47
  from localstack.services.cloudformation.engine.v2.change_set_model_executor import (
44
48
  ChangeSetModelExecutor,
45
49
  )
50
+ from localstack.services.cloudformation.engine.v2.change_set_model_transform import (
51
+ ChangeSetModelTransform,
52
+ )
46
53
  from localstack.services.cloudformation.engine.validations import ValidationError
47
54
  from localstack.services.cloudformation.provider import (
48
55
  ARN_CHANGESET_REGEX,
@@ -122,6 +129,47 @@ def find_change_set_v2(
122
129
 
123
130
 
124
131
  class CloudformationProviderV2(CloudformationProvider):
132
+ @staticmethod
133
+ def _setup_change_set_model(
134
+ change_set: ChangeSet,
135
+ before_template: Optional[dict],
136
+ after_template: Optional[dict],
137
+ before_parameters: Optional[dict],
138
+ after_parameters: Optional[dict],
139
+ ):
140
+ # Create and preprocess the update graph for this template update.
141
+ change_set_model = ChangeSetModel(
142
+ before_template=before_template,
143
+ after_template=after_template,
144
+ before_parameters=before_parameters,
145
+ after_parameters=after_parameters,
146
+ )
147
+ raw_update_model: NodeTemplate = change_set_model.get_update_model()
148
+ change_set.set_update_model(raw_update_model)
149
+
150
+ # Apply global transforms.
151
+ # TODO: skip this process iff both versions of the template don't specify transform blocks.
152
+ change_set_model_transform = ChangeSetModelTransform(
153
+ change_set=change_set,
154
+ before_parameters=before_parameters,
155
+ after_parameters=after_parameters,
156
+ before_template=before_template,
157
+ after_template=after_template,
158
+ )
159
+ transformed_before_template, transformed_after_template = (
160
+ change_set_model_transform.transform()
161
+ )
162
+
163
+ # Remodel the update graph after the applying the global transforms.
164
+ change_set_model = ChangeSetModel(
165
+ before_template=transformed_before_template,
166
+ after_template=transformed_after_template,
167
+ before_parameters=before_parameters,
168
+ after_parameters=after_parameters,
169
+ )
170
+ update_model = change_set_model.get_update_model()
171
+ change_set.set_update_model(update_model)
172
+
125
173
  @handler("CreateChangeSet", expand=False)
126
174
  def create_change_set(
127
175
  self, context: RequestContext, request: CreateChangeSetInput
@@ -242,14 +290,14 @@ class CloudformationProviderV2(CloudformationProvider):
242
290
 
243
291
  # create change set for the stack and apply changes
244
292
  change_set = ChangeSet(stack, request, template=after_template)
245
-
246
- # only set parameters for the changeset, then switch to stack on execute_change_set
247
- change_set.populate_update_graph(
293
+ self._setup_change_set_model(
294
+ change_set=change_set,
248
295
  before_template=before_template,
249
296
  after_template=after_template,
250
297
  before_parameters=before_parameters,
251
298
  after_parameters=after_parameters,
252
299
  )
300
+
253
301
  change_set.set_change_set_status(ChangeSetStatus.CREATE_COMPLETE)
254
302
  stack.change_set_id = change_set.change_set_id
255
303
  stack.change_set_id = change_set.change_set_id
@@ -285,7 +333,7 @@ class CloudformationProviderV2(CloudformationProvider):
285
333
  # stack_name,
286
334
  # len(change_set.template_resources),
287
335
  # )
288
- if not change_set.update_graph:
336
+ if not change_set.update_model:
289
337
  raise RuntimeError("Programming error: no update graph found for change set")
290
338
 
291
339
  change_set.set_execution_status(ExecutionStatus.EXECUTE_IN_PROGRESS)
@@ -471,7 +519,8 @@ class CloudformationProviderV2(CloudformationProvider):
471
519
 
472
520
  # create a dummy change set
473
521
  change_set = ChangeSet(stack, {"ChangeSetName": f"delete-stack_{stack.stack_name}"}) # noqa
474
- change_set.populate_update_graph(
522
+ self._setup_change_set_model(
523
+ change_set=change_set,
475
524
  before_template=stack.template,
476
525
  after_template=None,
477
526
  before_parameters=stack.resolved_parameters,
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.5.1.dev25'
21
- __version_tuple__ = version_tuple = (4, 5, 1, 'dev25')
20
+ __version__ = version = '4.5.1.dev26'
21
+ __version_tuple__ = version_tuple = (4, 5, 1, 'dev26')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.5.1.dev25
3
+ Version: 4.5.1.dev26
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=-freHlTVK66Roqv-HTALedgitMq92TBsFF5-u3b6UP8,526
7
+ localstack/version.py,sha256=PnXAfMjoTidVxOMwKOGOrQ3rOEdeQX8Nx4jx_tQPybc,526
8
8
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
10
10
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -310,11 +310,12 @@ localstack/services/cloudformation/engine/types.py,sha256=YIhmTrO__obIviYvzzCovK
310
310
  localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
311
311
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
312
312
  localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
313
- localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=PZLrPSzw7IVV3gG9q9R28Snp5iwfeHBiDWcO-tZljGs,49632
313
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=FnRCaiCCj16ofuXEIAVfYTTbTil2Lce-CPSBoNjoGu8,53736
314
314
  localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=J2OibRDuVXu-rnLxHmxtjqOD4Q489F9An_6-fkTTAm8,8057
315
315
  localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=kwExKaHG9DpbSd4aUnD1fkbYv2gE0_Zono8FoFCaMpc,19052
316
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=RobREIGTbZUXJY3cswHNxLx6UBZF34AHMA2Yd6cbK5o,48953
317
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=fTZA7zCd2JytnW8QqaYXxzl6SyapWhu78_NvY2EhcLU,7371
316
+ localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=2VvveGHH8uE-ei2bQCqb9dUEYl4NwP6V9J7nwb0DYHA,48953
317
+ localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=1ibOGuSZpZwiLt2dEPwptsNVQTBjuRk2R4_Wy06FkvI,6676
318
+ localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=JERT55YkPF-UHzG-sk958mpyEq2Gxz4smY8xwDbhIRQ,7666
318
319
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
319
320
  localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
320
321
  localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py,sha256=Grn3dP1jANRlVO9HyKQV5GHv0x1eNRBeaIYhgn-FKv4,2812
@@ -332,8 +333,8 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
332
333
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=zjedOdqvnfN99WzQ43gxtGZxLDitSnbFGA-zpWbyMQ0,30960
333
334
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=9YsSCkDegcU_Yp8Sfw8eNV26N5ibOlLC6Hg6lxPeBBM,7949
334
335
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
335
- localstack/services/cloudformation/v2/entities.py,sha256=92Vl1Jw14G_dGBE0VMnz341XS35ob3J4yLQlyu58_uw,6939
336
- localstack/services/cloudformation/v2/provider.py,sha256=74DcH58lrEYNP9RFBv0tEwdfHcka42EOAv7JbtCKdxg,20908
336
+ localstack/services/cloudformation/v2/entities.py,sha256=WJod0UgwaIXmLbb-fh3ZNweqF2kiv0gDJiy1gW1vIQU,6498
337
+ localstack/services/cloudformation/v2/provider.py,sha256=mpcdRne444-OAoC3ymZncNZqQUh9LV29q3sNHG_8Fz8,22824
337
338
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
338
339
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
340
  localstack/services/cloudwatch/alarm_scheduler.py,sha256=XFllg0gI_WNV7cNxOcgXifzmbNA07OPpuEUuf37keP4,15663
@@ -1283,13 +1284,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1283
1284
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1284
1285
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1285
1286
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1286
- localstack_core-4.5.1.dev25.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1287
- localstack_core-4.5.1.dev25.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1288
- localstack_core-4.5.1.dev25.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1289
- localstack_core-4.5.1.dev25.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1290
- localstack_core-4.5.1.dev25.dist-info/METADATA,sha256=Roe8TIPAL2eEiBuDHK58YGn3u1c1DSPo6K5ToU5R8fU,5539
1291
- localstack_core-4.5.1.dev25.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1292
- localstack_core-4.5.1.dev25.dist-info/entry_points.txt,sha256=tsZ2TeV3-omCfAUEXmTWXu_D40b_17a9FDAEpbeaoNw,20571
1293
- localstack_core-4.5.1.dev25.dist-info/plux.json,sha256=YSm9NHV9YHwOfasCwaIN9LnC29sfiR6aUZ1KmRcDXZM,20793
1294
- localstack_core-4.5.1.dev25.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1295
- localstack_core-4.5.1.dev25.dist-info/RECORD,,
1287
+ localstack_core-4.5.1.dev26.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1288
+ localstack_core-4.5.1.dev26.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1289
+ localstack_core-4.5.1.dev26.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1290
+ localstack_core-4.5.1.dev26.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1291
+ localstack_core-4.5.1.dev26.dist-info/METADATA,sha256=XUpsSE2NWbiu-Uu2nGn26PMhmGN736B7hz5nc8yEbDU,5539
1292
+ localstack_core-4.5.1.dev26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1293
+ localstack_core-4.5.1.dev26.dist-info/entry_points.txt,sha256=tsZ2TeV3-omCfAUEXmTWXu_D40b_17a9FDAEpbeaoNw,20571
1294
+ localstack_core-4.5.1.dev26.dist-info/plux.json,sha256=X9nSuRXpiGtCgHqI4G3XGoXOCeI_KCcf0S4NjPoiVJQ,20793
1295
+ localstack_core-4.5.1.dev26.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1296
+ localstack_core-4.5.1.dev26.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.hooks.on_infra_start": ["conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "eager_load_services=localstack.services.plugins:eager_load_services", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches"], "localstack.cloudformation.resource_providers": ["AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "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::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "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::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "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::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin"], "localstack.packages": ["kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_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", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "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"], "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", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server"], "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.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "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::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "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::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin"], "localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_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": ["apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_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", "_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", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "eager_load_services=localstack.services.plugins:eager_load_services", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.on_infra_shutdown": ["_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.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"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"]}