localstack-core 4.2.1.dev38__py3-none-any.whl → 4.2.1.dev40__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.
@@ -353,6 +353,7 @@ VolumeId = str
353
353
  VolumeIdWithResolver = str
354
354
  VpcBlockPublicAccessExclusionId = str
355
355
  VpcCidrAssociationId = str
356
+ VpcEncryptionControlId = str
356
357
  VpcEndpointId = str
357
358
  VpcEndpointServiceId = str
358
359
  VpcFlowLogId = str
@@ -3081,6 +3082,11 @@ class ServiceConnectivityType(StrEnum):
3081
3082
  ipv6 = "ipv6"
3082
3083
 
3083
3084
 
3085
+ class ServiceManaged(StrEnum):
3086
+ alb = "alb"
3087
+ nlb = "nlb"
3088
+
3089
+
3084
3090
  class ServiceState(StrEnum):
3085
3091
  Pending = "Pending"
3086
3092
  Available = "Available"
@@ -3606,6 +3612,28 @@ class VpcCidrBlockStateCode(StrEnum):
3606
3612
  failed = "failed"
3607
3613
 
3608
3614
 
3615
+ class VpcEncryptionControlExclusionState(StrEnum):
3616
+ enabling = "enabling"
3617
+ enabled = "enabled"
3618
+ disabling = "disabling"
3619
+ disabled = "disabled"
3620
+
3621
+
3622
+ class VpcEncryptionControlMode(StrEnum):
3623
+ monitor = "monitor"
3624
+ enforce = "enforce"
3625
+
3626
+
3627
+ class VpcEncryptionControlState(StrEnum):
3628
+ enforce_in_progress = "enforce-in-progress"
3629
+ monitor_in_progress = "monitor-in-progress"
3630
+ enforce_failed = "enforce-failed"
3631
+ monitor_failed = "monitor-failed"
3632
+ deleting = "deleting"
3633
+ deleted = "deleted"
3634
+ available = "available"
3635
+
3636
+
3609
3637
  class VpcEndpointType(StrEnum):
3610
3638
  Interface = "Interface"
3611
3639
  Gateway = "Gateway"
@@ -4331,6 +4359,7 @@ class Address(TypedDict, total=False):
4331
4359
  CustomerOwnedIp: Optional[String]
4332
4360
  CustomerOwnedIpv4Pool: Optional[String]
4333
4361
  CarrierIp: Optional[String]
4362
+ ServiceManaged: Optional[ServiceManaged]
4334
4363
  InstanceId: Optional[String]
4335
4364
  PublicIp: Optional[String]
4336
4365
 
@@ -5308,6 +5337,7 @@ class AvailabilityZone(TypedDict, total=False):
5308
5337
  ZoneType: Optional[String]
5309
5338
  ParentZoneName: Optional[String]
5310
5339
  ParentZoneId: Optional[String]
5340
+ GroupLongName: Optional[String]
5311
5341
  State: Optional[AvailabilityZoneState]
5312
5342
 
5313
5343
 
@@ -5403,6 +5433,27 @@ BlockDeviceMappingList = List[BlockDeviceMapping]
5403
5433
  BlockDeviceMappingRequestList = List[BlockDeviceMapping]
5404
5434
 
5405
5435
 
5436
+ class EbsBlockDeviceResponse(TypedDict, total=False):
5437
+ Encrypted: Optional[Boolean]
5438
+ DeleteOnTermination: Optional[Boolean]
5439
+ Iops: Optional[Integer]
5440
+ Throughput: Optional[Integer]
5441
+ KmsKeyId: Optional[KmsKeyId]
5442
+ SnapshotId: Optional[SnapshotId]
5443
+ VolumeSize: Optional[Integer]
5444
+ VolumeType: Optional[VolumeType]
5445
+
5446
+
5447
+ class BlockDeviceMappingResponse(TypedDict, total=False):
5448
+ DeviceName: Optional[String]
5449
+ VirtualName: Optional[String]
5450
+ Ebs: Optional[EbsBlockDeviceResponse]
5451
+ NoDevice: Optional[String]
5452
+
5453
+
5454
+ BlockDeviceMappingResponseList = List[BlockDeviceMappingResponse]
5455
+
5456
+
5406
5457
  class BlockPublicAccessStates(TypedDict, total=False):
5407
5458
  InternetGatewayBlockMode: Optional[BlockPublicAccessMode]
5408
5459
 
@@ -6242,6 +6293,7 @@ class CopyImageRequest(ServiceRequest):
6242
6293
  DestinationOutpostArn: Optional[String]
6243
6294
  CopyImageTags: Optional[Boolean]
6244
6295
  TagSpecifications: Optional[TagSpecificationList]
6296
+ SnapshotCopyCompletionDurationMinutes: Optional[Long]
6245
6297
  DryRun: Optional[Boolean]
6246
6298
 
6247
6299
 
@@ -6511,6 +6563,29 @@ class CreateDefaultVpcRequest(ServiceRequest):
6511
6563
  DryRun: Optional[Boolean]
6512
6564
 
6513
6565
 
6566
+ class VpcEncryptionControlExclusion(TypedDict, total=False):
6567
+ State: Optional[VpcEncryptionControlExclusionState]
6568
+ StateMessage: Optional[String]
6569
+
6570
+
6571
+ class VpcEncryptionControlExclusions(TypedDict, total=False):
6572
+ InternetGateway: Optional[VpcEncryptionControlExclusion]
6573
+ EgressOnlyInternetGateway: Optional[VpcEncryptionControlExclusion]
6574
+ NatGateway: Optional[VpcEncryptionControlExclusion]
6575
+ VirtualPrivateGateway: Optional[VpcEncryptionControlExclusion]
6576
+ VpcPeering: Optional[VpcEncryptionControlExclusion]
6577
+
6578
+
6579
+ class VpcEncryptionControl(TypedDict, total=False):
6580
+ VpcId: Optional[VpcId]
6581
+ VpcEncryptionControlId: Optional[VpcEncryptionControlId]
6582
+ Mode: Optional[VpcEncryptionControlMode]
6583
+ State: Optional[VpcEncryptionControlState]
6584
+ StateMessage: Optional[String]
6585
+ ResourceExclusions: Optional[VpcEncryptionControlExclusions]
6586
+ Tags: Optional[TagList]
6587
+
6588
+
6514
6589
  VpcCidrBlockAssociationSet = List[VpcCidrBlockAssociation]
6515
6590
  VpcIpv6CidrBlockAssociationSet = List[VpcIpv6CidrBlockAssociation]
6516
6591
 
@@ -6521,6 +6596,7 @@ class Vpc(TypedDict, total=False):
6521
6596
  Ipv6CidrBlockAssociationSet: Optional[VpcIpv6CidrBlockAssociationSet]
6522
6597
  CidrBlockAssociationSet: Optional[VpcCidrBlockAssociationSet]
6523
6598
  IsDefault: Optional[Boolean]
6599
+ EncryptionControl: Optional[VpcEncryptionControl]
6524
6600
  Tags: Optional[TagList]
6525
6601
  BlockPublicAccessStates: Optional[BlockPublicAccessStates]
6526
6602
  VpcId: Optional[String]
@@ -6674,6 +6750,7 @@ class FleetLaunchTemplateOverrides(TypedDict, total=False):
6674
6750
  Placement: Optional[PlacementResponse]
6675
6751
  InstanceRequirements: Optional[InstanceRequirements]
6676
6752
  ImageId: Optional[ImageId]
6753
+ BlockDeviceMappings: Optional[BlockDeviceMappingResponseList]
6677
6754
 
6678
6755
 
6679
6756
  class FleetLaunchTemplateSpecification(TypedDict, total=False):
@@ -6775,6 +6852,27 @@ class InstanceRequirementsRequest(TypedDict, total=False):
6775
6852
  BaselinePerformanceFactors: Optional[BaselinePerformanceFactorsRequest]
6776
6853
 
6777
6854
 
6855
+ class FleetEbsBlockDeviceRequest(TypedDict, total=False):
6856
+ Encrypted: Optional[Boolean]
6857
+ DeleteOnTermination: Optional[Boolean]
6858
+ Iops: Optional[Integer]
6859
+ Throughput: Optional[Integer]
6860
+ KmsKeyId: Optional[KmsKeyId]
6861
+ SnapshotId: Optional[SnapshotId]
6862
+ VolumeSize: Optional[Integer]
6863
+ VolumeType: Optional[VolumeType]
6864
+
6865
+
6866
+ class FleetBlockDeviceMappingRequest(TypedDict, total=False):
6867
+ DeviceName: Optional[String]
6868
+ VirtualName: Optional[String]
6869
+ Ebs: Optional[FleetEbsBlockDeviceRequest]
6870
+ NoDevice: Optional[String]
6871
+
6872
+
6873
+ FleetBlockDeviceMappingRequestList = List[FleetBlockDeviceMappingRequest]
6874
+
6875
+
6778
6876
  class Placement(TypedDict, total=False):
6779
6877
  Affinity: Optional[String]
6780
6878
  GroupName: Optional[PlacementGroupName]
@@ -6795,8 +6893,9 @@ class FleetLaunchTemplateOverridesRequest(TypedDict, total=False):
6795
6893
  WeightedCapacity: Optional[Double]
6796
6894
  Priority: Optional[Double]
6797
6895
  Placement: Optional[Placement]
6896
+ BlockDeviceMappings: Optional[FleetBlockDeviceMappingRequestList]
6798
6897
  InstanceRequirements: Optional[InstanceRequirementsRequest]
6799
- ImageId: Optional[ImageId]
6898
+ ImageId: Optional[String]
6800
6899
 
6801
6900
 
6802
6901
  FleetLaunchTemplateOverridesListRequest = List[FleetLaunchTemplateOverridesRequest]
@@ -10669,6 +10768,10 @@ class DeregisterImageRequest(ServiceRequest):
10669
10768
  DryRun: Optional[Boolean]
10670
10769
 
10671
10770
 
10771
+ class DeregisterImageResult(TypedDict, total=False):
10772
+ pass
10773
+
10774
+
10672
10775
  InstanceTagKeySet = List[String]
10673
10776
 
10674
10777
 
@@ -20367,6 +20470,7 @@ class Ec2Api:
20367
20470
  destination_outpost_arn: String = None,
20368
20471
  copy_image_tags: Boolean = None,
20369
20472
  tag_specifications: TagSpecificationList = None,
20473
+ snapshot_copy_completion_duration_minutes: Long = None,
20370
20474
  dry_run: Boolean = None,
20371
20475
  **kwargs,
20372
20476
  ) -> CopyImageResult:
@@ -22425,7 +22529,7 @@ class Ec2Api:
22425
22529
  @handler("DeregisterImage")
22426
22530
  def deregister_image(
22427
22531
  self, context: RequestContext, image_id: ImageId, dry_run: Boolean = None, **kwargs
22428
- ) -> None:
22532
+ ) -> DeregisterImageResult:
22429
22533
  raise NotImplementedError
22430
22534
 
22431
22535
  @handler("DeregisterInstanceEventNotificationAttributes")
@@ -0,0 +1,404 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ import enum
5
+ from itertools import zip_longest
6
+ from typing import Any, Final, Generator, Optional, Union
7
+
8
+ from typing_extensions import TypeVar
9
+
10
+ T = TypeVar("T")
11
+
12
+
13
+ class NothingType:
14
+ """A sentinel that denotes 'no value' (distinct from None)."""
15
+
16
+ _singleton = None
17
+ __slots__ = ()
18
+
19
+ def __new__(cls):
20
+ if cls._singleton is None:
21
+ cls._singleton = super().__new__(cls)
22
+ return cls._singleton
23
+
24
+ def __str__(self):
25
+ return repr(self)
26
+
27
+ def __repr__(self) -> str:
28
+ return "Nothing"
29
+
30
+
31
+ Maybe = Union[T, NothingType]
32
+ Nothing = NothingType()
33
+
34
+
35
+ class ChangeType(enum.Enum):
36
+ UNCHANGED = "Unchanged"
37
+ CREATED = "Created"
38
+ MODIFIED = "Modified"
39
+ REMOVED = "Removed"
40
+
41
+ def __str__(self):
42
+ return self.value
43
+
44
+
45
+ class ChangeSetEntity(abc.ABC):
46
+ change_type: Final[ChangeType]
47
+
48
+ def __init__(self, change_type: ChangeType):
49
+ self.change_type = change_type
50
+
51
+ def get_children(self) -> Generator[ChangeSetEntity]:
52
+ for child in self.__dict__.values():
53
+ yield from self._get_children_in(child)
54
+
55
+ @staticmethod
56
+ def _get_children_in(obj: Any) -> Generator[ChangeSetEntity]:
57
+ # TODO: could avoid the inductive logic here, and check for loops?
58
+ if isinstance(obj, ChangeSetEntity):
59
+ yield obj
60
+ elif isinstance(obj, list):
61
+ for item in obj:
62
+ yield from ChangeSetEntity._get_children_in(item)
63
+ elif isinstance(obj, dict):
64
+ for item in obj.values():
65
+ yield from ChangeSetEntity._get_children_in(item)
66
+
67
+ def __str__(self):
68
+ return f"({self.__class__.__name__}| {vars(self)}"
69
+
70
+ def __repr__(self):
71
+ return str(self)
72
+
73
+
74
+ class ChangeSetNode(ChangeSetEntity, abc.ABC): ...
75
+
76
+
77
+ class ChangeSetTerminal(ChangeSetEntity, abc.ABC): ...
78
+
79
+
80
+ class NodeTemplate(ChangeSetNode):
81
+ resources: Final[NodeResources]
82
+
83
+ def __init__(self, change_type: ChangeType, resources: NodeResources):
84
+ super().__init__(change_type=change_type)
85
+ self.resources = resources
86
+
87
+
88
+ class NodeResources(ChangeSetNode):
89
+ resources: Final[list[NodeResource]]
90
+
91
+ def __init__(self, change_type: ChangeType, resources: list[NodeResource]):
92
+ super().__init__(change_type=change_type)
93
+ self.resources = resources
94
+
95
+
96
+ class NodeResource(ChangeSetNode):
97
+ name: Final[str]
98
+ type_: Final[ChangeSetTerminal]
99
+ properties: Final[NodeProperties]
100
+
101
+ def __init__(
102
+ self,
103
+ change_type: ChangeType,
104
+ name: str,
105
+ type_: ChangeSetTerminal,
106
+ properties: NodeProperties,
107
+ ):
108
+ super().__init__(change_type=change_type)
109
+ self.name = name
110
+ self.type_ = type_
111
+ self.properties = properties
112
+
113
+
114
+ class NodeProperties(ChangeSetNode):
115
+ properties: Final[list[NodeProperty]]
116
+
117
+ def __init__(self, change_type: ChangeType, properties: list[NodeProperty]):
118
+ super().__init__(change_type=change_type)
119
+ self.properties = properties
120
+
121
+
122
+ class NodeProperty(ChangeSetNode):
123
+ name: Final[str]
124
+ value: Final[ChangeSetEntity]
125
+
126
+ def __init__(self, change_type: ChangeType, name: str, value: ChangeSetEntity):
127
+ super().__init__(change_type=change_type)
128
+ self.name = name
129
+ self.value = value
130
+
131
+
132
+ class NodeObject(ChangeSetNode):
133
+ bindings: Final[dict[str, ChangeSetEntity]]
134
+
135
+ def __init__(self, change_type: ChangeType, bindings: dict[str, ChangeSetEntity]):
136
+ super().__init__(change_type=change_type)
137
+ self.bindings = bindings
138
+
139
+
140
+ class NodeArray(ChangeSetNode):
141
+ array: Final[list[ChangeSetEntity]]
142
+
143
+ def __init__(self, change_type: ChangeType, array: list[ChangeSetEntity]):
144
+ super().__init__(change_type=change_type)
145
+ self.array = array
146
+
147
+
148
+ class TerminalValue(ChangeSetTerminal, abc.ABC):
149
+ value: Final[Any]
150
+
151
+ def __init__(self, change_type: ChangeType, value: Any):
152
+ super().__init__(change_type=change_type)
153
+ self.value = value
154
+
155
+
156
+ class TerminalValueModified(TerminalValue):
157
+ modified_value: Final[Any]
158
+
159
+ def __init__(self, value: Any, modified_value: Any):
160
+ super().__init__(change_type=ChangeType.MODIFIED, value=value)
161
+ self.modified_value = modified_value
162
+
163
+
164
+ class TerminalValueCreated(TerminalValue):
165
+ def __init__(self, value: Any):
166
+ super().__init__(change_type=ChangeType.CREATED, value=value)
167
+
168
+
169
+ class TerminalValueRemoved(TerminalValue):
170
+ def __init__(self, value: Any):
171
+ super().__init__(change_type=ChangeType.REMOVED, value=value)
172
+
173
+
174
+ class TerminalValueUnchanged(TerminalValue):
175
+ def __init__(self, value: Any):
176
+ super().__init__(change_type=ChangeType.UNCHANGED, value=value)
177
+
178
+
179
+ ResourcesKey: Final[str] = "Resources"
180
+ PropertiesKey: Final[str] = "Properties"
181
+
182
+
183
+ class ChangeSetModel:
184
+ # TODO: should this instead be generalised to work on "Stack" objects instead of just "Template"s?
185
+
186
+ # TODO: can probably improve the typehints to use CFN's 'language' eg. dict -> Template|Properties, etc.
187
+
188
+ # TODO: typechecks for key-value pairs?
189
+
190
+ _before_template: Final[Maybe[dict]]
191
+ _after_template: Final[Maybe[dict]]
192
+ _node_template: Final[NodeTemplate]
193
+
194
+ def __init__(self, before_template: Optional[dict], after_template: Optional[dict]):
195
+ self._before_template = before_template or Nothing
196
+ self._after_template = after_template or Nothing
197
+ self._node_template = self._model(
198
+ before_template=before_template, after_template=after_template
199
+ )
200
+
201
+ def get_update_model(self) -> NodeTemplate:
202
+ # TODO: rethink naming of this for outer utils
203
+ return self._node_template
204
+
205
+ def _visit_terminal_value( # noqa
206
+ self, before_value: Maybe[Any], after_value: Maybe[Any]
207
+ ) -> TerminalValue:
208
+ if self._is_created(before=before_value, after=after_value):
209
+ return TerminalValueCreated(value=after_value)
210
+ if self._is_removed(before=before_value, after=after_value):
211
+ return TerminalValueRemoved(value=before_value)
212
+ if before_value == after_value:
213
+ return TerminalValueUnchanged(value=before_value)
214
+ return TerminalValueModified(value=before_value, modified_value=after_value)
215
+
216
+ def _visit_array(self, before_array: Maybe[list], after_array: Maybe[list]) -> NodeArray:
217
+ change_type = ChangeType.UNCHANGED
218
+ array: list[ChangeSetEntity] = list()
219
+ for before_value, after_value in zip_longest(before_array, after_array, fillvalue=Nothing):
220
+ value = self._visit_value(before_value=before_value, after_value=after_value)
221
+ array.append(value)
222
+ if value.change_type != ChangeType.UNCHANGED:
223
+ change_type = ChangeType.MODIFIED
224
+ return NodeArray(change_type=change_type, array=array)
225
+
226
+ def _visit_object(self, before_object: Maybe[dict], after_object: Maybe[dict]) -> NodeObject:
227
+ change_type = ChangeType.UNCHANGED
228
+ binding_names = self._keys_of(before_object, after_object)
229
+ bindings: dict[str, ChangeSetEntity] = dict()
230
+ for binding_name in binding_names:
231
+ # TODO: check the binding names for intrinsic functions and redirect.
232
+ before_value, after_value = self._sample_from(binding_name, before_object, after_object)
233
+ value = self._visit_value(before_value=before_value, after_value=after_value)
234
+ bindings[binding_name] = value
235
+ if value.change_type != ChangeType.UNCHANGED:
236
+ change_type = ChangeType.MODIFIED
237
+ return NodeObject(change_type=change_type, bindings=bindings)
238
+
239
+ def _visit_value(self, before_value: Maybe[Any], after_value: Maybe[Any]) -> ChangeSetEntity:
240
+ before_type = type(before_value)
241
+ after_type = type(after_value)
242
+
243
+ if self._is_created(before=before_value, after=after_value):
244
+ return TerminalValueCreated(value=after_value)
245
+ if self._is_removed(before=before_value, after=after_value):
246
+ return TerminalValueRemoved(value=before_value)
247
+
248
+ # Case: update on the same type.
249
+ if before_type == after_type:
250
+ if self._is_terminal(value=before_value):
251
+ value = self._visit_terminal_value(
252
+ before_value=before_value, after_value=after_value
253
+ )
254
+ elif self._is_object(value=before_value):
255
+ value = self._visit_object(before_object=before_value, after_object=after_value)
256
+ elif self._is_array(value=before_value):
257
+ value = self._visit_array(before_array=before_value, after_array=after_value)
258
+ else:
259
+ raise RuntimeError(f"Unsupported type {before_type}")
260
+ return value
261
+ # Case: update to new type.
262
+ else:
263
+ return TerminalValueModified(value=before_value, modified_value=after_value)
264
+
265
+ def _visit_property(
266
+ self, property_name: str, before_property: Maybe[Any], after_property: Maybe[Any]
267
+ ) -> NodeProperty:
268
+ if self._is_created(before=before_property, after=after_property):
269
+ return NodeProperty(
270
+ change_type=ChangeType.CREATED,
271
+ name=property_name,
272
+ value=TerminalValueCreated(value=after_property),
273
+ )
274
+ if self._is_removed(before=before_property, after=after_property):
275
+ return NodeProperty(
276
+ change_type=ChangeType.REMOVED,
277
+ name=property_name,
278
+ value=TerminalValueRemoved(value=before_property),
279
+ )
280
+ value = self._visit_value(before_value=before_property, after_value=after_property)
281
+ return NodeProperty(change_type=value.change_type, name=property_name, value=value)
282
+
283
+ def _visit_properties(
284
+ self, before_properties: Maybe[dict], after_properties: Maybe[dict]
285
+ ) -> NodeProperties:
286
+ # TODO: double check we are sure not to have this be a NodeObject
287
+ property_names: set[str] = self._keys_of(before_properties, after_properties)
288
+ properties: list[NodeProperty] = list()
289
+ change_type = ChangeType.UNCHANGED
290
+ for property_name in property_names:
291
+ before_property, after_property = self._sample_from(
292
+ property_name, before_properties, after_properties
293
+ )
294
+ property_ = self._visit_property(
295
+ property_name=property_name,
296
+ before_property=before_property,
297
+ after_property=after_property,
298
+ )
299
+ properties.append(property_)
300
+ # TODO: compute the properties change type properly.
301
+ if property_.change_type != ChangeType.UNCHANGED:
302
+ change_type = change_type.MODIFIED
303
+ return NodeProperties(change_type=change_type, properties=properties)
304
+
305
+ def _visit_resource(
306
+ self, resource_name: str, before_resource: Maybe[dict], after_resource: Maybe[dict]
307
+ ) -> NodeResource:
308
+ if self._is_created(before=before_resource, after=after_resource):
309
+ change_type = ChangeType.CREATED
310
+ elif self._is_removed(before=before_resource, after=after_resource):
311
+ change_type = ChangeType.REMOVED
312
+ else:
313
+ change_type = ChangeType.UNCHANGED
314
+
315
+ before_properties, after_properties = self._sample_from(
316
+ PropertiesKey, before_resource, after_resource
317
+ )
318
+ properties = self._visit_properties(
319
+ before_properties=before_properties, after_properties=after_properties
320
+ )
321
+
322
+ if change_type == ChangeType.UNCHANGED and properties.change_type != ChangeType.UNCHANGED:
323
+ change_type = ChangeType.MODIFIED
324
+
325
+ return NodeResource(
326
+ change_type=change_type,
327
+ name=resource_name,
328
+ # TODO: investigate behaviour with type changes, for now this is filler code.
329
+ type_=TerminalValueUnchanged(value="<Type>"),
330
+ properties=properties,
331
+ )
332
+
333
+ def _visit_resources(
334
+ self, before_resources: Maybe[dict], after_resources: Maybe[dict]
335
+ ) -> NodeResources:
336
+ # TODO: investigate type changes behavior.
337
+ change_type = ChangeType.UNCHANGED
338
+ resources: list[NodeResource] = list()
339
+ resource_names = self._keys_of(before_resources, after_resources)
340
+ for resource_name in resource_names:
341
+ before_resource, after_resource = self._sample_from(
342
+ resource_name, before_resources, after_resources
343
+ )
344
+ resource = self._visit_resource(
345
+ resource_name=resource_name,
346
+ before_resource=before_resource,
347
+ after_resource=after_resource,
348
+ )
349
+ resources.append(resource)
350
+ # TODO: compute the properties change type properly.
351
+ if resource.change_type != ChangeType.UNCHANGED:
352
+ change_type = ChangeType.MODIFIED
353
+ return NodeResources(change_type=change_type, resources=resources)
354
+
355
+ def _model(self, before_template: Maybe[dict], after_template: Maybe[dict]) -> NodeTemplate:
356
+ # TODO: visit other child types
357
+ before_resources, after_resources = self._sample_from(
358
+ ResourcesKey, before_template, after_template
359
+ )
360
+ resources = self._visit_resources(
361
+ before_resources=before_resources, after_resources=after_resources
362
+ )
363
+ # TODO: what is a change type for templates?
364
+ return NodeTemplate(change_type=resources.change_type, resources=resources)
365
+
366
+ @staticmethod
367
+ def _sample_from(key: str, *objects: Maybe[dict]) -> Maybe[Any]:
368
+ results = list()
369
+ for obj in objects:
370
+ # TODO: raise errors if not dict
371
+ if not isinstance(obj, NothingType):
372
+ results.append(obj.get(key, Nothing))
373
+ else:
374
+ results.append(obj)
375
+ return results[0] if len(objects) == 1 else tuple(results)
376
+
377
+ @staticmethod
378
+ def _keys_of(*objects: Maybe[dict]) -> set[str]:
379
+ keys: set[str] = set()
380
+ for obj in objects:
381
+ # TODO: raise errors if not dict
382
+ if isinstance(obj, dict):
383
+ keys.update(obj.keys())
384
+ return set(keys)
385
+
386
+ @staticmethod
387
+ def _is_terminal(value: Any) -> bool:
388
+ return type(value) in {int, float, bool, str, None}
389
+
390
+ @staticmethod
391
+ def _is_object(value: Any) -> bool:
392
+ return isinstance(value, dict)
393
+
394
+ @staticmethod
395
+ def _is_array(value: Any) -> bool:
396
+ return isinstance(value, list)
397
+
398
+ @staticmethod
399
+ def _is_created(before: Maybe[Any], after: Maybe[Any]) -> bool:
400
+ return isinstance(before, NothingType) and not isinstance(after, NothingType)
401
+
402
+ @staticmethod
403
+ def _is_removed(before: Maybe[Any], after: Maybe[Any]) -> bool:
404
+ return not isinstance(before, NothingType) and isinstance(after, NothingType)
@@ -0,0 +1,154 @@
1
+ from __future__ import annotations
2
+
3
+ import abc
4
+ from typing import Any, Optional
5
+
6
+ from localstack.aws.api.cloudformation import ChangeAction, ResourceChange
7
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
8
+ ChangeSetEntity,
9
+ ChangeType,
10
+ NodeArray,
11
+ NodeObject,
12
+ NodeProperties,
13
+ NodeResource,
14
+ NodeResources,
15
+ TerminalValueCreated,
16
+ TerminalValueModified,
17
+ TerminalValueRemoved,
18
+ TerminalValueUnchanged,
19
+ )
20
+ from localstack.services.cloudformation.engine.v2.change_set_model_visitor import (
21
+ ChangeSetModelVisitor,
22
+ )
23
+
24
+
25
+ class DescribeUnit(abc.ABC):
26
+ before_context: Optional[Any] = None
27
+ after_context: Optional[Any] = None
28
+
29
+ def __init__(self, before_context: Optional[Any] = None, after_context: Optional[Any] = None):
30
+ self.before_context = before_context
31
+ self.after_context = after_context
32
+
33
+
34
+ class ChangeSetModelDescriber(ChangeSetModelVisitor):
35
+ resource_changes: list[ResourceChange] = list()
36
+
37
+ def __init__(self):
38
+ self.resource_changes = list()
39
+
40
+ def visit(self, change_set_entity: ChangeSetEntity) -> DescribeUnit:
41
+ # Overridden for the return type-hints.
42
+ return super().visit(change_set_entity=change_set_entity)
43
+
44
+ def visit_terminal_value_modified(
45
+ self, terminal_value_modified: TerminalValueModified
46
+ ) -> DescribeUnit:
47
+ return DescribeUnit(
48
+ before_context=terminal_value_modified.value,
49
+ after_context=terminal_value_modified.modified_value,
50
+ )
51
+
52
+ def visit_terminal_value_created(
53
+ self, terminal_value_created: TerminalValueCreated
54
+ ) -> DescribeUnit:
55
+ return DescribeUnit(after_context=terminal_value_created.value)
56
+
57
+ def visit_terminal_value_removed(
58
+ self, terminal_value_removed: TerminalValueRemoved
59
+ ) -> DescribeUnit:
60
+ return DescribeUnit(before_context=terminal_value_removed.value)
61
+
62
+ def visit_terminal_value_unchanged(
63
+ self, terminal_value_unchanged: TerminalValueUnchanged
64
+ ) -> DescribeUnit:
65
+ return DescribeUnit(before_context=terminal_value_unchanged.value)
66
+
67
+ def visit_node_object(self, node_object: NodeObject) -> DescribeUnit:
68
+ before_context = dict()
69
+ after_context = dict()
70
+ for name, change_set_entity in node_object.bindings.items():
71
+ describe_unit: DescribeUnit = self.visit(change_set_entity=change_set_entity)
72
+ match change_set_entity.change_type:
73
+ case ChangeType.MODIFIED:
74
+ before_context[name] = describe_unit.before_context
75
+ after_context[name] = describe_unit.after_context
76
+ case ChangeType.CREATED:
77
+ after_context[name] = describe_unit.after_context
78
+ case ChangeType.REMOVED:
79
+ before_context[name] = describe_unit.before_context
80
+ return DescribeUnit(before_context=before_context, after_context=after_context)
81
+
82
+ def visit_node_array(self, node_array: NodeArray) -> DescribeUnit:
83
+ before_context = list()
84
+ after_context = list()
85
+ for change_set_entity in node_array.array:
86
+ describe_unit: DescribeUnit = self.visit(change_set_entity=change_set_entity)
87
+ match change_set_entity.change_type:
88
+ case ChangeType.MODIFIED:
89
+ before_context.append(describe_unit.before_context)
90
+ after_context.append(describe_unit.after_context)
91
+ case ChangeType.CREATED:
92
+ after_context.append(describe_unit.after_context)
93
+ case ChangeType.REMOVED:
94
+ before_context.append(describe_unit.before_context)
95
+ case ChangeType.UNCHANGED:
96
+ before_context.append(describe_unit.before_context)
97
+ after_context.append(describe_unit.before_context)
98
+ return DescribeUnit(before_context=before_context, after_context=after_context)
99
+
100
+ def visit_node_properties(self, node_properties: NodeProperties) -> DescribeUnit:
101
+ before_context: dict[str, Any] = dict()
102
+ after_context: dict[str, Any] = dict()
103
+ for node_property in node_properties.properties:
104
+ if node_property.change_type == ChangeType.UNCHANGED:
105
+ continue
106
+ describe_unit = self.visit(node_property.value)
107
+ property_name = node_property.name
108
+ match node_property.change_type:
109
+ case ChangeType.MODIFIED:
110
+ before_context[property_name] = describe_unit.before_context
111
+ after_context[property_name] = describe_unit.after_context
112
+ case ChangeType.CREATED:
113
+ after_context[property_name] = describe_unit.after_context
114
+ case ChangeType.REMOVED:
115
+ before_context[property_name] = describe_unit.before_context
116
+ # TODO: this object can probably be well-typed instead of a free dict(?)
117
+ before_context = {"Properties": before_context}
118
+ after_context = {"Properties": after_context}
119
+ return DescribeUnit(before_context=before_context, after_context=after_context)
120
+
121
+ def visit_node_resource(self, node_resource: NodeResource) -> DescribeUnit:
122
+ resource_change = ResourceChange()
123
+ resource_change["LogicalResourceId"] = node_resource.name
124
+
125
+ # TODO: investigate effects on type changes
126
+ type_describe_unit = self.visit(node_resource.type_)
127
+ resource_change["ResourceType"] = (
128
+ type_describe_unit.before_context or type_describe_unit.after_context
129
+ )
130
+
131
+ properties_describe_unit = self.visit_node_properties(node_resource.properties)
132
+ match node_resource.change_type:
133
+ case ChangeType.MODIFIED:
134
+ resource_change["Action"] = ChangeAction.Modify
135
+ resource_change["BeforeContext"] = properties_describe_unit.before_context
136
+ resource_change["AfterContext"] = properties_describe_unit.after_context
137
+ case ChangeType.CREATED:
138
+ resource_change["Action"] = ChangeAction.Add
139
+ resource_change["AfterContext"] = properties_describe_unit.after_context
140
+ case ChangeType.REMOVED:
141
+ resource_change["Action"] = ChangeAction.Remove
142
+ resource_change["BeforeContext"] = properties_describe_unit.before_context
143
+
144
+ self.resource_changes.append(resource_change)
145
+
146
+ # TODO
147
+ return None
148
+
149
+ def visit_node_resources(self, node_resources: NodeResources) -> DescribeUnit:
150
+ for node_resource in node_resources.resources:
151
+ if node_resource.change_type != ChangeType.UNCHANGED:
152
+ self.visit_node_resource(node_resource=node_resource)
153
+ # TODO
154
+ return None
@@ -0,0 +1,70 @@
1
+ import abc
2
+
3
+ from localstack.services.cloudformation.engine.v2.change_set_model import (
4
+ ChangeSetEntity,
5
+ NodeArray,
6
+ NodeObject,
7
+ NodeProperties,
8
+ NodeProperty,
9
+ NodeResource,
10
+ NodeResources,
11
+ NodeTemplate,
12
+ TerminalValueCreated,
13
+ TerminalValueModified,
14
+ TerminalValueRemoved,
15
+ TerminalValueUnchanged,
16
+ )
17
+ from localstack.utils.strings import camel_to_snake_case
18
+
19
+
20
+ class ChangeSetModelVisitor(abc.ABC):
21
+ # TODO: this class should be auto generated.
22
+
23
+ # TODO: add visitors for abstract classes so shared logic can be implemented
24
+ # just once in classes extending this.
25
+
26
+ def visit(self, change_set_entity: ChangeSetEntity):
27
+ # TODO: speed up this lookup logic
28
+ type_str = change_set_entity.__class__.__name__
29
+ type_str = camel_to_snake_case(type_str)
30
+ visit_function_name = f"visit_{type_str}"
31
+ visit_function = getattr(self, visit_function_name)
32
+ return visit_function(change_set_entity)
33
+
34
+ def visit_children(self, change_set_entity: ChangeSetEntity):
35
+ children = change_set_entity.get_children()
36
+ for child in children:
37
+ self.visit(child)
38
+
39
+ def visit_node_template(self, node_template: NodeTemplate):
40
+ self.visit_children(node_template)
41
+
42
+ def visit_node_resources(self, node_resources: NodeResources):
43
+ self.visit_children(node_resources)
44
+
45
+ def visit_node_resource(self, node_resource: NodeResource):
46
+ self.visit_children(node_resource)
47
+
48
+ def visit_node_properties(self, node_properties: NodeProperties):
49
+ self.visit_children(node_properties)
50
+
51
+ def visit_node_property(self, node_property: NodeProperty):
52
+ self.visit_children(node_property)
53
+
54
+ def visit_node_object(self, node_object: NodeObject):
55
+ self.visit_children(node_object)
56
+
57
+ def visit_node_array(self, node_array: NodeArray):
58
+ self.visit_children(node_array)
59
+
60
+ def visit_terminal_value_modified(self, terminal_value_modified: TerminalValueModified):
61
+ self.visit_children(terminal_value_modified)
62
+
63
+ def visit_terminal_value_created(self, terminal_value_created: TerminalValueCreated):
64
+ self.visit_children(terminal_value_created)
65
+
66
+ def visit_terminal_value_removed(self, terminal_value_removed: TerminalValueRemoved):
67
+ self.visit_children(terminal_value_removed)
68
+
69
+ def visit_terminal_value_unchanged(self, terminal_value_unchanged: TerminalValueUnchanged):
70
+ self.visit_children(terminal_value_unchanged)
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.2.1.dev38'
21
- __version_tuple__ = version_tuple = (4, 2, 1, 'dev38')
20
+ __version__ = version = '4.2.1.dev40'
21
+ __version_tuple__ = version_tuple = (4, 2, 1, 'dev40')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: localstack-core
3
- Version: 4.2.1.dev38
3
+ Version: 4.2.1.dev40
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  Project-URL: Homepage, https://localstack.cloud
@@ -31,8 +31,8 @@ Requires-Dist: requests>=2.20.0
31
31
  Requires-Dist: semver>=2.10
32
32
  Requires-Dist: tailer>=0.4.1
33
33
  Provides-Extra: base-runtime
34
- Requires-Dist: boto3==1.36.21; extra == "base-runtime"
35
- Requires-Dist: botocore==1.36.21; extra == "base-runtime"
34
+ Requires-Dist: boto3==1.37.11; extra == "base-runtime"
35
+ Requires-Dist: botocore==1.37.11; extra == "base-runtime"
36
36
  Requires-Dist: awscrt>=0.13.14; extra == "base-runtime"
37
37
  Requires-Dist: cbor2>=5.5.0; extra == "base-runtime"
38
38
  Requires-Dist: dnspython>=1.16.0; extra == "base-runtime"
@@ -3,7 +3,7 @@ localstack/constants.py,sha256=bBh6djh4x37MrS8az8LizX_APMZ56XdtJHCnZdOnmeg,6867
3
3
  localstack/deprecations.py,sha256=t3zeaZaHhKYM8snP1wRZhpvAy6MbB12Vqv5hK78bwJ0,15162
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
- localstack/version.py,sha256=hibNwXB6fRHN_vVxbBi_1JkKSsqTw37JWvmKZ5hr374,526
6
+ localstack/version.py,sha256=_bDnRFa-d-d9bqRwqHZ9yUJDPKRGvenrj4dk7MjWHko,526
7
7
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
9
9
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -29,7 +29,7 @@ localstack/aws/api/cloudwatch/__init__.py,sha256=Ep6Z3t6StIsKHCtvkvAroODVxxWvG5X
29
29
  localstack/aws/api/config/__init__.py,sha256=_34oLgPd2zFkD0EnDM4jVy90rmtW7CcVWtfHoVYAjxU,141276
30
30
  localstack/aws/api/dynamodb/__init__.py,sha256=ilFvq01MyOaHdrK9TTA_WQZ1291iGCWnXI-odC0yeyQ,91143
31
31
  localstack/aws/api/dynamodbstreams/__init__.py,sha256=Xfnce5gsHC4omBJrNsCi3F7TJpuvqn9K7rC5EL-y4UQ,6999
32
- localstack/aws/api/ec2/__init__.py,sha256=AIcbQaPCdIh7LjzTL-vYScibjxmUniCXmc9V9X29BK0,878176
32
+ localstack/aws/api/ec2/__init__.py,sha256=pdNny1WSWiP5jvBz35-EQikC3G-vLRYqs3dD6RrHGnM,881402
33
33
  localstack/aws/api/es/__init__.py,sha256=T5wz0U7jtm2ZjRJkkBHG8qRR8n2Hy51LeCAN25EeMjg,63675
34
34
  localstack/aws/api/events/__init__.py,sha256=JbURTIxg4p0Sc2Ot88MQy6WvGfi2bw1lS0pt7I2hU-k,60015
35
35
  localstack/aws/api/firehose/__init__.py,sha256=iM9_VTHDwtqtupKPBCqAQIh6Xk9ziM4rEEsxPRMN6RM,58271
@@ -306,6 +306,10 @@ localstack/services/cloudformation/engine/transformers.py,sha256=IJugwthJfzQMwFj
306
306
  localstack/services/cloudformation/engine/types.py,sha256=YIhmTrO__obIviYvzzCovKoDzu4F0JiDP4pmrYQtKV4,1518
307
307
  localstack/services/cloudformation/engine/validations.py,sha256=brq7s8O8exA5kvnfzR9ulOtQ7i4konrWQs07-0h_ByE,2847
308
308
  localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUGen9Mz8SjosBuodpV5XvsCSn9bDg,2164
309
+ localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=N_s6OUwWDa9CxEDqTNa1jFjSTMbw9HgkBFDiQqTIp3c,14893
311
+ localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=dMDDjXdsOrVFcpWx3VM5Rk0Uj0HcT7IpQiZB7oIODyQ,6801
312
+ localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=Ajw6wtiNCkx9PJmuOWcRzxnsEEQgVWqbclWqI7QBGvk,2491
309
313
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
310
314
  localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
311
315
  localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py,sha256=Grn3dP1jANRlVO9HyKQV5GHv0x1eNRBeaIYhgn-FKv4,2812
@@ -1259,13 +1263,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1259
1263
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1260
1264
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1261
1265
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1262
- localstack_core-4.2.1.dev38.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1263
- localstack_core-4.2.1.dev38.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1264
- localstack_core-4.2.1.dev38.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1265
- localstack_core-4.2.1.dev38.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1266
- localstack_core-4.2.1.dev38.dist-info/METADATA,sha256=cucZG5kP4UffMziF37q8tlyxTsU4Fccrd-BdYxXvKds,5481
1267
- localstack_core-4.2.1.dev38.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1268
- localstack_core-4.2.1.dev38.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1269
- localstack_core-4.2.1.dev38.dist-info/plux.json,sha256=cqYrXa-KmYs2xesE7iL8J2wBN-1vKleIuF7vEIHSXhU,20710
1270
- localstack_core-4.2.1.dev38.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1271
- localstack_core-4.2.1.dev38.dist-info/RECORD,,
1266
+ localstack_core-4.2.1.dev40.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1267
+ localstack_core-4.2.1.dev40.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1268
+ localstack_core-4.2.1.dev40.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1269
+ localstack_core-4.2.1.dev40.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1270
+ localstack_core-4.2.1.dev40.dist-info/METADATA,sha256=WCkJdwG34wLpe8te0KDJFGMq_qVWT9TaYqeps4zOfn0,5481
1271
+ localstack_core-4.2.1.dev40.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1272
+ localstack_core-4.2.1.dev40.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1273
+ localstack_core-4.2.1.dev40.dist-info/plux.json,sha256=IXddrgB7VWiwKrEZ0S33HEtxpKb8177ZcJ_tGJ_GCYI,20710
1274
+ localstack_core-4.2.1.dev40.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1275
+ localstack_core-4.2.1.dev40.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "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::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "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::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "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::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin"], "localstack.packages": ["jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.hooks.on_infra_start": ["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", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_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", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "stop_server=localstack.dns.plugins:stop_server", "_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.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.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.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin"], "localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package"], "localstack.hooks.on_infra_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_start": ["register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"]}