localstack-core 4.7.1.dev22__py3-none-any.whl → 4.7.1.dev23__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/change_set_model.py +24 -3
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +53 -71
- localstack/services/cloudformation/v2/entities.py +51 -30
- localstack/services/cloudformation/v2/provider.py +146 -20
- localstack/testing/pytest/cloudformation/fixtures.py +10 -1
- localstack/version.py +2 -2
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/METADATA +1 -1
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/RECORD +16 -16
- localstack_core-4.7.1.dev23.dist-info/plux.json +1 -0
- localstack_core-4.7.1.dev22.dist-info/plux.json +0 -1
- {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev23.data}/scripts/localstack +0 -0
- {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev23.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev23.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/WHEEL +0 -0
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/top_level.txt +0 -0
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import abc
|
|
4
4
|
import enum
|
|
5
5
|
from itertools import zip_longest
|
|
6
|
-
from typing import Any, Final, Generator, Optional, TypedDict, Union, cast
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Final, Generator, Optional, TypedDict, Union, cast
|
|
7
7
|
|
|
8
8
|
from typing_extensions import TypeVar
|
|
9
9
|
|
|
@@ -11,6 +11,9 @@ from localstack.aws.api.cloudformation import ChangeAction
|
|
|
11
11
|
from localstack.services.cloudformation.resource_provider import ResourceProviderExecutor
|
|
12
12
|
from localstack.utils.strings import camel_to_snake_case
|
|
13
13
|
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from localstack.services.cloudformation.v2.entities import EngineParameter
|
|
16
|
+
|
|
14
17
|
T = TypeVar("T")
|
|
15
18
|
|
|
16
19
|
|
|
@@ -536,13 +539,14 @@ class ChangeSetModel:
|
|
|
536
539
|
before_template: Optional[dict],
|
|
537
540
|
after_template: Optional[dict],
|
|
538
541
|
before_parameters: Optional[dict],
|
|
539
|
-
after_parameters: Optional[dict],
|
|
542
|
+
after_parameters: Optional[dict[str, EngineParameter]],
|
|
540
543
|
):
|
|
541
544
|
self._before_template = before_template or Nothing
|
|
542
545
|
self._after_template = after_template or Nothing
|
|
543
546
|
self._before_parameters = before_parameters or Nothing
|
|
544
547
|
self._after_parameters = after_parameters or Nothing
|
|
545
548
|
self._visited_scopes = dict()
|
|
549
|
+
# TODO: move this modeling process to the `get_update_model` method as constructors shouldn't do work
|
|
546
550
|
self._node_template = self._model(
|
|
547
551
|
before_template=self._before_template, after_template=self._after_template
|
|
548
552
|
)
|
|
@@ -1008,9 +1012,26 @@ class ChangeSetModel:
|
|
|
1008
1012
|
|
|
1009
1013
|
def _visit_dynamic_parameter(self, parameter_name: str) -> ChangeSetEntity:
|
|
1010
1014
|
scope = Scope("Dynamic").open_scope("Parameters")
|
|
1011
|
-
scope_parameter, (
|
|
1015
|
+
scope_parameter, (before_parameter_dct, after_parameter_dct) = self._safe_access_in(
|
|
1012
1016
|
scope, parameter_name, self._before_parameters, self._after_parameters
|
|
1013
1017
|
)
|
|
1018
|
+
|
|
1019
|
+
before_parameter = Nothing
|
|
1020
|
+
if not is_nothing(before_parameter_dct):
|
|
1021
|
+
before_parameter = (
|
|
1022
|
+
before_parameter_dct.get("resolved_value")
|
|
1023
|
+
or before_parameter_dct["given_value"]
|
|
1024
|
+
or before_parameter_dct.get("default_value")
|
|
1025
|
+
)
|
|
1026
|
+
|
|
1027
|
+
after_parameter = Nothing
|
|
1028
|
+
if not is_nothing(after_parameter_dct):
|
|
1029
|
+
after_parameter = (
|
|
1030
|
+
after_parameter_dct.get("resolved_value")
|
|
1031
|
+
or after_parameter_dct["given_value"]
|
|
1032
|
+
or after_parameter_dct.get("default_value")
|
|
1033
|
+
)
|
|
1034
|
+
|
|
1014
1035
|
parameter = self._visit_value(
|
|
1015
1036
|
scope=scope_parameter, before_value=before_parameter, after_value=after_parameter
|
|
1016
1037
|
)
|
|
@@ -14,12 +14,10 @@ from localstack.aws.api.cloudformation import (
|
|
|
14
14
|
from localstack.constants import INTERNAL_AWS_SECRET_ACCESS_KEY
|
|
15
15
|
from localstack.services.cloudformation.analytics import track_resource_operation
|
|
16
16
|
from localstack.services.cloudformation.deployment_utils import log_not_available_message
|
|
17
|
-
from localstack.services.cloudformation.engine.parameters import resolve_ssm_parameter
|
|
18
17
|
from localstack.services.cloudformation.engine.template_deployer import REGEX_OUTPUT_APIGATEWAY
|
|
19
18
|
from localstack.services.cloudformation.engine.v2.change_set_model import (
|
|
20
19
|
NodeDependsOn,
|
|
21
20
|
NodeOutput,
|
|
22
|
-
NodeParameter,
|
|
23
21
|
NodeResource,
|
|
24
22
|
TerminalValueCreated,
|
|
25
23
|
TerminalValueModified,
|
|
@@ -52,7 +50,6 @@ EventOperationFromAction = {"Add": "CREATE", "Modify": "UPDATE", "Remove": "DELE
|
|
|
52
50
|
@dataclass
|
|
53
51
|
class ChangeSetModelExecutorResult:
|
|
54
52
|
resources: dict[str, ResolvedResource]
|
|
55
|
-
parameters: dict
|
|
56
53
|
outputs: dict
|
|
57
54
|
exports: dict
|
|
58
55
|
|
|
@@ -65,7 +62,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
65
62
|
# TODO: add typing for resolved resources and parameters.
|
|
66
63
|
resources: Final[dict[str, ResolvedResource]]
|
|
67
64
|
outputs: Final[dict]
|
|
68
|
-
resolved_parameters: Final[dict]
|
|
69
65
|
exports: Final[dict]
|
|
70
66
|
_deferred_actions: list[DeferredAction]
|
|
71
67
|
|
|
@@ -73,7 +69,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
73
69
|
super().__init__(change_set=change_set)
|
|
74
70
|
self.resources = dict()
|
|
75
71
|
self.outputs = dict()
|
|
76
|
-
self.resolved_parameters = dict()
|
|
77
72
|
self.exports = dict()
|
|
78
73
|
self._deferred_actions = list()
|
|
79
74
|
self.resource_provider_executor = ResourceProviderExecutor(
|
|
@@ -96,7 +91,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
96
91
|
|
|
97
92
|
return ChangeSetModelExecutorResult(
|
|
98
93
|
resources=self.resources,
|
|
99
|
-
parameters=self.resolved_parameters,
|
|
100
94
|
outputs=self.outputs,
|
|
101
95
|
exports=self.exports,
|
|
102
96
|
)
|
|
@@ -104,29 +98,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
104
98
|
def _defer_action(self, action: DeferredAction):
|
|
105
99
|
self._deferred_actions.append(action)
|
|
106
100
|
|
|
107
|
-
def visit_node_parameter(self, node_parameter: NodeParameter) -> PreprocEntityDelta:
|
|
108
|
-
delta = super().visit_node_parameter(node_parameter)
|
|
109
|
-
|
|
110
|
-
# handle dynamic references, e.g. references to SSM parameters
|
|
111
|
-
# TODO: support more parameter types
|
|
112
|
-
parameter_type: str = node_parameter.type_.value
|
|
113
|
-
if parameter_type.startswith("AWS::SSM"):
|
|
114
|
-
if parameter_type in [
|
|
115
|
-
"AWS::SSM::Parameter::Value<String>",
|
|
116
|
-
"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
|
|
117
|
-
"AWS::SSM::Parameter::Value<CommaDelimitedList>",
|
|
118
|
-
]:
|
|
119
|
-
delta.after = resolve_ssm_parameter(
|
|
120
|
-
account_id=self._change_set.account_id,
|
|
121
|
-
region_name=self._change_set.region_name,
|
|
122
|
-
stack_parameter_value=delta.after,
|
|
123
|
-
)
|
|
124
|
-
else:
|
|
125
|
-
raise Exception(f"Unsupported stack parameter type: {parameter_type}")
|
|
126
|
-
|
|
127
|
-
self.resolved_parameters[node_parameter.name] = delta.after
|
|
128
|
-
return delta
|
|
129
|
-
|
|
130
101
|
def _get_physical_id(self, logical_resource_id, strict: bool = True) -> str | None:
|
|
131
102
|
physical_resource_id = None
|
|
132
103
|
try:
|
|
@@ -147,12 +118,13 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
147
118
|
|
|
148
119
|
def _process_event(
|
|
149
120
|
self,
|
|
121
|
+
*,
|
|
150
122
|
action: ChangeAction,
|
|
151
123
|
logical_resource_id,
|
|
152
124
|
event_status: OperationStatus,
|
|
125
|
+
resource_type: str,
|
|
153
126
|
special_action: str = None,
|
|
154
127
|
reason: str = None,
|
|
155
|
-
resource_type=None,
|
|
156
128
|
):
|
|
157
129
|
status_from_action = special_action or EventOperationFromAction[action.value]
|
|
158
130
|
if event_status == OperationStatus.SUCCESS:
|
|
@@ -162,7 +134,7 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
162
134
|
|
|
163
135
|
self._change_set.stack.set_resource_status(
|
|
164
136
|
logical_resource_id=logical_resource_id,
|
|
165
|
-
physical_resource_id=self._get_physical_id(logical_resource_id, False),
|
|
137
|
+
physical_resource_id=self._get_physical_id(logical_resource_id, False) or "",
|
|
166
138
|
resource_type=resource_type,
|
|
167
139
|
status=ResourceStatus(status),
|
|
168
140
|
resource_status_reason=reason,
|
|
@@ -216,11 +188,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
216
188
|
delta = super().visit_node_resource(node_resource=node_resource)
|
|
217
189
|
except Exception as e:
|
|
218
190
|
self._process_event(
|
|
219
|
-
node_resource.change_type.to_change_action(),
|
|
220
|
-
node_resource.name,
|
|
221
|
-
OperationStatus.FAILED,
|
|
222
|
-
reason=str(e),
|
|
191
|
+
action=node_resource.change_type.to_change_action(),
|
|
192
|
+
logical_resource_id=node_resource.name,
|
|
193
|
+
event_status=OperationStatus.FAILED,
|
|
223
194
|
resource_type=node_resource.type_.value,
|
|
195
|
+
reason=str(e),
|
|
224
196
|
)
|
|
225
197
|
raise e
|
|
226
198
|
|
|
@@ -275,7 +247,12 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
275
247
|
# XXX hacky, stick the previous resources' properties into the payload
|
|
276
248
|
before_properties = self._merge_before_properties(name, before)
|
|
277
249
|
|
|
278
|
-
self._process_event(
|
|
250
|
+
self._process_event(
|
|
251
|
+
action=ChangeAction.Modify,
|
|
252
|
+
logical_resource_id=name,
|
|
253
|
+
event_status=OperationStatus.IN_PROGRESS,
|
|
254
|
+
resource_type=before.resource_type,
|
|
255
|
+
)
|
|
279
256
|
if after.requires_replacement:
|
|
280
257
|
event = self._execute_resource_action(
|
|
281
258
|
action=ChangeAction.Add,
|
|
@@ -285,15 +262,20 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
285
262
|
after_properties=after.properties,
|
|
286
263
|
)
|
|
287
264
|
self._process_event(
|
|
288
|
-
ChangeAction.Modify,
|
|
289
|
-
name,
|
|
290
|
-
event.status,
|
|
291
|
-
reason=event.message,
|
|
265
|
+
action=ChangeAction.Modify,
|
|
266
|
+
logical_resource_id=name,
|
|
267
|
+
event_status=event.status,
|
|
292
268
|
resource_type=before.resource_type,
|
|
269
|
+
reason=event.message,
|
|
293
270
|
)
|
|
294
271
|
|
|
295
272
|
def cleanup():
|
|
296
|
-
self._process_event(
|
|
273
|
+
self._process_event(
|
|
274
|
+
action=ChangeAction.Remove,
|
|
275
|
+
logical_resource_id=name,
|
|
276
|
+
event_status=OperationStatus.IN_PROGRESS,
|
|
277
|
+
resource_type=before.resource_type,
|
|
278
|
+
)
|
|
297
279
|
event = self._execute_resource_action(
|
|
298
280
|
action=ChangeAction.Remove,
|
|
299
281
|
logical_resource_id=name,
|
|
@@ -302,11 +284,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
302
284
|
after_properties=None,
|
|
303
285
|
)
|
|
304
286
|
self._process_event(
|
|
305
|
-
ChangeAction.Remove,
|
|
306
|
-
name,
|
|
307
|
-
event.status,
|
|
308
|
-
reason=event.message,
|
|
287
|
+
action=ChangeAction.Remove,
|
|
288
|
+
logical_resource_id=name,
|
|
289
|
+
event_status=event.status,
|
|
309
290
|
resource_type=before.resource_type,
|
|
291
|
+
reason=event.message,
|
|
310
292
|
)
|
|
311
293
|
|
|
312
294
|
self._defer_action(cleanup)
|
|
@@ -319,11 +301,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
319
301
|
after_properties=after.properties,
|
|
320
302
|
)
|
|
321
303
|
self._process_event(
|
|
322
|
-
ChangeAction.Modify,
|
|
323
|
-
name,
|
|
324
|
-
event.status,
|
|
325
|
-
reason=event.message,
|
|
304
|
+
action=ChangeAction.Modify,
|
|
305
|
+
logical_resource_id=name,
|
|
306
|
+
event_status=event.status,
|
|
326
307
|
resource_type=before.resource_type,
|
|
308
|
+
reason=event.message,
|
|
327
309
|
)
|
|
328
310
|
# Case: type migration.
|
|
329
311
|
# TODO: Add test to assert that on type change the resources are replaced.
|
|
@@ -341,11 +323,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
341
323
|
after_properties=None,
|
|
342
324
|
)
|
|
343
325
|
self._process_event(
|
|
344
|
-
ChangeAction.Modify,
|
|
345
|
-
name,
|
|
346
|
-
event.status,
|
|
347
|
-
reason=event.message,
|
|
326
|
+
action=ChangeAction.Modify,
|
|
327
|
+
logical_resource_id=name,
|
|
328
|
+
event_status=event.status,
|
|
348
329
|
resource_type=before.resource_type,
|
|
330
|
+
reason=event.message,
|
|
349
331
|
)
|
|
350
332
|
|
|
351
333
|
self._defer_action(perform_deletion)
|
|
@@ -358,11 +340,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
358
340
|
after_properties=after.properties,
|
|
359
341
|
)
|
|
360
342
|
self._process_event(
|
|
361
|
-
ChangeAction.Modify,
|
|
362
|
-
name,
|
|
363
|
-
event.status,
|
|
364
|
-
reason=event.message,
|
|
343
|
+
action=ChangeAction.Modify,
|
|
344
|
+
logical_resource_id=name,
|
|
345
|
+
event_status=event.status,
|
|
365
346
|
resource_type=before.resource_type,
|
|
347
|
+
reason=event.message,
|
|
366
348
|
)
|
|
367
349
|
elif not is_nothing(before):
|
|
368
350
|
# Case: removal
|
|
@@ -372,10 +354,10 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
372
354
|
|
|
373
355
|
def perform_deletion():
|
|
374
356
|
self._process_event(
|
|
375
|
-
ChangeAction.Remove,
|
|
376
|
-
name,
|
|
377
|
-
OperationStatus.IN_PROGRESS,
|
|
357
|
+
action=ChangeAction.Remove,
|
|
358
|
+
logical_resource_id=name,
|
|
378
359
|
resource_type=before.resource_type,
|
|
360
|
+
event_status=OperationStatus.IN_PROGRESS,
|
|
379
361
|
)
|
|
380
362
|
event = self._execute_resource_action(
|
|
381
363
|
action=ChangeAction.Remove,
|
|
@@ -385,20 +367,20 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
385
367
|
after_properties=None,
|
|
386
368
|
)
|
|
387
369
|
self._process_event(
|
|
388
|
-
ChangeAction.Remove,
|
|
389
|
-
name,
|
|
390
|
-
event.status,
|
|
391
|
-
reason=event.message,
|
|
370
|
+
action=ChangeAction.Remove,
|
|
371
|
+
logical_resource_id=name,
|
|
372
|
+
event_status=event.status,
|
|
392
373
|
resource_type=before.resource_type,
|
|
374
|
+
reason=event.message,
|
|
393
375
|
)
|
|
394
376
|
|
|
395
377
|
self._defer_action(perform_deletion)
|
|
396
378
|
elif not is_nothing(after):
|
|
397
379
|
# Case: addition
|
|
398
380
|
self._process_event(
|
|
399
|
-
ChangeAction.Add,
|
|
400
|
-
name,
|
|
401
|
-
OperationStatus.IN_PROGRESS,
|
|
381
|
+
action=ChangeAction.Add,
|
|
382
|
+
logical_resource_id=name,
|
|
383
|
+
event_status=OperationStatus.IN_PROGRESS,
|
|
402
384
|
resource_type=after.resource_type,
|
|
403
385
|
)
|
|
404
386
|
event = self._execute_resource_action(
|
|
@@ -409,11 +391,11 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
|
|
|
409
391
|
after_properties=after.properties,
|
|
410
392
|
)
|
|
411
393
|
self._process_event(
|
|
412
|
-
ChangeAction.Add,
|
|
413
|
-
name,
|
|
414
|
-
event.status,
|
|
415
|
-
reason=event.message,
|
|
394
|
+
action=ChangeAction.Add,
|
|
395
|
+
logical_resource_id=name,
|
|
396
|
+
event_status=event.status,
|
|
416
397
|
resource_type=after.resource_type,
|
|
398
|
+
reason=event.message,
|
|
417
399
|
)
|
|
418
400
|
|
|
419
401
|
def _merge_before_properties(
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import copy
|
|
2
1
|
from datetime import datetime, timezone
|
|
3
2
|
from typing import NotRequired, Optional, TypedDict
|
|
4
3
|
|
|
@@ -11,7 +10,6 @@ from localstack.aws.api.cloudformation import (
|
|
|
11
10
|
CreateStackSetInput,
|
|
12
11
|
ExecutionStatus,
|
|
13
12
|
Output,
|
|
14
|
-
Parameter,
|
|
15
13
|
ResourceStatus,
|
|
16
14
|
StackDriftInformation,
|
|
17
15
|
StackDriftStatus,
|
|
@@ -24,6 +22,9 @@ from localstack.aws.api.cloudformation import (
|
|
|
24
22
|
StackStatus,
|
|
25
23
|
StackStatusReason,
|
|
26
24
|
)
|
|
25
|
+
from localstack.aws.api.cloudformation import (
|
|
26
|
+
Parameter as ApiParameter,
|
|
27
|
+
)
|
|
27
28
|
from localstack.aws.api.cloudformation import (
|
|
28
29
|
Stack as ApiStack,
|
|
29
30
|
)
|
|
@@ -38,6 +39,18 @@ from localstack.utils.aws import arns
|
|
|
38
39
|
from localstack.utils.strings import long_uid, short_uid
|
|
39
40
|
|
|
40
41
|
|
|
42
|
+
# TODO: turn into class/dataclass
|
|
43
|
+
class EngineParameter(TypedDict):
|
|
44
|
+
"""
|
|
45
|
+
Parameters supplied by the user. The resolved value field is populated by the engine
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
type_: str
|
|
49
|
+
given_value: NotRequired[str | None]
|
|
50
|
+
resolved_value: NotRequired[str | None]
|
|
51
|
+
default_value: NotRequired[str | None]
|
|
52
|
+
|
|
53
|
+
|
|
41
54
|
class ResolvedResource(TypedDict):
|
|
42
55
|
LogicalResourceId: str
|
|
43
56
|
Type: str
|
|
@@ -49,7 +62,7 @@ class ResolvedResource(TypedDict):
|
|
|
49
62
|
|
|
50
63
|
class Stack:
|
|
51
64
|
stack_name: str
|
|
52
|
-
parameters: list[
|
|
65
|
+
parameters: list[ApiParameter]
|
|
53
66
|
change_set_id: str | None
|
|
54
67
|
status: StackStatus
|
|
55
68
|
status_reason: StackStatusReason | None
|
|
@@ -60,6 +73,7 @@ class Stack:
|
|
|
60
73
|
capabilities: list[Capability]
|
|
61
74
|
enable_termination_protection: bool
|
|
62
75
|
processed_template: dict | None
|
|
76
|
+
template_body: str | None
|
|
63
77
|
|
|
64
78
|
# state after deploy
|
|
65
79
|
resolved_parameters: dict[str, str]
|
|
@@ -73,15 +87,10 @@ class Stack:
|
|
|
73
87
|
account_id: str,
|
|
74
88
|
region_name: str,
|
|
75
89
|
request_payload: CreateChangeSetInput | CreateStackInput,
|
|
76
|
-
template: dict | None = None,
|
|
77
|
-
template_body: str | None = None,
|
|
78
90
|
initial_status: StackStatus = StackStatus.CREATE_IN_PROGRESS,
|
|
79
91
|
):
|
|
80
92
|
self.account_id = account_id
|
|
81
93
|
self.region_name = region_name
|
|
82
|
-
self.template = template
|
|
83
|
-
self.template_original = copy.deepcopy(self.template)
|
|
84
|
-
self.template_body = template_body
|
|
85
94
|
self.status = initial_status
|
|
86
95
|
self.status_reason = None
|
|
87
96
|
self.change_set_ids = []
|
|
@@ -90,6 +99,7 @@ class Stack:
|
|
|
90
99
|
self.change_set_id = None
|
|
91
100
|
self.enable_termination_protection = False
|
|
92
101
|
self.processed_template = None
|
|
102
|
+
self.template_body = None
|
|
93
103
|
|
|
94
104
|
self.stack_name = request_payload["StackName"]
|
|
95
105
|
self.parameters = request_payload.get("Parameters", [])
|
|
@@ -119,7 +129,13 @@ class Stack:
|
|
|
119
129
|
if reason:
|
|
120
130
|
self.status_reason = reason
|
|
121
131
|
|
|
122
|
-
self._store_event(
|
|
132
|
+
self._store_event(
|
|
133
|
+
resource_id=self.stack_name,
|
|
134
|
+
resource_type="AWS::CloudFormation::Stack",
|
|
135
|
+
physical_resource_id=self.stack_id,
|
|
136
|
+
status=status,
|
|
137
|
+
status_reason=reason,
|
|
138
|
+
)
|
|
123
139
|
|
|
124
140
|
def set_resource_status(
|
|
125
141
|
self,
|
|
@@ -148,34 +164,34 @@ class Stack:
|
|
|
148
164
|
self.resource_states.pop(logical_resource_id)
|
|
149
165
|
else:
|
|
150
166
|
self.resource_states[logical_resource_id] = resource_description
|
|
151
|
-
|
|
167
|
+
|
|
168
|
+
self._store_event(
|
|
169
|
+
resource_id=logical_resource_id,
|
|
170
|
+
resource_type=resource_type,
|
|
171
|
+
physical_resource_id=physical_resource_id,
|
|
172
|
+
status=status,
|
|
173
|
+
status_reason=resource_status_reason,
|
|
174
|
+
)
|
|
152
175
|
|
|
153
176
|
def _store_event(
|
|
154
177
|
self,
|
|
155
178
|
resource_id: str = None,
|
|
156
|
-
|
|
157
|
-
|
|
179
|
+
resource_type: str | None = "",
|
|
180
|
+
physical_resource_id: str = None,
|
|
181
|
+
status: StackStatus | ResourceStatus = "",
|
|
158
182
|
status_reason: str = "",
|
|
159
183
|
):
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
self.
|
|
164
|
-
.
|
|
165
|
-
|
|
184
|
+
event = StackEvent(
|
|
185
|
+
EventId=long_uid(),
|
|
186
|
+
Timestamp=datetime.now(tz=timezone.utc),
|
|
187
|
+
StackId=self.stack_id,
|
|
188
|
+
StackName=self.stack_name,
|
|
189
|
+
LogicalResourceId=resource_id,
|
|
190
|
+
PhysicalResourceId=physical_resource_id,
|
|
191
|
+
ResourceStatus=status,
|
|
192
|
+
ResourceType=resource_type,
|
|
166
193
|
)
|
|
167
194
|
|
|
168
|
-
event: StackEvent = {
|
|
169
|
-
"EventId": long_uid(),
|
|
170
|
-
"Timestamp": datetime.now(tz=timezone.utc),
|
|
171
|
-
"StackId": self.stack_id,
|
|
172
|
-
"StackName": self.stack_name,
|
|
173
|
-
"LogicalResourceId": resource_id,
|
|
174
|
-
"PhysicalResourceId": physical_res_id,
|
|
175
|
-
"ResourceStatus": status,
|
|
176
|
-
"ResourceType": resource_type,
|
|
177
|
-
}
|
|
178
|
-
|
|
179
195
|
if status_reason:
|
|
180
196
|
event["ResourceStatusReason"] = status_reason
|
|
181
197
|
|
|
@@ -200,7 +216,6 @@ class Stack:
|
|
|
200
216
|
"Tags": [],
|
|
201
217
|
"NotificationARNs": [],
|
|
202
218
|
"Capabilities": self.capabilities,
|
|
203
|
-
"Parameters": self.parameters,
|
|
204
219
|
}
|
|
205
220
|
# TODO: confirm the logic for this
|
|
206
221
|
if change_set_id := self.change_set_id:
|
|
@@ -238,20 +253,25 @@ class ChangeSet:
|
|
|
238
253
|
status_reason: str | None
|
|
239
254
|
execution_status: ExecutionStatus
|
|
240
255
|
creation_time: datetime
|
|
256
|
+
processed_template: dict | None
|
|
257
|
+
resolved_parameters: list[ApiParameter]
|
|
241
258
|
|
|
242
259
|
def __init__(
|
|
243
260
|
self,
|
|
244
261
|
stack: Stack,
|
|
245
262
|
request_payload: ChangeSetRequestPayload,
|
|
263
|
+
template_body: str,
|
|
246
264
|
template: dict | None = None,
|
|
247
265
|
):
|
|
248
266
|
self.stack = stack
|
|
267
|
+
self.template_body = template_body
|
|
249
268
|
self.template = template
|
|
250
269
|
self.status = ChangeSetStatus.CREATE_IN_PROGRESS
|
|
251
270
|
self.status_reason = None
|
|
252
271
|
self.execution_status = ExecutionStatus.AVAILABLE
|
|
253
272
|
self.update_model = None
|
|
254
273
|
self.creation_time = datetime.now(tz=timezone.utc)
|
|
274
|
+
self.resolved_parameters = []
|
|
255
275
|
|
|
256
276
|
self.change_set_name = request_payload["ChangeSetName"]
|
|
257
277
|
self.change_set_type = request_payload.get("ChangeSetType", ChangeSetType.UPDATE)
|
|
@@ -261,6 +281,7 @@ class ChangeSet:
|
|
|
261
281
|
account_id=self.stack.account_id,
|
|
262
282
|
region_name=self.stack.region_name,
|
|
263
283
|
)
|
|
284
|
+
self.processed_template = None
|
|
264
285
|
|
|
265
286
|
def set_update_model(self, update_model: UpdateModel) -> None:
|
|
266
287
|
self.update_model = update_model
|
|
@@ -48,12 +48,15 @@ from localstack.aws.api.cloudformation import (
|
|
|
48
48
|
ListStacksOutput,
|
|
49
49
|
LogicalResourceId,
|
|
50
50
|
NextToken,
|
|
51
|
+
Output,
|
|
51
52
|
Parameter,
|
|
52
53
|
PhysicalResourceId,
|
|
53
54
|
RetainExceptOnCreate,
|
|
54
55
|
RetainResources,
|
|
55
56
|
RoleARN,
|
|
56
57
|
RollbackConfiguration,
|
|
58
|
+
StackDriftInformation,
|
|
59
|
+
StackDriftStatus,
|
|
57
60
|
StackName,
|
|
58
61
|
StackNameOrId,
|
|
59
62
|
StackResourceDetail,
|
|
@@ -70,9 +73,13 @@ from localstack.aws.api.cloudformation import (
|
|
|
70
73
|
UpdateStackOutput,
|
|
71
74
|
UpdateTerminationProtectionOutput,
|
|
72
75
|
)
|
|
76
|
+
from localstack.aws.api.cloudformation import (
|
|
77
|
+
Stack as ApiStack,
|
|
78
|
+
)
|
|
73
79
|
from localstack.aws.connect import connect_to
|
|
74
80
|
from localstack.services.cloudformation import api_utils
|
|
75
81
|
from localstack.services.cloudformation.engine import template_preparer
|
|
82
|
+
from localstack.services.cloudformation.engine.parameters import resolve_ssm_parameter
|
|
76
83
|
from localstack.services.cloudformation.engine.v2.change_set_model import (
|
|
77
84
|
ChangeSetModel,
|
|
78
85
|
ChangeType,
|
|
@@ -101,7 +108,13 @@ from localstack.services.cloudformation.stores import (
|
|
|
101
108
|
CloudFormationStore,
|
|
102
109
|
get_cloudformation_store,
|
|
103
110
|
)
|
|
104
|
-
from localstack.services.cloudformation.v2.entities import
|
|
111
|
+
from localstack.services.cloudformation.v2.entities import (
|
|
112
|
+
ChangeSet,
|
|
113
|
+
EngineParameter,
|
|
114
|
+
Stack,
|
|
115
|
+
StackInstance,
|
|
116
|
+
StackSet,
|
|
117
|
+
)
|
|
105
118
|
from localstack.utils.collections import select_attributes
|
|
106
119
|
from localstack.utils.strings import short_uid
|
|
107
120
|
from localstack.utils.threads import start_worker_thread
|
|
@@ -195,7 +208,48 @@ def find_stack_instance(stack_set: StackSet, account: str, region: str) -> Stack
|
|
|
195
208
|
|
|
196
209
|
class CloudformationProviderV2(CloudformationProvider):
|
|
197
210
|
@staticmethod
|
|
211
|
+
def _resolve_parameters(
|
|
212
|
+
template: Optional[dict], parameters: Optional[dict], account_id: str, region_name: str
|
|
213
|
+
) -> dict[str, EngineParameter]:
|
|
214
|
+
template_parameters = template.get("Parameters", {})
|
|
215
|
+
resolved_parameters = {}
|
|
216
|
+
for name, parameter in template_parameters.items():
|
|
217
|
+
given_value = parameters.get(name)
|
|
218
|
+
default_value = parameter.get("Default")
|
|
219
|
+
resolved_parameter = EngineParameter(
|
|
220
|
+
type_=parameter["Type"], given_value=given_value, default_value=default_value
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
if parameter["Type"] == "AWS::SSM::Parameter::Value<String>":
|
|
224
|
+
# TODO: support other parameter types
|
|
225
|
+
try:
|
|
226
|
+
resolved_parameter["resolved_value"] = resolve_ssm_parameter(
|
|
227
|
+
account_id, region_name, given_value or default_value
|
|
228
|
+
)
|
|
229
|
+
except Exception:
|
|
230
|
+
raise ValidationError(
|
|
231
|
+
f"Parameter {name} should either have input value or default value"
|
|
232
|
+
)
|
|
233
|
+
elif given_value is None and default_value is None:
|
|
234
|
+
raise ValidationError(f"Parameters: [{name}] must have values")
|
|
235
|
+
|
|
236
|
+
resolved_parameters[name] = resolved_parameter
|
|
237
|
+
|
|
238
|
+
for name, parameter in resolved_parameters.items():
|
|
239
|
+
if (
|
|
240
|
+
parameter.get("resolved_value") is None
|
|
241
|
+
and parameter.get("given_value") is None
|
|
242
|
+
and parameter.get("default_value") is None
|
|
243
|
+
):
|
|
244
|
+
raise ValidationError(
|
|
245
|
+
f"Parameter {name} should either have input value or default value"
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
return resolved_parameters
|
|
249
|
+
|
|
250
|
+
@classmethod
|
|
198
251
|
def _setup_change_set_model(
|
|
252
|
+
cls,
|
|
199
253
|
change_set: ChangeSet,
|
|
200
254
|
before_template: Optional[dict],
|
|
201
255
|
after_template: Optional[dict],
|
|
@@ -203,12 +257,23 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
203
257
|
after_parameters: Optional[dict],
|
|
204
258
|
previous_update_model: Optional[UpdateModel],
|
|
205
259
|
):
|
|
260
|
+
resolved_parameters = None
|
|
261
|
+
if after_parameters is not None:
|
|
262
|
+
resolved_parameters = cls._resolve_parameters(
|
|
263
|
+
after_template,
|
|
264
|
+
after_parameters,
|
|
265
|
+
change_set.stack.account_id,
|
|
266
|
+
change_set.stack.region_name,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
change_set.resolved_parameters = resolved_parameters
|
|
270
|
+
|
|
206
271
|
# Create and preprocess the update graph for this template update.
|
|
207
272
|
change_set_model = ChangeSetModel(
|
|
208
273
|
before_template=before_template,
|
|
209
274
|
after_template=after_template,
|
|
210
275
|
before_parameters=before_parameters,
|
|
211
|
-
after_parameters=
|
|
276
|
+
after_parameters=resolved_parameters,
|
|
212
277
|
)
|
|
213
278
|
raw_update_model: UpdateModel = change_set_model.get_update_model()
|
|
214
279
|
# If there exists an update model which operated in the 'before' version of this change set,
|
|
@@ -223,7 +288,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
223
288
|
change_set_model_transform = ChangeSetModelTransform(
|
|
224
289
|
change_set=change_set,
|
|
225
290
|
before_parameters=before_parameters,
|
|
226
|
-
after_parameters=
|
|
291
|
+
after_parameters=resolved_parameters,
|
|
227
292
|
before_template=before_template,
|
|
228
293
|
after_template=after_template,
|
|
229
294
|
)
|
|
@@ -236,7 +301,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
236
301
|
before_template=transformed_before_template,
|
|
237
302
|
after_template=transformed_after_template,
|
|
238
303
|
before_parameters=before_parameters,
|
|
239
|
-
after_parameters=
|
|
304
|
+
after_parameters=resolved_parameters,
|
|
240
305
|
)
|
|
241
306
|
update_model = change_set_model.get_update_model()
|
|
242
307
|
# Bring the cache for the previous operations forward in the update graph for this version
|
|
@@ -253,7 +318,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
253
318
|
validator.validate()
|
|
254
319
|
|
|
255
320
|
change_set.set_update_model(update_model)
|
|
256
|
-
change_set.
|
|
321
|
+
change_set.processed_template = transformed_after_template
|
|
257
322
|
|
|
258
323
|
@handler("CreateChangeSet", expand=False)
|
|
259
324
|
def create_change_set(
|
|
@@ -310,8 +375,6 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
310
375
|
account_id=context.account_id,
|
|
311
376
|
region_name=context.region,
|
|
312
377
|
request_payload=request,
|
|
313
|
-
template=structured_template,
|
|
314
|
-
template_body=template_body,
|
|
315
378
|
initial_status=StackStatus.REVIEW_IN_PROGRESS,
|
|
316
379
|
)
|
|
317
380
|
state.stacks_v2[stack.stack_id] = stack
|
|
@@ -378,7 +441,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
378
441
|
pass
|
|
379
442
|
|
|
380
443
|
# create change set for the stack and apply changes
|
|
381
|
-
change_set = ChangeSet(stack, request, template=after_template)
|
|
444
|
+
change_set = ChangeSet(stack, request, template=after_template, template_body=template_body)
|
|
382
445
|
self._setup_change_set_model(
|
|
383
446
|
change_set=change_set,
|
|
384
447
|
before_template=before_template,
|
|
@@ -458,13 +521,15 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
458
521
|
change_set.stack.set_stack_status(new_stack_status)
|
|
459
522
|
change_set.set_execution_status(ExecutionStatus.EXECUTE_COMPLETE)
|
|
460
523
|
change_set.stack.resolved_resources = result.resources
|
|
461
|
-
change_set.stack.resolved_parameters =
|
|
524
|
+
change_set.stack.resolved_parameters = change_set.resolved_parameters
|
|
462
525
|
change_set.stack.resolved_outputs = result.outputs
|
|
463
526
|
change_set.stack.resolved_exports = result.exports
|
|
464
527
|
|
|
465
528
|
# if the deployment succeeded, update the stack's template representation to that
|
|
466
529
|
# which was just deployed
|
|
467
530
|
change_set.stack.template = change_set.template
|
|
531
|
+
change_set.stack.processed_template = change_set.processed_template
|
|
532
|
+
change_set.stack.template_body = change_set.template_body
|
|
468
533
|
except Exception as e:
|
|
469
534
|
LOG.error(
|
|
470
535
|
"Execute change set failed: %s", e, exc_info=LOG.isEnabledFor(logging.WARNING)
|
|
@@ -507,7 +572,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
507
572
|
Parameters=[
|
|
508
573
|
# TODO: add masking support.
|
|
509
574
|
Parameter(ParameterKey=key, ParameterValue=value)
|
|
510
|
-
for (key, value) in change_set.
|
|
575
|
+
for (key, value) in change_set.resolved_parameters.items()
|
|
511
576
|
],
|
|
512
577
|
Changes=changes,
|
|
513
578
|
Capabilities=change_set.stack.capabilities,
|
|
@@ -603,8 +668,6 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
603
668
|
account_id=context.account_id,
|
|
604
669
|
region_name=context.region,
|
|
605
670
|
request_payload=request,
|
|
606
|
-
template=structured_template,
|
|
607
|
-
template_body=template_body,
|
|
608
671
|
)
|
|
609
672
|
# TODO: what is the correct initial status?
|
|
610
673
|
state.stacks_v2[stack.stack_id] = stack
|
|
@@ -626,6 +689,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
626
689
|
stack,
|
|
627
690
|
{"ChangeSetName": f"cs-{stack_name}-create", "ChangeSetType": ChangeSetType.CREATE},
|
|
628
691
|
template=after_template,
|
|
692
|
+
template_body=template_body,
|
|
629
693
|
)
|
|
630
694
|
self._setup_change_set_model(
|
|
631
695
|
change_set=change_set,
|
|
@@ -645,11 +709,12 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
645
709
|
result = change_set_executor.execute()
|
|
646
710
|
stack.set_stack_status(StackStatus.CREATE_COMPLETE)
|
|
647
711
|
stack.resolved_resources = result.resources
|
|
648
|
-
stack.resolved_parameters = result.parameters
|
|
649
712
|
stack.resolved_outputs = result.outputs
|
|
650
713
|
# if the deployment succeeded, update the stack's template representation to that
|
|
651
714
|
# which was just deployed
|
|
652
715
|
stack.template = change_set.template
|
|
716
|
+
stack.template_body = change_set.template_body
|
|
717
|
+
stack.resolved_parameters = change_set.resolved_parameters
|
|
653
718
|
except Exception as e:
|
|
654
719
|
LOG.error(
|
|
655
720
|
"Create Stack set failed: %s", e, exc_info=LOG.isEnabledFor(logging.WARNING)
|
|
@@ -679,11 +744,68 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
679
744
|
**kwargs,
|
|
680
745
|
) -> DescribeStacksOutput:
|
|
681
746
|
state = get_cloudformation_store(context.account_id, context.region)
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
747
|
+
if stack_name:
|
|
748
|
+
stack = find_stack_v2(state, stack_name)
|
|
749
|
+
if not stack:
|
|
750
|
+
raise StackNotFoundError(stack_name)
|
|
751
|
+
stacks = [stack]
|
|
752
|
+
else:
|
|
753
|
+
stacks = state.stacks_v2.values()
|
|
754
|
+
|
|
755
|
+
describe_stack_output: list[ApiStack] = []
|
|
756
|
+
for stack in stacks:
|
|
757
|
+
stack_description = ApiStack(
|
|
758
|
+
CreationTime=stack.creation_time,
|
|
759
|
+
DeletionTime=stack.deletion_time,
|
|
760
|
+
StackId=stack.stack_id,
|
|
761
|
+
StackName=stack.stack_name,
|
|
762
|
+
StackStatus=stack.status,
|
|
763
|
+
StackStatusReason=stack.status_reason,
|
|
764
|
+
# fake values
|
|
765
|
+
DisableRollback=False,
|
|
766
|
+
DriftInformation=StackDriftInformation(
|
|
767
|
+
StackDriftStatus=StackDriftStatus.NOT_CHECKED
|
|
768
|
+
),
|
|
769
|
+
EnableTerminationProtection=stack.enable_termination_protection,
|
|
770
|
+
LastUpdatedTime=stack.creation_time,
|
|
771
|
+
RollbackConfiguration=RollbackConfiguration(),
|
|
772
|
+
Tags=[],
|
|
773
|
+
NotificationARNs=[],
|
|
774
|
+
Capabilities=stack.capabilities,
|
|
775
|
+
# "Parameters": stack.resolved_parameters,
|
|
776
|
+
)
|
|
777
|
+
# TODO: confirm the logic for this
|
|
778
|
+
if change_set_id := stack.change_set_id:
|
|
779
|
+
stack_description["ChangeSetId"] = change_set_id
|
|
780
|
+
|
|
781
|
+
if stack.resolved_parameters:
|
|
782
|
+
stack_description["Parameters"] = []
|
|
783
|
+
for name, resolved_parameter in stack.resolved_parameters.items():
|
|
784
|
+
parameter = Parameter(
|
|
785
|
+
ParameterKey=name,
|
|
786
|
+
ParameterValue=resolved_parameter.get("given_value")
|
|
787
|
+
or resolved_parameter.get("default_value"),
|
|
788
|
+
)
|
|
789
|
+
if resolved_value := resolved_parameter.get("resolved_value"):
|
|
790
|
+
parameter["ResolvedValue"] = resolved_value
|
|
791
|
+
stack_description["Parameters"].append(parameter)
|
|
792
|
+
|
|
793
|
+
if stack.resolved_outputs:
|
|
794
|
+
describe_outputs = []
|
|
795
|
+
for key, value in stack.resolved_outputs.items():
|
|
796
|
+
describe_outputs.append(
|
|
797
|
+
Output(
|
|
798
|
+
# TODO(parity): Description, ExportName
|
|
799
|
+
# TODO(parity): what happens on describe stack when the stack has not been deployed yet?
|
|
800
|
+
OutputKey=key,
|
|
801
|
+
OutputValue=value,
|
|
802
|
+
)
|
|
803
|
+
)
|
|
804
|
+
stack_description["Outputs"] = describe_outputs
|
|
805
|
+
|
|
806
|
+
describe_stack_output.append(stack_description)
|
|
807
|
+
|
|
808
|
+
return DescribeStacksOutput(Stacks=describe_stack_output)
|
|
687
809
|
|
|
688
810
|
@handler("ListStacks")
|
|
689
811
|
def list_stacks(
|
|
@@ -1192,6 +1314,7 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
1192
1314
|
change_set = ChangeSet(
|
|
1193
1315
|
stack,
|
|
1194
1316
|
{"ChangeSetName": f"cs-{stack_name}-create", "ChangeSetType": ChangeSetType.CREATE},
|
|
1317
|
+
template_body=template_body,
|
|
1195
1318
|
template=after_template,
|
|
1196
1319
|
)
|
|
1197
1320
|
self._setup_change_set_model(
|
|
@@ -1217,11 +1340,12 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
1217
1340
|
result = change_set_executor.execute()
|
|
1218
1341
|
stack.set_stack_status(StackStatus.UPDATE_COMPLETE)
|
|
1219
1342
|
stack.resolved_resources = result.resources
|
|
1220
|
-
stack.resolved_parameters = result.parameters
|
|
1221
1343
|
stack.resolved_outputs = result.outputs
|
|
1222
1344
|
# if the deployment succeeded, update the stack's template representation to that
|
|
1223
1345
|
# which was just deployed
|
|
1224
1346
|
stack.template = change_set.template
|
|
1347
|
+
stack.template_body = change_set.template_body
|
|
1348
|
+
stack.resolved_parameters = change_set.resolved_parameters
|
|
1225
1349
|
except Exception as e:
|
|
1226
1350
|
LOG.error("Update Stack failed: %s", e, exc_info=LOG.isEnabledFor(logging.WARNING))
|
|
1227
1351
|
stack.set_stack_status(StackStatus.UPDATE_FAILED)
|
|
@@ -1261,7 +1385,9 @@ class CloudformationProviderV2(CloudformationProvider):
|
|
|
1261
1385
|
previous_update_model = previous_change_set.update_model
|
|
1262
1386
|
|
|
1263
1387
|
# create a dummy change set
|
|
1264
|
-
change_set = ChangeSet(
|
|
1388
|
+
change_set = ChangeSet(
|
|
1389
|
+
stack, {"ChangeSetName": f"delete-stack_{stack.stack_name}"}, template_body=""
|
|
1390
|
+
) # noqa
|
|
1265
1391
|
self._setup_change_set_model(
|
|
1266
1392
|
change_set=change_set,
|
|
1267
1393
|
before_template=stack.template,
|
|
@@ -126,7 +126,12 @@ def capture_update_process(aws_client_no_retry, cleanups, capture_per_resource_e
|
|
|
126
126
|
change_set_name = f"cs-{short_uid()}"
|
|
127
127
|
|
|
128
128
|
def inner(
|
|
129
|
-
snapshot,
|
|
129
|
+
snapshot,
|
|
130
|
+
t1: dict | str,
|
|
131
|
+
t2: dict | str,
|
|
132
|
+
p1: dict | None = None,
|
|
133
|
+
p2: dict | None = None,
|
|
134
|
+
custom_update_step: Callable[[], None] | None = None,
|
|
130
135
|
) -> str:
|
|
131
136
|
"""
|
|
132
137
|
:return: stack id
|
|
@@ -209,6 +214,10 @@ def capture_update_process(aws_client_no_retry, cleanups, capture_per_resource_e
|
|
|
209
214
|
]
|
|
210
215
|
snapshot.match("post-create-1-describe", describe)
|
|
211
216
|
|
|
217
|
+
# run any custom steps if present
|
|
218
|
+
if custom_update_step:
|
|
219
|
+
custom_update_step()
|
|
220
|
+
|
|
212
221
|
# update stack
|
|
213
222
|
change_set_details = aws_client_no_retry.cloudformation.create_change_set(
|
|
214
223
|
StackName=stack_name,
|
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.7.1.
|
|
21
|
-
__version_tuple__ = version_tuple = (4, 7, 1, '
|
|
20
|
+
__version__ = version = '4.7.1.dev23'
|
|
21
|
+
__version_tuple__ = version_tuple = (4, 7, 1, 'dev23')
|
|
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
|
|
|
4
4
|
localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
|
|
5
5
|
localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
|
|
6
6
|
localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
-
localstack/version.py,sha256=
|
|
7
|
+
localstack/version.py,sha256=Z9wy-Q_vnRw4U8mUuQtNTZcyUCrMkRRJu-hMUH0Avqk,526
|
|
8
8
|
localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
|
|
10
10
|
localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
|
|
@@ -311,9 +311,9 @@ localstack/services/cloudformation/engine/types.py,sha256=YIhmTrO__obIviYvzzCovK
|
|
|
311
311
|
localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
|
|
312
312
|
localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
|
|
313
313
|
localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
314
|
-
localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=
|
|
314
|
+
localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=xKzTlQ1t4-BL0esy9tN-1b41sVwaimmUCDayWKN9JiI,58226
|
|
315
315
|
localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=ZGJIj5Q9wrwZJSAPCBKQuQA2r5EEDrDlu-tmyHHqYa0,10429
|
|
316
|
-
localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256
|
|
316
|
+
localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=-nijld8CeShxGrA0S45Ah-qJmzJVNNL0CK4XtLo8k_Y,25854
|
|
317
317
|
localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=iC1-ecnA0yWVhPOyBaZFpVToS5m33NtPKaSGGTc8HTw,50843
|
|
318
318
|
localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=qZz3TcfLnuBkp5HvpkmWxqIYJKNvlEqsQZ5WYVekBZ8,13417
|
|
319
319
|
localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=NfS6TxbmMSXLbqba4be6wyWMgCGiQhsbqJ-9r49D_-E,2044
|
|
@@ -336,8 +336,8 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
|
|
|
336
336
|
localstack/services/cloudformation/scaffolding/__main__.py,sha256=lshYhoz-xAFleqE75cDG1hwsfGT9ohP30ODAIHd9bx4,30960
|
|
337
337
|
localstack/services/cloudformation/scaffolding/propgen.py,sha256=9YsSCkDegcU_Yp8Sfw8eNV26N5ibOlLC6Hg6lxPeBBM,7949
|
|
338
338
|
localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
339
|
-
localstack/services/cloudformation/v2/entities.py,sha256=
|
|
340
|
-
localstack/services/cloudformation/v2/provider.py,sha256=
|
|
339
|
+
localstack/services/cloudformation/v2/entities.py,sha256=aMmNyt17QGUa1VFke5NEyAZWYOI13O0L-offSWdRfiQ,10998
|
|
340
|
+
localstack/services/cloudformation/v2/provider.py,sha256=WLM6yidckmfuf_VMLTypf6ihykpOoZOHuEzbVnfNQfA,58681
|
|
341
341
|
localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
|
|
342
342
|
localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
343
343
|
localstack/services/cloudwatch/alarm_scheduler.py,sha256=XFllg0gI_WNV7cNxOcgXifzmbNA07OPpuEUuf37keP4,15663
|
|
@@ -1183,7 +1183,7 @@ localstack/testing/pytest/path_filter.py,sha256=U1V5qy23H7yZ6Tznr-MdveeH7TvCM_u4
|
|
|
1183
1183
|
localstack/testing/pytest/util.py,sha256=TQAAb_Cj5gTSX0VkenAbSabvyCkl7THxEj70PrT_H7Y,941
|
|
1184
1184
|
localstack/testing/pytest/validation_tracking.py,sha256=zGYn2r2n1xEe2Xq2JLPhS5dQJ9s29pIQEFpiF7ifehM,5630
|
|
1185
1185
|
localstack/testing/pytest/cloudformation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1186
|
-
localstack/testing/pytest/cloudformation/fixtures.py,sha256=
|
|
1186
|
+
localstack/testing/pytest/cloudformation/fixtures.py,sha256=BYjWX1NYiFJU8kLzuCU1BtJVlJxwxCPSHq9UpqgI7Qg,10520
|
|
1187
1187
|
localstack/testing/pytest/stepfunctions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1188
1188
|
localstack/testing/pytest/stepfunctions/fixtures.py,sha256=m9gdU7opK1LoDKuUDTJKcuUfWi4LWHw0idL0_GNlkfo,32817
|
|
1189
1189
|
localstack/testing/pytest/stepfunctions/utils.py,sha256=L_Zc6-iDC76E5JsGAXltBIi_ZB3-vrCBTGcOcmfEO3g,32819
|
|
@@ -1285,13 +1285,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
|
|
|
1285
1285
|
localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1286
1286
|
localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
|
|
1287
1287
|
localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
|
|
1288
|
-
localstack_core-4.7.1.
|
|
1289
|
-
localstack_core-4.7.1.
|
|
1290
|
-
localstack_core-4.7.1.
|
|
1291
|
-
localstack_core-4.7.1.
|
|
1292
|
-
localstack_core-4.7.1.
|
|
1293
|
-
localstack_core-4.7.1.
|
|
1294
|
-
localstack_core-4.7.1.
|
|
1295
|
-
localstack_core-4.7.1.
|
|
1296
|
-
localstack_core-4.7.1.
|
|
1297
|
-
localstack_core-4.7.1.
|
|
1288
|
+
localstack_core-4.7.1.dev23.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
|
|
1289
|
+
localstack_core-4.7.1.dev23.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
|
|
1290
|
+
localstack_core-4.7.1.dev23.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
|
|
1291
|
+
localstack_core-4.7.1.dev23.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
|
|
1292
|
+
localstack_core-4.7.1.dev23.dist-info/METADATA,sha256=XAqsKlcotuUuc-KVdo81ySF_MIwTGv7nFbwBYDhxPo0,5570
|
|
1293
|
+
localstack_core-4.7.1.dev23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1294
|
+
localstack_core-4.7.1.dev23.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
|
|
1295
|
+
localstack_core-4.7.1.dev23.dist-info/plux.json,sha256=tGtLb2SkHlnzUugbj2RH-ePo6fRuX_9elRK0xqUFunA,20891
|
|
1296
|
+
localstack_core-4.7.1.dev23.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
|
|
1297
|
+
localstack_core-4.7.1.dev23.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"localstack.hooks.on_infra_start": ["register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "eager_load_services=localstack.services.plugins:eager_load_services", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info"], "localstack.cloudformation.resource_providers": ["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::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "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::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.packages": ["vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.hooks.on_infra_shutdown": ["publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "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"], "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"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"localstack.cloudformation.resource_providers": ["AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "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::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "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::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "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::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "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::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin"], "localstack.packages": ["vosk/community=localstack.services.transcribe.plugins:vosk_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_shutdown": ["run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics"], "localstack.hooks.on_infra_start": ["setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "eager_load_services=localstack.services.plugins:eager_load_services", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"]}
|
|
File without changes
|
{localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev23.data}/scripts/localstack-supervisor
RENAMED
|
File without changes
|
{localstack_core-4.7.1.dev22.data → localstack_core-4.7.1.dev23.data}/scripts/localstack.bat
RENAMED
|
File without changes
|
|
File without changes
|
{localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|
{localstack_core-4.7.1.dev22.dist-info → localstack_core-4.7.1.dev23.dist-info}/top_level.txt
RENAMED
|
File without changes
|