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.
- localstack/services/cloudformation/engine/v2/__init__.py +0 -0
- localstack/services/cloudformation/engine/v2/change_set_model.py +404 -0
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +154 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +70 -0
- localstack/version.py +2 -2
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/METADATA +1 -1
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/RECORD +15 -11
- localstack_core-4.2.1.dev39.dist-info/plux.json +1 -0
- localstack_core-4.2.1.dev38.dist-info/plux.json +0 -1
- {localstack_core-4.2.1.dev38.data → localstack_core-4.2.1.dev39.data}/scripts/localstack +0 -0
- {localstack_core-4.2.1.dev38.data → localstack_core-4.2.1.dev39.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.2.1.dev38.data → localstack_core-4.2.1.dev39.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/LICENSE.txt +0 -0
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/WHEEL +0 -0
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/top_level.txt +0 -0
|
File without changes
|
|
@@ -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.
|
|
21
|
-
__version_tuple__ = version_tuple = (4, 2, 1, '
|
|
20
|
+
__version__ = version = '4.2.1.dev39'
|
|
21
|
+
__version_tuple__ = version_tuple = (4, 2, 1, 'dev39')
|
|
@@ -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=
|
|
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.
|
|
1263
|
-
localstack_core-4.2.1.
|
|
1264
|
-
localstack_core-4.2.1.
|
|
1265
|
-
localstack_core-4.2.1.
|
|
1266
|
-
localstack_core-4.2.1.
|
|
1267
|
-
localstack_core-4.2.1.
|
|
1268
|
-
localstack_core-4.2.1.
|
|
1269
|
-
localstack_core-4.2.1.
|
|
1270
|
-
localstack_core-4.2.1.
|
|
1271
|
-
localstack_core-4.2.1.
|
|
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"]}
|
|
File without changes
|
{localstack_core-4.2.1.dev38.data → localstack_core-4.2.1.dev39.data}/scripts/localstack-supervisor
RENAMED
|
File without changes
|
{localstack_core-4.2.1.dev38.data → localstack_core-4.2.1.dev39.data}/scripts/localstack.bat
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{localstack_core-4.2.1.dev38.dist-info → localstack_core-4.2.1.dev39.dist-info}/top_level.txt
RENAMED
|
File without changes
|