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.
@@ -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, (before_parameter, after_parameter) = self._safe_access_in(
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(ChangeAction.Modify, name, OperationStatus.IN_PROGRESS)
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(ChangeAction.Remove, name, OperationStatus.IN_PROGRESS)
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[Parameter]
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(self.stack_name, self.stack_id, status.value, status_reason=reason)
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
- self._store_event(logical_resource_id, physical_resource_id, status, resource_status_reason)
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
- physical_res_id: str = None,
157
- status: str = "",
179
+ resource_type: str | None = "",
180
+ physical_resource_id: str = None,
181
+ status: StackStatus | ResourceStatus = "",
158
182
  status_reason: str = "",
159
183
  ):
160
- resource_id = resource_id
161
- physical_res_id = physical_res_id
162
- resource_type = (
163
- self.template.get("Resources", {})
164
- .get(resource_id, {})
165
- .get("Type", "AWS::CloudFormation::Stack")
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 ChangeSet, Stack, StackInstance, StackSet
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=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=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=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.stack.processed_template = transformed_after_template
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 = result.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.stack.resolved_parameters.items()
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
- stack = find_stack_v2(state, stack_name)
683
- if not stack:
684
- raise StackNotFoundError(stack_name)
685
- # TODO: move describe_details method to provider
686
- return DescribeStacksOutput(Stacks=[stack.describe_details()])
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(stack, {"ChangeSetName": f"delete-stack_{stack.stack_name}"}) # noqa
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, t1: dict | str, t2: dict | str, p1: dict | None = None, p2: dict | None = None
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.dev22'
21
- __version_tuple__ = version_tuple = (4, 7, 1, 'dev22')
20
+ __version__ = version = '4.7.1.dev23'
21
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev23')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.7.1.dev22
3
+ Version: 4.7.1.dev23
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=q9DJh_WbvTYfxTNknVAcMB60v32_uk2rUtFmLzNvei0,526
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=P2-nmVzLUs2NIn-R6-z7ClWHWKbxw7zq7G82P5RFAlM,57364
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=xbqG3sa5SlFm1d36hNlv1R6OeYRyvhyInvtrIHRjVZw,26357
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=xXQ53aB_DcDlCucwe3iUFNKtasrYgFU2zyFEnXhkyQU,10487
340
- localstack/services/cloudformation/v2/provider.py,sha256=OCM1bU6fF0xNOD96XVH7gcKMVw6dyVQzB8xJWeVANuU,53437
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=1aVRYXPfP0-hLrxo5N3Il6jx0eTcXVtvzNywDhOjgis,10318
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.dev22.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1289
- localstack_core-4.7.1.dev22.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1290
- localstack_core-4.7.1.dev22.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1291
- localstack_core-4.7.1.dev22.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1292
- localstack_core-4.7.1.dev22.dist-info/METADATA,sha256=EKib6Dq1aGE34FyEV-KYQa50RvzSph6lsKwhzewH_-4,5570
1293
- localstack_core-4.7.1.dev22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1294
- localstack_core-4.7.1.dev22.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1295
- localstack_core-4.7.1.dev22.dist-info/plux.json,sha256=uDMOM_MyWZTCuXd_ZHh3us6x-ZHaJd3nP9jcdPhFjk0,20891
1296
- localstack_core-4.7.1.dev22.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1297
- localstack_core-4.7.1.dev22.dist-info/RECORD,,
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"]}