localstack-core 4.2.1.dev38__py3-none-any.whl → 4.2.1.dev39__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.
@@ -0,0 +1,404 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ import enum
5
+ from itertools import zip_longest
6
+ from typing import Any, Final, Generator, Optional, Union
7
+
8
+ from typing_extensions import TypeVar
9
+
10
+ T = TypeVar("T")
11
+
12
+
13
+ class NothingType:
14
+ """A sentinel that denotes 'no value' (distinct from None)."""
15
+
16
+ _singleton = None
17
+ __slots__ = ()
18
+
19
+ def __new__(cls):
20
+ if cls._singleton is None:
21
+ cls._singleton = super().__new__(cls)
22
+ return cls._singleton
23
+
24
+ def __str__(self):
25
+ return repr(self)
26
+
27
+ def __repr__(self) -> str:
28
+ return "Nothing"
29
+
30
+
31
+ Maybe = Union[T, NothingType]
32
+ Nothing = NothingType()
33
+
34
+
35
+ class ChangeType(enum.Enum):
36
+ UNCHANGED = "Unchanged"
37
+ CREATED = "Created"
38
+ MODIFIED = "Modified"
39
+ REMOVED = "Removed"
40
+
41
+ def __str__(self):
42
+ return self.value
43
+
44
+
45
+ class ChangeSetEntity(abc.ABC):
46
+ change_type: Final[ChangeType]
47
+
48
+ def __init__(self, change_type: ChangeType):
49
+ self.change_type = change_type
50
+
51
+ def get_children(self) -> Generator[ChangeSetEntity]:
52
+ for child in self.__dict__.values():
53
+ yield from self._get_children_in(child)
54
+
55
+ @staticmethod
56
+ def _get_children_in(obj: Any) -> Generator[ChangeSetEntity]:
57
+ # TODO: could avoid the inductive logic here, and check for loops?
58
+ if isinstance(obj, ChangeSetEntity):
59
+ yield obj
60
+ elif isinstance(obj, list):
61
+ for item in obj:
62
+ yield from ChangeSetEntity._get_children_in(item)
63
+ elif isinstance(obj, dict):
64
+ for item in obj.values():
65
+ yield from ChangeSetEntity._get_children_in(item)
66
+
67
+ def __str__(self):
68
+ return f"({self.__class__.__name__}| {vars(self)}"
69
+
70
+ def __repr__(self):
71
+ return str(self)
72
+
73
+
74
+ class ChangeSetNode(ChangeSetEntity, abc.ABC): ...
75
+
76
+
77
+ class ChangeSetTerminal(ChangeSetEntity, abc.ABC): ...
78
+
79
+
80
+ class NodeTemplate(ChangeSetNode):
81
+ resources: Final[NodeResources]
82
+
83
+ def __init__(self, change_type: ChangeType, resources: NodeResources):
84
+ super().__init__(change_type=change_type)
85
+ self.resources = resources
86
+
87
+
88
+ class NodeResources(ChangeSetNode):
89
+ resources: Final[list[NodeResource]]
90
+
91
+ def __init__(self, change_type: ChangeType, resources: list[NodeResource]):
92
+ super().__init__(change_type=change_type)
93
+ self.resources = resources
94
+
95
+
96
+ class NodeResource(ChangeSetNode):
97
+ name: Final[str]
98
+ type_: Final[ChangeSetTerminal]
99
+ properties: Final[NodeProperties]
100
+
101
+ def __init__(
102
+ self,
103
+ change_type: ChangeType,
104
+ name: str,
105
+ type_: ChangeSetTerminal,
106
+ properties: NodeProperties,
107
+ ):
108
+ super().__init__(change_type=change_type)
109
+ self.name = name
110
+ self.type_ = type_
111
+ self.properties = properties
112
+
113
+
114
+ class NodeProperties(ChangeSetNode):
115
+ properties: Final[list[NodeProperty]]
116
+
117
+ def __init__(self, change_type: ChangeType, properties: list[NodeProperty]):
118
+ super().__init__(change_type=change_type)
119
+ self.properties = properties
120
+
121
+
122
+ class NodeProperty(ChangeSetNode):
123
+ name: Final[str]
124
+ value: Final[ChangeSetEntity]
125
+
126
+ def __init__(self, change_type: ChangeType, name: str, value: ChangeSetEntity):
127
+ super().__init__(change_type=change_type)
128
+ self.name = name
129
+ self.value = value
130
+
131
+
132
+ class NodeObject(ChangeSetNode):
133
+ bindings: Final[dict[str, ChangeSetEntity]]
134
+
135
+ def __init__(self, change_type: ChangeType, bindings: dict[str, ChangeSetEntity]):
136
+ super().__init__(change_type=change_type)
137
+ self.bindings = bindings
138
+
139
+
140
+ class NodeArray(ChangeSetNode):
141
+ array: Final[list[ChangeSetEntity]]
142
+
143
+ def __init__(self, change_type: ChangeType, array: list[ChangeSetEntity]):
144
+ super().__init__(change_type=change_type)
145
+ self.array = array
146
+
147
+
148
+ class TerminalValue(ChangeSetTerminal, abc.ABC):
149
+ value: Final[Any]
150
+
151
+ def __init__(self, change_type: ChangeType, value: Any):
152
+ super().__init__(change_type=change_type)
153
+ self.value = value
154
+
155
+
156
+ class TerminalValueModified(TerminalValue):
157
+ modified_value: Final[Any]
158
+
159
+ def __init__(self, value: Any, modified_value: Any):
160
+ super().__init__(change_type=ChangeType.MODIFIED, value=value)
161
+ self.modified_value = modified_value
162
+
163
+
164
+ class TerminalValueCreated(TerminalValue):
165
+ def __init__(self, value: Any):
166
+ super().__init__(change_type=ChangeType.CREATED, value=value)
167
+
168
+
169
+ class TerminalValueRemoved(TerminalValue):
170
+ def __init__(self, value: Any):
171
+ super().__init__(change_type=ChangeType.REMOVED, value=value)
172
+
173
+
174
+ class TerminalValueUnchanged(TerminalValue):
175
+ def __init__(self, value: Any):
176
+ super().__init__(change_type=ChangeType.UNCHANGED, value=value)
177
+
178
+
179
+ ResourcesKey: Final[str] = "Resources"
180
+ PropertiesKey: Final[str] = "Properties"
181
+
182
+
183
+ class ChangeSetModel:
184
+ # TODO: should this instead be generalised to work on "Stack" objects instead of just "Template"s?
185
+
186
+ # TODO: can probably improve the typehints to use CFN's 'language' eg. dict -> Template|Properties, etc.
187
+
188
+ # TODO: typechecks for key-value pairs?
189
+
190
+ _before_template: Final[Maybe[dict]]
191
+ _after_template: Final[Maybe[dict]]
192
+ _node_template: Final[NodeTemplate]
193
+
194
+ def __init__(self, before_template: Optional[dict], after_template: Optional[dict]):
195
+ self._before_template = before_template or Nothing
196
+ self._after_template = after_template or Nothing
197
+ self._node_template = self._model(
198
+ before_template=before_template, after_template=after_template
199
+ )
200
+
201
+ def get_update_model(self) -> NodeTemplate:
202
+ # TODO: rethink naming of this for outer utils
203
+ return self._node_template
204
+
205
+ def _visit_terminal_value( # noqa
206
+ self, before_value: Maybe[Any], after_value: Maybe[Any]
207
+ ) -> TerminalValue:
208
+ if self._is_created(before=before_value, after=after_value):
209
+ return TerminalValueCreated(value=after_value)
210
+ if self._is_removed(before=before_value, after=after_value):
211
+ return TerminalValueRemoved(value=before_value)
212
+ if before_value == after_value:
213
+ return TerminalValueUnchanged(value=before_value)
214
+ return TerminalValueModified(value=before_value, modified_value=after_value)
215
+
216
+ def _visit_array(self, before_array: Maybe[list], after_array: Maybe[list]) -> NodeArray:
217
+ change_type = ChangeType.UNCHANGED
218
+ array: list[ChangeSetEntity] = list()
219
+ for before_value, after_value in zip_longest(before_array, after_array, fillvalue=Nothing):
220
+ value = self._visit_value(before_value=before_value, after_value=after_value)
221
+ array.append(value)
222
+ if value.change_type != ChangeType.UNCHANGED:
223
+ change_type = ChangeType.MODIFIED
224
+ return NodeArray(change_type=change_type, array=array)
225
+
226
+ def _visit_object(self, before_object: Maybe[dict], after_object: Maybe[dict]) -> NodeObject:
227
+ change_type = ChangeType.UNCHANGED
228
+ binding_names = self._keys_of(before_object, after_object)
229
+ bindings: dict[str, ChangeSetEntity] = dict()
230
+ for binding_name in binding_names:
231
+ # TODO: check the binding names for intrinsic functions and redirect.
232
+ before_value, after_value = self._sample_from(binding_name, before_object, after_object)
233
+ value = self._visit_value(before_value=before_value, after_value=after_value)
234
+ bindings[binding_name] = value
235
+ if value.change_type != ChangeType.UNCHANGED:
236
+ change_type = ChangeType.MODIFIED
237
+ return NodeObject(change_type=change_type, bindings=bindings)
238
+
239
+ def _visit_value(self, before_value: Maybe[Any], after_value: Maybe[Any]) -> ChangeSetEntity:
240
+ before_type = type(before_value)
241
+ after_type = type(after_value)
242
+
243
+ if self._is_created(before=before_value, after=after_value):
244
+ return TerminalValueCreated(value=after_value)
245
+ if self._is_removed(before=before_value, after=after_value):
246
+ return TerminalValueRemoved(value=before_value)
247
+
248
+ # Case: update on the same type.
249
+ if before_type == after_type:
250
+ if self._is_terminal(value=before_value):
251
+ value = self._visit_terminal_value(
252
+ before_value=before_value, after_value=after_value
253
+ )
254
+ elif self._is_object(value=before_value):
255
+ value = self._visit_object(before_object=before_value, after_object=after_value)
256
+ elif self._is_array(value=before_value):
257
+ value = self._visit_array(before_array=before_value, after_array=after_value)
258
+ else:
259
+ raise RuntimeError(f"Unsupported type {before_type}")
260
+ return value
261
+ # Case: update to new type.
262
+ else:
263
+ return TerminalValueModified(value=before_value, modified_value=after_value)
264
+
265
+ def _visit_property(
266
+ self, property_name: str, before_property: Maybe[Any], after_property: Maybe[Any]
267
+ ) -> NodeProperty:
268
+ if self._is_created(before=before_property, after=after_property):
269
+ return NodeProperty(
270
+ change_type=ChangeType.CREATED,
271
+ name=property_name,
272
+ value=TerminalValueCreated(value=after_property),
273
+ )
274
+ if self._is_removed(before=before_property, after=after_property):
275
+ return NodeProperty(
276
+ change_type=ChangeType.REMOVED,
277
+ name=property_name,
278
+ value=TerminalValueRemoved(value=before_property),
279
+ )
280
+ value = self._visit_value(before_value=before_property, after_value=after_property)
281
+ return NodeProperty(change_type=value.change_type, name=property_name, value=value)
282
+
283
+ def _visit_properties(
284
+ self, before_properties: Maybe[dict], after_properties: Maybe[dict]
285
+ ) -> NodeProperties:
286
+ # TODO: double check we are sure not to have this be a NodeObject
287
+ property_names: set[str] = self._keys_of(before_properties, after_properties)
288
+ properties: list[NodeProperty] = list()
289
+ change_type = ChangeType.UNCHANGED
290
+ for property_name in property_names:
291
+ before_property, after_property = self._sample_from(
292
+ property_name, before_properties, after_properties
293
+ )
294
+ property_ = self._visit_property(
295
+ property_name=property_name,
296
+ before_property=before_property,
297
+ after_property=after_property,
298
+ )
299
+ properties.append(property_)
300
+ # TODO: compute the properties change type properly.
301
+ if property_.change_type != ChangeType.UNCHANGED:
302
+ change_type = change_type.MODIFIED
303
+ return NodeProperties(change_type=change_type, properties=properties)
304
+
305
+ def _visit_resource(
306
+ self, resource_name: str, before_resource: Maybe[dict], after_resource: Maybe[dict]
307
+ ) -> NodeResource:
308
+ if self._is_created(before=before_resource, after=after_resource):
309
+ change_type = ChangeType.CREATED
310
+ elif self._is_removed(before=before_resource, after=after_resource):
311
+ change_type = ChangeType.REMOVED
312
+ else:
313
+ change_type = ChangeType.UNCHANGED
314
+
315
+ before_properties, after_properties = self._sample_from(
316
+ PropertiesKey, before_resource, after_resource
317
+ )
318
+ properties = self._visit_properties(
319
+ before_properties=before_properties, after_properties=after_properties
320
+ )
321
+
322
+ if change_type == ChangeType.UNCHANGED and properties.change_type != ChangeType.UNCHANGED:
323
+ change_type = ChangeType.MODIFIED
324
+
325
+ return NodeResource(
326
+ change_type=change_type,
327
+ name=resource_name,
328
+ # TODO: investigate behaviour with type changes, for now this is filler code.
329
+ type_=TerminalValueUnchanged(value="<Type>"),
330
+ properties=properties,
331
+ )
332
+
333
+ def _visit_resources(
334
+ self, before_resources: Maybe[dict], after_resources: Maybe[dict]
335
+ ) -> NodeResources:
336
+ # TODO: investigate type changes behavior.
337
+ change_type = ChangeType.UNCHANGED
338
+ resources: list[NodeResource] = list()
339
+ resource_names = self._keys_of(before_resources, after_resources)
340
+ for resource_name in resource_names:
341
+ before_resource, after_resource = self._sample_from(
342
+ resource_name, before_resources, after_resources
343
+ )
344
+ resource = self._visit_resource(
345
+ resource_name=resource_name,
346
+ before_resource=before_resource,
347
+ after_resource=after_resource,
348
+ )
349
+ resources.append(resource)
350
+ # TODO: compute the properties change type properly.
351
+ if resource.change_type != ChangeType.UNCHANGED:
352
+ change_type = ChangeType.MODIFIED
353
+ return NodeResources(change_type=change_type, resources=resources)
354
+
355
+ def _model(self, before_template: Maybe[dict], after_template: Maybe[dict]) -> NodeTemplate:
356
+ # TODO: visit other child types
357
+ before_resources, after_resources = self._sample_from(
358
+ ResourcesKey, before_template, after_template
359
+ )
360
+ resources = self._visit_resources(
361
+ before_resources=before_resources, after_resources=after_resources
362
+ )
363
+ # TODO: what is a change type for templates?
364
+ return NodeTemplate(change_type=resources.change_type, resources=resources)
365
+
366
+ @staticmethod
367
+ def _sample_from(key: str, *objects: Maybe[dict]) -> Maybe[Any]:
368
+ results = list()
369
+ for obj in objects:
370
+ # TODO: raise errors if not dict
371
+ if not isinstance(obj, NothingType):
372
+ results.append(obj.get(key, Nothing))
373
+ else:
374
+ results.append(obj)
375
+ return results[0] if len(objects) == 1 else tuple(results)
376
+
377
+ @staticmethod
378
+ def _keys_of(*objects: Maybe[dict]) -> set[str]:
379
+ keys: set[str] = set()
380
+ for obj in objects:
381
+ # TODO: raise errors if not dict
382
+ if isinstance(obj, dict):
383
+ keys.update(obj.keys())
384
+ return set(keys)
385
+
386
+ @staticmethod
387
+ def _is_terminal(value: Any) -> bool:
388
+ return type(value) in {int, float, bool, str, None}
389
+
390
+ @staticmethod
391
+ def _is_object(value: Any) -> bool:
392
+ return isinstance(value, dict)
393
+
394
+ @staticmethod
395
+ def _is_array(value: Any) -> bool:
396
+ return isinstance(value, list)
397
+
398
+ @staticmethod
399
+ def _is_created(before: Maybe[Any], after: Maybe[Any]) -> bool:
400
+ return isinstance(before, NothingType) and not isinstance(after, NothingType)
401
+
402
+ @staticmethod
403
+ def _is_removed(before: Maybe[Any], after: Maybe[Any]) -> bool:
404
+ return not isinstance(before, NothingType) and isinstance(after, NothingType)
@@ -0,0 +1,154 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ from typing import Any, Optional
5
+
6
+ from localstack.aws.api.cloudformation import ChangeAction, ResourceChange
7
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
8
+ ChangeSetEntity,
9
+ ChangeType,
10
+ NodeArray,
11
+ NodeObject,
12
+ NodeProperties,
13
+ NodeResource,
14
+ NodeResources,
15
+ TerminalValueCreated,
16
+ TerminalValueModified,
17
+ TerminalValueRemoved,
18
+ TerminalValueUnchanged,
19
+ )
20
+ from localstack.services.cloudformation.engine.v2.change_set_model_visitor import (
21
+ ChangeSetModelVisitor,
22
+ )
23
+
24
+
25
+ class DescribeUnit(abc.ABC):
26
+ before_context: Optional[Any] = None
27
+ after_context: Optional[Any] = None
28
+
29
+ def __init__(self, before_context: Optional[Any] = None, after_context: Optional[Any] = None):
30
+ self.before_context = before_context
31
+ self.after_context = after_context
32
+
33
+
34
+ class ChangeSetModelDescriber(ChangeSetModelVisitor):
35
+ resource_changes: list[ResourceChange] = list()
36
+
37
+ def __init__(self):
38
+ self.resource_changes = list()
39
+
40
+ def visit(self, change_set_entity: ChangeSetEntity) -> DescribeUnit:
41
+ # Overridden for the return type-hints.
42
+ return super().visit(change_set_entity=change_set_entity)
43
+
44
+ def visit_terminal_value_modified(
45
+ self, terminal_value_modified: TerminalValueModified
46
+ ) -> DescribeUnit:
47
+ return DescribeUnit(
48
+ before_context=terminal_value_modified.value,
49
+ after_context=terminal_value_modified.modified_value,
50
+ )
51
+
52
+ def visit_terminal_value_created(
53
+ self, terminal_value_created: TerminalValueCreated
54
+ ) -> DescribeUnit:
55
+ return DescribeUnit(after_context=terminal_value_created.value)
56
+
57
+ def visit_terminal_value_removed(
58
+ self, terminal_value_removed: TerminalValueRemoved
59
+ ) -> DescribeUnit:
60
+ return DescribeUnit(before_context=terminal_value_removed.value)
61
+
62
+ def visit_terminal_value_unchanged(
63
+ self, terminal_value_unchanged: TerminalValueUnchanged
64
+ ) -> DescribeUnit:
65
+ return DescribeUnit(before_context=terminal_value_unchanged.value)
66
+
67
+ def visit_node_object(self, node_object: NodeObject) -> DescribeUnit:
68
+ before_context = dict()
69
+ after_context = dict()
70
+ for name, change_set_entity in node_object.bindings.items():
71
+ describe_unit: DescribeUnit = self.visit(change_set_entity=change_set_entity)
72
+ match change_set_entity.change_type:
73
+ case ChangeType.MODIFIED:
74
+ before_context[name] = describe_unit.before_context
75
+ after_context[name] = describe_unit.after_context
76
+ case ChangeType.CREATED:
77
+ after_context[name] = describe_unit.after_context
78
+ case ChangeType.REMOVED:
79
+ before_context[name] = describe_unit.before_context
80
+ return DescribeUnit(before_context=before_context, after_context=after_context)
81
+
82
+ def visit_node_array(self, node_array: NodeArray) -> DescribeUnit:
83
+ before_context = list()
84
+ after_context = list()
85
+ for change_set_entity in node_array.array:
86
+ describe_unit: DescribeUnit = self.visit(change_set_entity=change_set_entity)
87
+ match change_set_entity.change_type:
88
+ case ChangeType.MODIFIED:
89
+ before_context.append(describe_unit.before_context)
90
+ after_context.append(describe_unit.after_context)
91
+ case ChangeType.CREATED:
92
+ after_context.append(describe_unit.after_context)
93
+ case ChangeType.REMOVED:
94
+ before_context.append(describe_unit.before_context)
95
+ case ChangeType.UNCHANGED:
96
+ before_context.append(describe_unit.before_context)
97
+ after_context.append(describe_unit.before_context)
98
+ return DescribeUnit(before_context=before_context, after_context=after_context)
99
+
100
+ def visit_node_properties(self, node_properties: NodeProperties) -> DescribeUnit:
101
+ before_context: dict[str, Any] = dict()
102
+ after_context: dict[str, Any] = dict()
103
+ for node_property in node_properties.properties:
104
+ if node_property.change_type == ChangeType.UNCHANGED:
105
+ continue
106
+ describe_unit = self.visit(node_property.value)
107
+ property_name = node_property.name
108
+ match node_property.change_type:
109
+ case ChangeType.MODIFIED:
110
+ before_context[property_name] = describe_unit.before_context
111
+ after_context[property_name] = describe_unit.after_context
112
+ case ChangeType.CREATED:
113
+ after_context[property_name] = describe_unit.after_context
114
+ case ChangeType.REMOVED:
115
+ before_context[property_name] = describe_unit.before_context
116
+ # TODO: this object can probably be well-typed instead of a free dict(?)
117
+ before_context = {"Properties": before_context}
118
+ after_context = {"Properties": after_context}
119
+ return DescribeUnit(before_context=before_context, after_context=after_context)
120
+
121
+ def visit_node_resource(self, node_resource: NodeResource) -> DescribeUnit:
122
+ resource_change = ResourceChange()
123
+ resource_change["LogicalResourceId"] = node_resource.name
124
+
125
+ # TODO: investigate effects on type changes
126
+ type_describe_unit = self.visit(node_resource.type_)
127
+ resource_change["ResourceType"] = (
128
+ type_describe_unit.before_context or type_describe_unit.after_context
129
+ )
130
+
131
+ properties_describe_unit = self.visit_node_properties(node_resource.properties)
132
+ match node_resource.change_type:
133
+ case ChangeType.MODIFIED:
134
+ resource_change["Action"] = ChangeAction.Modify
135
+ resource_change["BeforeContext"] = properties_describe_unit.before_context
136
+ resource_change["AfterContext"] = properties_describe_unit.after_context
137
+ case ChangeType.CREATED:
138
+ resource_change["Action"] = ChangeAction.Add
139
+ resource_change["AfterContext"] = properties_describe_unit.after_context
140
+ case ChangeType.REMOVED:
141
+ resource_change["Action"] = ChangeAction.Remove
142
+ resource_change["BeforeContext"] = properties_describe_unit.before_context
143
+
144
+ self.resource_changes.append(resource_change)
145
+
146
+ # TODO
147
+ return None
148
+
149
+ def visit_node_resources(self, node_resources: NodeResources) -> DescribeUnit:
150
+ for node_resource in node_resources.resources:
151
+ if node_resource.change_type != ChangeType.UNCHANGED:
152
+ self.visit_node_resource(node_resource=node_resource)
153
+ # TODO
154
+ return None
@@ -0,0 +1,70 @@
1
+ import abc
2
+
3
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
4
+ ChangeSetEntity,
5
+ NodeArray,
6
+ NodeObject,
7
+ NodeProperties,
8
+ NodeProperty,
9
+ NodeResource,
10
+ NodeResources,
11
+ NodeTemplate,
12
+ TerminalValueCreated,
13
+ TerminalValueModified,
14
+ TerminalValueRemoved,
15
+ TerminalValueUnchanged,
16
+ )
17
+ from localstack.utils.strings import camel_to_snake_case
18
+
19
+
20
+ class ChangeSetModelVisitor(abc.ABC):
21
+ # TODO: this class should be auto generated.
22
+
23
+ # TODO: add visitors for abstract classes so shared logic can be implemented
24
+ # just once in classes extending this.
25
+
26
+ def visit(self, change_set_entity: ChangeSetEntity):
27
+ # TODO: speed up this lookup logic
28
+ type_str = change_set_entity.__class__.__name__
29
+ type_str = camel_to_snake_case(type_str)
30
+ visit_function_name = f"visit_{type_str}"
31
+ visit_function = getattr(self, visit_function_name)
32
+ return visit_function(change_set_entity)
33
+
34
+ def visit_children(self, change_set_entity: ChangeSetEntity):
35
+ children = change_set_entity.get_children()
36
+ for child in children:
37
+ self.visit(child)
38
+
39
+ def visit_node_template(self, node_template: NodeTemplate):
40
+ self.visit_children(node_template)
41
+
42
+ def visit_node_resources(self, node_resources: NodeResources):
43
+ self.visit_children(node_resources)
44
+
45
+ def visit_node_resource(self, node_resource: NodeResource):
46
+ self.visit_children(node_resource)
47
+
48
+ def visit_node_properties(self, node_properties: NodeProperties):
49
+ self.visit_children(node_properties)
50
+
51
+ def visit_node_property(self, node_property: NodeProperty):
52
+ self.visit_children(node_property)
53
+
54
+ def visit_node_object(self, node_object: NodeObject):
55
+ self.visit_children(node_object)
56
+
57
+ def visit_node_array(self, node_array: NodeArray):
58
+ self.visit_children(node_array)
59
+
60
+ def visit_terminal_value_modified(self, terminal_value_modified: TerminalValueModified):
61
+ self.visit_children(terminal_value_modified)
62
+
63
+ def visit_terminal_value_created(self, terminal_value_created: TerminalValueCreated):
64
+ self.visit_children(terminal_value_created)
65
+
66
+ def visit_terminal_value_removed(self, terminal_value_removed: TerminalValueRemoved):
67
+ self.visit_children(terminal_value_removed)
68
+
69
+ def visit_terminal_value_unchanged(self, terminal_value_unchanged: TerminalValueUnchanged):
70
+ self.visit_children(terminal_value_unchanged)
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.2.1.dev38'
21
- __version_tuple__ = version_tuple = (4, 2, 1, 'dev38')
20
+ __version__ = version = '4.2.1.dev39'
21
+ __version_tuple__ = version_tuple = (4, 2, 1, 'dev39')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: localstack-core
3
- Version: 4.2.1.dev38
3
+ Version: 4.2.1.dev39
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  Project-URL: Homepage, https://localstack.cloud
@@ -3,7 +3,7 @@ localstack/constants.py,sha256=bBh6djh4x37MrS8az8LizX_APMZ56XdtJHCnZdOnmeg,6867
3
3
  localstack/deprecations.py,sha256=t3zeaZaHhKYM8snP1wRZhpvAy6MbB12Vqv5hK78bwJ0,15162
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
- localstack/version.py,sha256=hibNwXB6fRHN_vVxbBi_1JkKSsqTw37JWvmKZ5hr374,526
6
+ localstack/version.py,sha256=Y2BbxjFfXKnE1C55MbSG__6Lr3IXtRBkIrKn5ty7htE,526
7
7
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
9
9
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -306,6 +306,10 @@ localstack/services/cloudformation/engine/transformers.py,sha256=IJugwthJfzQMwFj
306
306
  localstack/services/cloudformation/engine/types.py,sha256=YIhmTrO__obIviYvzzCovKoDzu4F0JiDP4pmrYQtKV4,1518
307
307
  localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
308
308
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
309
+ localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=N_s6OUwWDa9CxEDqTNa1jFjSTMbw9HgkBFDiQqTIp3c,14893
311
+ localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=dMDDjXdsOrVFcpWx3VM5Rk0Uj0HcT7IpQiZB7oIODyQ,6801
312
+ localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=Ajw6wtiNCkx9PJmuOWcRzxnsEEQgVWqbclWqI7QBGvk,2491
309
313
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
310
314
  localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
311
315
  localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py,sha256=Grn3dP1jANRlVO9HyKQV5GHv0x1eNRBeaIYhgn-FKv4,2812
@@ -1259,13 +1263,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1259
1263
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1260
1264
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1261
1265
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1262
- localstack_core-4.2.1.dev38.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1263
- localstack_core-4.2.1.dev38.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1264
- localstack_core-4.2.1.dev38.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1265
- localstack_core-4.2.1.dev38.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1266
- localstack_core-4.2.1.dev38.dist-info/METADATA,sha256=cucZG5kP4UffMziF37q8tlyxTsU4Fccrd-BdYxXvKds,5481
1267
- localstack_core-4.2.1.dev38.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1268
- localstack_core-4.2.1.dev38.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1269
- localstack_core-4.2.1.dev38.dist-info/plux.json,sha256=cqYrXa-KmYs2xesE7iL8J2wBN-1vKleIuF7vEIHSXhU,20710
1270
- localstack_core-4.2.1.dev38.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1271
- localstack_core-4.2.1.dev38.dist-info/RECORD,,
1266
+ localstack_core-4.2.1.dev39.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1267
+ localstack_core-4.2.1.dev39.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1268
+ localstack_core-4.2.1.dev39.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1269
+ localstack_core-4.2.1.dev39.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1270
+ localstack_core-4.2.1.dev39.dist-info/METADATA,sha256=BkTDTuzGQ6rHbcP-XooQatIM2tqQ9glmuBr-pa4WeI0,5481
1271
+ localstack_core-4.2.1.dev39.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1272
+ localstack_core-4.2.1.dev39.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1273
+ localstack_core-4.2.1.dev39.dist-info/plux.json,sha256=b_JlUBdxTV9NQKXt8h_1ZLgerKwwl21ab6QValmPGCM,20710
1274
+ localstack_core-4.2.1.dev39.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1275
+ localstack_core-4.2.1.dev39.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_start": ["delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_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", "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", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger"], "localstack.cloudformation.resource_providers": ["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::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "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::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "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::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "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::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin"], "localstack.hooks.on_infra_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "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", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.packages": ["vosk/community=localstack.services.transcribe.plugins:vosk_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package"], "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.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::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::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "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::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "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::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "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::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "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::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "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::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin"], "localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_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_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_start": ["register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "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", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings"], "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", "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.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "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"]}