localstack-core 4.7.1.dev119__py3-none-any.whl → 4.7.1.dev121__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.
Files changed (23) hide show
  1. localstack/services/cloudformation/engine/v2/change_set_model.py +4 -0
  2. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +14 -3
  3. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +22 -68
  4. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +58 -23
  5. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +15 -1
  6. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +16 -0
  7. localstack/services/cloudformation/engine/v2/resolving.py +1 -1
  8. localstack/services/cloudformation/resource_provider.py +2 -0
  9. localstack/services/cloudformation/v2/provider.py +4 -9
  10. localstack/services/cloudformation/v2/utils.py +4 -1
  11. localstack/services/s3/provider.py +6 -4
  12. localstack/version.py +2 -2
  13. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/METADATA +1 -1
  14. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/RECORD +22 -22
  15. localstack_core-4.7.1.dev121.dist-info/plux.json +1 -0
  16. localstack_core-4.7.1.dev119.dist-info/plux.json +0 -1
  17. {localstack_core-4.7.1.dev119.data → localstack_core-4.7.1.dev121.data}/scripts/localstack +0 -0
  18. {localstack_core-4.7.1.dev119.data → localstack_core-4.7.1.dev121.data}/scripts/localstack-supervisor +0 -0
  19. {localstack_core-4.7.1.dev119.data → localstack_core-4.7.1.dev121.data}/scripts/localstack.bat +0 -0
  20. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/WHEEL +0 -0
  21. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/entry_points.txt +0 -0
  22. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/licenses/LICENSE.txt +0 -0
  23. {localstack_core-4.7.1.dev119.dist-info → localstack_core-4.7.1.dev121.dist-info}/top_level.txt +0 -0
@@ -785,6 +785,9 @@ class ChangeSetModel:
785
785
 
786
786
  logical_id = arguments.value
787
787
 
788
+ if isinstance(logical_id, str) and logical_id.startswith("AWS::"):
789
+ return arguments.change_type
790
+
788
791
  node_condition = self._retrieve_condition_if_exists(condition_name=logical_id)
789
792
  if isinstance(node_condition, NodeCondition):
790
793
  return node_condition.change_type
@@ -863,6 +866,7 @@ class ChangeSetModel:
863
866
  ) -> bool:
864
867
  # a bit hacky but we have to load the resource provider executor _and_ resource provider to get the schema
865
868
  # Note: we don't log the attempt to load the resource provider, we need to make sure this is only done once and we already do this in the executor
869
+
866
870
  resource_provider = ResourceProviderExecutor.try_load_resource_provider(resource_type.value)
867
871
  if not resource_provider:
868
872
  # if we don't support a resource, assume an in-place update for simplicity
@@ -99,8 +99,11 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
99
99
  def visit_node_intrinsic_function_fn_join(
100
100
  self, node_intrinsic_function: NodeIntrinsicFunction
101
101
  ) -> PreprocEntityDelta:
102
- # TODO: investigate the behaviour and impact of this logic with the user defining
103
- # {{changeSet:KNOWN_AFTER_APPLY}} string literals as delimiters or arguments.
102
+ delta_args = super().visit(node_intrinsic_function.arguments)
103
+ if isinstance(delta_args.after, list) and CHANGESET_KNOWN_AFTER_APPLY in delta_args.after:
104
+ delta_args.after = CHANGESET_KNOWN_AFTER_APPLY
105
+ return delta_args
106
+
104
107
  delta = super().visit_node_intrinsic_function_fn_join(
105
108
  node_intrinsic_function=node_intrinsic_function
106
109
  )
@@ -264,6 +267,14 @@ class ChangeSetModelDescriber(ChangeSetModelPreproc):
264
267
  export_name = node_intrinsic_function.arguments.value
265
268
 
266
269
  self._change_set.status_reason = f"[WARN] --include-property-values option can return incomplete ChangeSet data because: ChangeSet creation failed for resource [{resource_name}] because: No export named {export_name}"
267
- delta.after = "{{changeSet:KNOWN_AFTER_APPLY}}"
270
+ delta.after = CHANGESET_KNOWN_AFTER_APPLY
271
+
272
+ return delta
268
273
 
274
+ def visit_node_intrinsic_function_fn_split(
275
+ self, node_intrinsic_function: NodeIntrinsicFunction
276
+ ) -> PreprocEntityDelta:
277
+ delta = super().visit_node_intrinsic_function_fn_split(node_intrinsic_function)
278
+ if isinstance(delta.after, list) and ":".join(delta.after) == CHANGESET_KNOWN_AFTER_APPLY:
279
+ delta.after = [CHANGESET_KNOWN_AFTER_APPLY]
269
280
  return delta
@@ -1,9 +1,11 @@
1
1
  import copy
2
2
  import logging
3
+ import re
3
4
  import uuid
5
+ from collections.abc import Callable
4
6
  from dataclasses import dataclass
5
7
  from datetime import UTC, datetime
6
- from typing import Final, Protocol
8
+ from typing import Final, Protocol, TypeVar
7
9
 
8
10
  from localstack import config
9
11
  from localstack.aws.api.cloudformation import (
@@ -15,18 +17,14 @@ from localstack.aws.api.cloudformation import (
15
17
  from localstack.constants import INTERNAL_AWS_SECRET_ACCESS_KEY
16
18
  from localstack.services.cloudformation.analytics import track_resource_operation
17
19
  from localstack.services.cloudformation.deployment_utils import log_not_available_message
18
- from localstack.services.cloudformation.engine.template_deployer import REGEX_OUTPUT_APIGATEWAY
19
20
  from localstack.services.cloudformation.engine.v2.change_set_model import (
20
21
  NodeDependsOn,
21
- NodeIntrinsicFunction,
22
22
  NodeOutput,
23
23
  NodeResource,
24
- TerminalValueCreated,
25
- TerminalValueModified,
26
- TerminalValueUnchanged,
27
24
  is_nothing,
28
25
  )
29
26
  from localstack.services.cloudformation.engine.v2.change_set_model_preproc import (
27
+ _AWS_URL_SUFFIX,
30
28
  MOCKED_REFERENCE,
31
29
  ChangeSetModelPreproc,
32
30
  PreprocEntityDelta,
@@ -42,12 +40,17 @@ from localstack.services.cloudformation.resource_provider import (
42
40
  ResourceProviderPayload,
43
41
  )
44
42
  from localstack.services.cloudformation.v2.entities import ChangeSet, ResolvedResource
45
- from localstack.utils.urls import localstack_host
46
43
 
47
44
  LOG = logging.getLogger(__name__)
48
45
 
49
46
  EventOperationFromAction = {"Add": "CREATE", "Modify": "UPDATE", "Remove": "DELETE"}
50
47
 
48
+ REGEX_OUTPUT_APIGATEWAY = re.compile(
49
+ rf"^(https?://.+\.execute-api\.)(?:[^-]+-){{2,3}}\d\.(amazonaws\.com|{_AWS_URL_SUFFIX})/?(.*)$"
50
+ )
51
+
52
+ _T = TypeVar("_T")
53
+
51
54
 
52
55
  @dataclass
53
56
  class ChangeSetModelExecutorResult:
@@ -220,6 +223,12 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
220
223
  try:
221
224
  delta = super().visit_node_resource(node_resource=node_resource)
222
225
  except Exception as e:
226
+ LOG.debug(
227
+ "preprocessing resource '%s' failed: %s",
228
+ node_resource.name,
229
+ e,
230
+ exc_info=LOG.isEnabledFor(logging.DEBUG) and config.CFN_VERBOSE_ERRORS,
231
+ )
223
232
  self._process_event(
224
233
  action=node_resource.change_type.to_change_action(),
225
234
  logical_resource_id=node_resource.name,
@@ -507,7 +516,8 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
507
516
  f'No resource provider found for "{resource_type}"',
508
517
  )
509
518
  LOG.warning(
510
- "Deployment of resource type %s successful due to config CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES"
519
+ "Deployment of resource type %s successful due to config CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES",
520
+ resource_type,
511
521
  )
512
522
  LOG.warning(
513
523
  "Deployment of resource type %s will fail in upcoming LocalStack releases unless CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES is explicitly enabled.",
@@ -638,66 +648,10 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
638
648
  }
639
649
  return resource_provider_payload
640
650
 
641
- @staticmethod
642
- def _replace_url_outputs_if_required(value: str) -> str:
643
- api_match = REGEX_OUTPUT_APIGATEWAY.match(value)
644
- if api_match and value not in config.CFN_STRING_REPLACEMENT_DENY_LIST:
645
- prefix = api_match[1]
646
- host = api_match[2]
647
- path = api_match[3]
648
- port = localstack_host().port
649
- value = f"{prefix}{host}:{port}/{path}"
650
- return value
651
-
652
- return value
653
-
654
- def _replace_url_outputs_in_delta_if_required(
655
- self, delta: PreprocEntityDelta
651
+ def _maybe_perform_on_delta(
652
+ self, delta: PreprocEntityDelta, f: Callable[[_T], _T]
656
653
  ) -> PreprocEntityDelta:
657
- if isinstance(delta.before, str):
658
- delta.before = self._replace_url_outputs_if_required(delta.before)
654
+ # we only care about the after state
659
655
  if isinstance(delta.after, str):
660
- delta.after = self._replace_url_outputs_if_required(delta.after)
656
+ delta.after = f(delta.after)
661
657
  return delta
662
-
663
- def visit_terminal_value_created(
664
- self, value: TerminalValueCreated
665
- ) -> PreprocEntityDelta[str, str]:
666
- if isinstance(value.value, str):
667
- after = self._replace_url_outputs_if_required(value.value)
668
- else:
669
- after = value.value
670
- return PreprocEntityDelta(after=after)
671
-
672
- def visit_terminal_value_modified(
673
- self, value: TerminalValueModified
674
- ) -> PreprocEntityDelta[str, str]:
675
- # we only need to transform the after
676
- if isinstance(value.modified_value, str):
677
- after = self._replace_url_outputs_if_required(value.modified_value)
678
- else:
679
- after = value.modified_value
680
- return PreprocEntityDelta(before=value.value, after=after)
681
-
682
- def visit_terminal_value_unchanged(
683
- self, terminal_value_unchanged: TerminalValueUnchanged
684
- ) -> PreprocEntityDelta:
685
- if isinstance(terminal_value_unchanged.value, str):
686
- value = self._replace_url_outputs_if_required(terminal_value_unchanged.value)
687
- else:
688
- value = terminal_value_unchanged.value
689
- return PreprocEntityDelta(before=value, after=value)
690
-
691
- def visit_node_intrinsic_function_fn_join(
692
- self, node_intrinsic_function: NodeIntrinsicFunction
693
- ) -> PreprocEntityDelta:
694
- delta = super().visit_node_intrinsic_function_fn_join(node_intrinsic_function)
695
- return self._replace_url_outputs_in_delta_if_required(delta)
696
-
697
- def visit_node_intrinsic_function_fn_sub(
698
- self, node_intrinsic_function: NodeIntrinsicFunction
699
- ) -> PreprocEntityDelta:
700
- delta = super().visit_node_intrinsic_function_fn_sub(node_intrinsic_function)
701
- return self._replace_url_outputs_in_delta_if_required(delta)
702
-
703
- # TODO: other intrinsic functions
@@ -60,7 +60,7 @@ from localstack.utils.run import to_str
60
60
  from localstack.utils.strings import to_bytes
61
61
  from localstack.utils.urls import localstack_host
62
62
 
63
- _AWS_URL_SUFFIX = localstack_host().host # The value in AWS is "amazonaws.com"
63
+ _AWS_URL_SUFFIX = localstack_host().host_and_port() # The value in AWS is "amazonaws.com"
64
64
 
65
65
  _PSEUDO_PARAMETERS: Final[set[str]] = {
66
66
  "AWS::Partition",
@@ -75,7 +75,11 @@ _PSEUDO_PARAMETERS: Final[set[str]] = {
75
75
 
76
76
  TBefore = TypeVar("TBefore")
77
77
  TAfter = TypeVar("TAfter")
78
+ _T = TypeVar("_T")
78
79
 
80
+ REGEX_OUTPUT_APIGATEWAY = re.compile(
81
+ rf"^(https?://.+\.execute-api\.)(?:[^-]+-){{2,3}}\d\.(amazonaws\.com|{_AWS_URL_SUFFIX})/?(.*)$"
82
+ )
79
83
  MOCKED_REFERENCE = "unknown"
80
84
 
81
85
  VALID_LOGICAL_RESOURCE_ID_RE = re.compile(r"^[A-Za-z0-9]+$")
@@ -265,16 +269,16 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
265
269
  f"No deployed instances of resource '{resource_logical_id}' were found"
266
270
  )
267
271
  properties = resolved_resource.get("Properties", {})
268
- # support structured properties, e.g. NestedStack.Outputs.OutputName
272
+ # TODO support structured properties, e.g. NestedStack.Outputs.OutputName
269
273
  property_value: Any | None = get_value_from_path(properties, property_name)
270
274
 
271
275
  if property_value:
272
- if not isinstance(property_value, str):
276
+ if not isinstance(property_value, (str, list)):
273
277
  # TODO: is this correct? If there is a bug in the logic here, it's probably
274
278
  # better to know about it with a clear error message than to receive some form
275
279
  # of message about trying to use a dictionary in place of a string
276
280
  raise RuntimeError(
277
- f"Accessing property '{property_name}' from '{resource_logical_id}' resulted in a non-string value"
281
+ f"Accessing property '{property_name}' from '{resource_logical_id}' resulted in a non-string value nor list"
278
282
  )
279
283
  return property_value
280
284
  elif config.CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES:
@@ -400,10 +404,57 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
400
404
  return PreprocEntityDelta(before=before, after=after)
401
405
  delta = super().visit(change_set_entity=change_set_entity)
402
406
  if isinstance(delta, PreprocEntityDelta):
407
+ delta = self._maybe_perform_replacements(delta)
403
408
  self._before_cache[entity_scope] = delta.before
404
409
  self._after_cache[entity_scope] = delta.after
405
410
  return delta
406
411
 
412
+ def _maybe_perform_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
413
+ delta = self._maybe_perform_static_replacements(delta)
414
+ delta = self._maybe_perform_dynamic_replacements(delta)
415
+ return delta
416
+
417
+ def _maybe_perform_static_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
418
+ return self._maybe_perform_on_delta(delta, self._perform_static_replacements)
419
+
420
+ def _maybe_perform_dynamic_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
421
+ return self._maybe_perform_on_delta(delta, self._perform_dynamic_replacements)
422
+
423
+ def _maybe_perform_on_delta(
424
+ self, delta: PreprocEntityDelta | None, f: Callable[[_T], _T]
425
+ ) -> PreprocEntityDelta | None:
426
+ if isinstance(delta.before, str):
427
+ delta.before = f(delta.before)
428
+ if isinstance(delta.after, str):
429
+ delta.after = f(delta.after)
430
+ return delta
431
+
432
+ def _perform_dynamic_replacements(self, value: _T) -> _T:
433
+ if not isinstance(value, str):
434
+ return value
435
+ if dynamic_ref := extract_dynamic_reference(value):
436
+ new_value = perform_dynamic_reference_lookup(
437
+ reference=dynamic_ref,
438
+ account_id=self._change_set.account_id,
439
+ region_name=self._change_set.region_name,
440
+ )
441
+ if new_value:
442
+ return new_value
443
+
444
+ return value
445
+
446
+ @staticmethod
447
+ def _perform_static_replacements(value: str) -> str:
448
+ api_match = REGEX_OUTPUT_APIGATEWAY.match(value)
449
+ if api_match and value not in config.CFN_STRING_REPLACEMENT_DENY_LIST:
450
+ prefix = api_match[1]
451
+ host = api_match[2]
452
+ path = api_match[3]
453
+ value = f"{prefix}{host}/{path}"
454
+ return value
455
+
456
+ return value
457
+
407
458
  def _cached_apply(
408
459
  self, scope: Scope, arguments_delta: PreprocEntityDelta, resolver: Callable[[Any], Any]
409
460
  ) -> PreprocEntityDelta:
@@ -452,6 +503,9 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
452
503
 
453
504
  return PreprocEntityDelta(before=before, after=after)
454
505
 
506
+ def visit_node_property(self, node_property: NodeProperty) -> PreprocEntityDelta:
507
+ return self.visit(node_property.value)
508
+
455
509
  def visit_terminal_value_modified(
456
510
  self, terminal_value_modified: TerminalValueModified
457
511
  ) -> PreprocEntityDelta:
@@ -1031,25 +1085,6 @@ class ChangeSetModelPreproc(ChangeSetModelVisitor):
1031
1085
  after.append(delta_after)
1032
1086
  return PreprocEntityDelta(before=before, after=after)
1033
1087
 
1034
- def visit_node_property(self, node_property: NodeProperty) -> PreprocEntityDelta:
1035
- # TODO: what about other positions?
1036
- value = self.visit(node_property.value)
1037
- if not is_nothing(value.before):
1038
- if dynamic_ref := extract_dynamic_reference(value.before):
1039
- value.before = perform_dynamic_reference_lookup(
1040
- reference=dynamic_ref,
1041
- account_id=self._change_set.account_id,
1042
- region_name=self._change_set.region_name,
1043
- )
1044
- if not is_nothing(value.after):
1045
- if dynamic_ref := extract_dynamic_reference(value.after):
1046
- value.after = perform_dynamic_reference_lookup(
1047
- reference=dynamic_ref,
1048
- account_id=self._change_set.account_id,
1049
- region_name=self._change_set.region_name,
1050
- )
1051
- return value
1052
-
1053
1088
  def visit_node_properties(
1054
1089
  self, node_properties: NodeProperties
1055
1090
  ) -> PreprocEntityDelta[PreprocProperties, PreprocProperties]:
@@ -7,7 +7,7 @@ from typing import Any, Final, TypedDict
7
7
 
8
8
  import boto3
9
9
  import jsonpath_ng
10
- from botocore.exceptions import ClientError
10
+ from botocore.exceptions import ClientError, ParamValidationError
11
11
  from samtranslator.translator.transform import transform as transform_sam
12
12
 
13
13
  from localstack.aws.connect import connect_to
@@ -28,6 +28,7 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
28
28
  NodeIntrinsicFunction,
29
29
  NodeIntrinsicFunctionFnTransform,
30
30
  NodeProperties,
31
+ NodeProperty,
31
32
  NodeResource,
32
33
  NodeResources,
33
34
  NodeTransform,
@@ -528,3 +529,16 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
528
529
  return super().visit_node_intrinsic_function_fn_select(node_intrinsic_function)
529
530
  except RuntimeError:
530
531
  return self.visit(node_intrinsic_function.arguments)
532
+
533
+ def visit_node_property(self, node_property: NodeProperty) -> PreprocEntityDelta:
534
+ try:
535
+ return super().visit_node_property(node_property)
536
+ except ParamValidationError:
537
+ return self.visit(node_property.value)
538
+
539
+ # ignore errors from dynamic replacements
540
+ def _maybe_perform_dynamic_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
541
+ try:
542
+ return super()._maybe_perform_dynamic_replacements(delta)
543
+ except Exception:
544
+ return delta
@@ -1,9 +1,12 @@
1
1
  import re
2
2
  from typing import Any
3
3
 
4
+ from botocore.exceptions import ParamValidationError
5
+
4
6
  from localstack.services.cloudformation.engine.v2.change_set_model import (
5
7
  Maybe,
6
8
  NodeIntrinsicFunction,
9
+ NodeProperty,
7
10
  NodeResource,
8
11
  NodeTemplate,
9
12
  Nothing,
@@ -174,3 +177,16 @@ class ChangeSetModelValidator(ChangeSetModelPreproc):
174
177
  return super().visit_node_properties(node_resource.properties)
175
178
  except RuntimeError:
176
179
  return super().visit_node_properties(node_resource.properties)
180
+
181
+ def visit_node_property(self, node_property: NodeProperty) -> PreprocEntityDelta:
182
+ try:
183
+ return super().visit_node_property(node_property)
184
+ except ParamValidationError:
185
+ return self.visit(node_property.value)
186
+
187
+ # ignore errors from dynamic replacements
188
+ def _maybe_perform_dynamic_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
189
+ try:
190
+ return super()._maybe_perform_dynamic_replacements(delta)
191
+ except Exception:
192
+ return delta
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import logging
2
3
  import re
3
4
  from dataclasses import dataclass
@@ -6,7 +7,6 @@ from typing import Any
6
7
  from botocore.exceptions import ClientError
7
8
 
8
9
  from localstack.aws.connect import connect_to
9
- from localstack.utils import json
10
10
 
11
11
  LOG = logging.getLogger(__name__)
12
12
 
@@ -563,6 +563,8 @@ class ResourceProviderExecutor:
563
563
  @staticmethod
564
564
  def try_load_resource_provider(resource_type: str) -> ResourceProvider | None:
565
565
  # TODO: unify namespace of plugins
566
+ if resource_type.startswith("Custom"):
567
+ resource_type = "AWS::CloudFormation::CustomResource"
566
568
 
567
569
  # 1. try to load pro resource provider
568
570
  # prioritise pro resource providers
@@ -286,7 +286,7 @@ class CloudformationProviderV2(CloudformationProvider):
286
286
  after_template: dict | None,
287
287
  before_parameters: dict | None,
288
288
  after_parameters: dict | None,
289
- previous_update_model: UpdateModel | None,
289
+ previous_update_model: UpdateModel | None = None,
290
290
  ):
291
291
  resolved_parameters = None
292
292
  if after_parameters is not None:
@@ -400,7 +400,7 @@ class CloudformationProviderV2(CloudformationProvider):
400
400
  template_body = api_utils.extract_template_body(request)
401
401
  structured_template = template_preparer.parse_template(template_body)
402
402
 
403
- if len(template_body) > 51200:
403
+ if len(template_body) > 51200 and not template_url:
404
404
  raise ValidationError(
405
405
  f"1 validation error detected: Value '{template_body}' at 'templateBody' "
406
406
  "failed to satisfy constraint: Member must have length less than or equal to 51200"
@@ -734,7 +734,7 @@ class CloudformationProviderV2(CloudformationProvider):
734
734
  template_body = api_utils.extract_template_body(request)
735
735
  structured_template = template_preparer.parse_template(template_body)
736
736
 
737
- if len(template_body) > 51200:
737
+ if len(template_body) > 51200 and not template_url:
738
738
  raise ValidationError(
739
739
  f"1 validation error detected: Value '{template_body}' at 'templateBody' "
740
740
  "failed to satisfy constraint: Member must have length less than or equal to 51200"
@@ -978,6 +978,7 @@ class CloudformationProviderV2(CloudformationProvider):
978
978
  ResourceType=resource["Type"],
979
979
  LastUpdatedTimestamp=resource["LastUpdatedTimestamp"],
980
980
  ResourceStatus=resource["ResourceStatus"],
981
+ DriftInformation={"StackResourceDriftStatus": "NOT_CHECKED"},
981
982
  )
982
983
  return DescribeStackResourceOutput(StackResourceDetail=resource_detail)
983
984
 
@@ -1495,11 +1496,6 @@ class CloudformationProviderV2(CloudformationProvider):
1495
1496
 
1496
1497
  stack.set_stack_status(StackStatus.DELETE_IN_PROGRESS)
1497
1498
 
1498
- previous_update_model = None
1499
- if stack.change_set_id:
1500
- if previous_change_set := find_change_set_v2(state, stack.change_set_id):
1501
- previous_update_model = previous_change_set.update_model
1502
-
1503
1499
  # create a dummy change set
1504
1500
  change_set = ChangeSet(
1505
1501
  stack, {"ChangeSetName": f"delete-stack_{stack.stack_name}"}, template_body=""
@@ -1510,7 +1506,6 @@ class CloudformationProviderV2(CloudformationProvider):
1510
1506
  after_template=None,
1511
1507
  before_parameters=stack.resolved_parameters,
1512
1508
  after_parameters=None,
1513
- previous_update_model=previous_update_model,
1514
1509
  )
1515
1510
 
1516
1511
  change_set_executor = ChangeSetModelExecutor(change_set)
@@ -2,4 +2,7 @@ from localstack import config
2
2
 
3
3
 
4
4
  def is_v2_engine() -> bool:
5
- return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation") == "engine-v2"
5
+ return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation") in {
6
+ "engine-v2",
7
+ "engine-v2_pro",
8
+ }
@@ -3166,11 +3166,12 @@ class S3Provider(S3Api, ServiceLifecycleHook):
3166
3166
  if "TagSet" not in tagging:
3167
3167
  raise MalformedXML()
3168
3168
 
3169
- validate_tag_set(tagging["TagSet"], type_set="bucket")
3169
+ tag_set = tagging["TagSet"] or []
3170
+ validate_tag_set(tag_set, type_set="bucket")
3170
3171
 
3171
3172
  # remove the previous tags before setting the new ones, it overwrites the whole TagSet
3172
3173
  store.TAGS.tags.pop(s3_bucket.bucket_arn, None)
3173
- store.TAGS.tag_resource(s3_bucket.bucket_arn, tags=tagging["TagSet"])
3174
+ store.TAGS.tag_resource(s3_bucket.bucket_arn, tags=tag_set)
3174
3175
 
3175
3176
  def get_bucket_tagging(
3176
3177
  self,
@@ -3220,12 +3221,13 @@ class S3Provider(S3Api, ServiceLifecycleHook):
3220
3221
  if "TagSet" not in tagging:
3221
3222
  raise MalformedXML()
3222
3223
 
3223
- validate_tag_set(tagging["TagSet"], type_set="object")
3224
+ tag_set = tagging["TagSet"] or []
3225
+ validate_tag_set(tag_set, type_set="object")
3224
3226
 
3225
3227
  key_id = get_unique_key_id(bucket, key, s3_object.version_id)
3226
3228
  # remove the previous tags before setting the new ones, it overwrites the whole TagSet
3227
3229
  store.TAGS.tags.pop(key_id, None)
3228
- store.TAGS.tag_resource(key_id, tags=tagging["TagSet"])
3230
+ store.TAGS.tag_resource(key_id, tags=tag_set)
3229
3231
  response = PutObjectTaggingOutput()
3230
3232
  if s3_object.version_id:
3231
3233
  response["VersionId"] = s3_object.version_id
localstack/version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '4.7.1.dev119'
32
- __version_tuple__ = version_tuple = (4, 7, 1, 'dev119')
31
+ __version__ = version = '4.7.1.dev121'
32
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev121')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.7.1.dev119
3
+ Version: 4.7.1.dev121
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=78Sf99fgH3ckJ20a9SMqsu01r1cm5GgcomkuY4yDMDo,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=W1_9VXh5wPFTzNO_85rq08h1KZ1AtW8bOhV6eFxBQ78,721
7
+ localstack/version.py,sha256=_EUhMG3SXtGNNnAgaBShXbgWc1kNcHATuqmaKZK48Xg,721
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
@@ -291,7 +291,7 @@ localstack/services/cloudformation/deployment_utils.py,sha256=YCWYGAKjZlmjKC7Vgt
291
291
  localstack/services/cloudformation/plugins.py,sha256=8E1i9U65RnjZJoXz214ceV8OXcnpHNU44unK3raXkWs,336
292
292
  localstack/services/cloudformation/provider.py,sha256=eQCfInXmlRrUw0Eqgp3WwyKH5nfoVd2QW_ei4Lq8iw0,53142
293
293
  localstack/services/cloudformation/provider_utils.py,sha256=QVIJPnaoY8BaQPQvfZUOgf-AYNAwVVH9hf9ZCtpCPLM,10054
294
- localstack/services/cloudformation/resource_provider.py,sha256=ORwN3rRow6XvxN6zZnly7FdzW75wsfEKapPx0yZM89g,23161
294
+ localstack/services/cloudformation/resource_provider.py,sha256=dfGfb3FitGJ5z95fvCphc8PFPrbUaAwybD0KWn_7t1E,23274
295
295
  localstack/services/cloudformation/service_models.py,sha256=FIk_n2TCWtpYZaUvORfvoKG4HlZZux3JD01npfB-Ejw,5153
296
296
  localstack/services/cloudformation/stores.py,sha256=vnv6ljC4g35RCKP3SnnhMG63Ig4W3uAlzTYu1Bw7Axc,5491
297
297
  localstack/services/cloudformation/engine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -311,14 +311,14 @@ localstack/services/cloudformation/engine/types.py,sha256=JQF2aM5DUtnJhvQ30RTaKv
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=wjU1keXKFvIc-23xEXIioe7ejKFHcuIV5QyzKac7JMA,67286
315
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=caQJ9reGmJ2EsJ2-bDVC30hLQQilXyBAsI7bJd2TYgI,11299
316
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=MaRNT5DIXJmMPFmESYtjCwWAMmfZAzaveM5JzmKdg10,29558
317
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=U7reKuxX6Qzd57xrdUyXPa5QXrL0HqawyM1JM4GofNo,53366
318
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=d9xOnWaCXxSwKbdtUFNzvCxBLpSOCBCY5awSbe_Hf3I,22761
319
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=ZRQ_AaIPX_sE40Ggx-JmJW0V1mIe09cKEVDsZTr30J8,7952
314
+ localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=AEJ5Hrot11dbMdKkAbaxdoYMrGR6Iu6rjN-H3MQpAfQ,67404
315
+ localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=V2I46erxD3JIZ61xHPO0wJ174ee-hZBTeLgmFiNKR3A,11773
316
+ localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=SuNFqeYRRN3wCvK_WsxxaqXMDjPXy_m0PWykGc-3Cig,27471
317
+ localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=R19GEsvDMkJeoNhy55Rv5paruzj6AKm48qXBgjFA8_Q,54673
318
+ localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=p5kw4C0MvgBt3uBGymvFPhLbo2zcHrnCVYPBZ0ksZKc,23332
319
+ localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=EUqL6y2Rx4lYURoXvEH4Pyk3p-xYlVHCDF3oM6xeu0g,8555
320
320
  localstack/services/cloudformation/engine/v2/change_set_model_visitor.py,sha256=ygUVPgM3b8SAXLLhLeGSD2k_Oo81ukFkug6bcmvRSJg,7843
321
- localstack/services/cloudformation/engine/v2/resolving.py,sha256=ot76GycQsw6Y9SvxB8sAlK7tRntJb5CTrKYqyEnfiHc,4002
321
+ localstack/services/cloudformation/engine/v2/resolving.py,sha256=CMQmaajmm19b3sA_9RiZuBe5wdAS6js5ESDLjeH81LY,3980
322
322
  localstack/services/cloudformation/models/__init__.py,sha256=da1PTClDMl-IBkrSvq6JC1lnS-K_BASzCvxVhNxN5Ls,13
323
323
  localstack/services/cloudformation/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
324
324
  localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py,sha256=yl92icivOV9o4vVcIh0SnB34hEoFjUOVRIAGMjrVPjU,2784
@@ -337,9 +337,9 @@ localstack/services/cloudformation/scaffolding/__main__.py,sha256=W4qA6eMNejKWLE
337
337
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=id7l43zsJsTgUyQ8F3jpfbpEoicc8GC6cB2ESEktDxc,7936
338
338
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
339
  localstack/services/cloudformation/v2/entities.py,sha256=JLL9oX15cxzY_U23sa0zySyzx20rEXpIUl9CuQMnCGw,9023
340
- localstack/services/cloudformation/v2/provider.py,sha256=oYXtW_L-ru2WYTzQW1bCpUiknf8E0GUmDFEezM6JexE,63814
340
+ localstack/services/cloudformation/v2/provider.py,sha256=nuWIPAdpur2WUQJ1KB96LGBmAkO_xDAmNgY1sm10DiU,63651
341
341
  localstack/services/cloudformation/v2/types.py,sha256=x_oDGQwxkViQ1fpcaSbBWiCODHZJAQgCej45EN-YZDs,957
342
- localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
342
+ localstack/services/cloudformation/v2/utils.py,sha256=BWEgPy2FT6peowyVfZ5WhkzfBYYtrNRHgZrRNZ3LeP4,190
343
343
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
344
344
  localstack/services/cloudwatch/alarm_scheduler.py,sha256=HPzQgZvDVXIXaEkjJ39L-jBwlOi_-ZlAyJ3D_suWngk,15761
345
345
  localstack/services/cloudwatch/cloudwatch_database_helper.py,sha256=IK_MgxG3xTkpKbBe-Buv_6wUuHEc3MGQOqMAqHoEOzk,17270
@@ -690,7 +690,7 @@ localstack/services/s3/exceptions.py,sha256=zQ6p5a1ROqI79gxTpTa-wktKu41d6cOdbgl2
690
690
  localstack/services/s3/models.py,sha256=4pc_sm986jhRWP3puO6yuFoNfKzroZvCwR0rlnXg3Dg,30779
691
691
  localstack/services/s3/notifications.py,sha256=3N2pnxZyQqIB41c-VPHOwlus9w7bvM1RrjXtWs6FMco,32581
692
692
  localstack/services/s3/presigned_url.py,sha256=Tfb49Ze7wphO67kXig8tvJ0JjaBlASUPwe3uZbL5c7I,39529
693
- localstack/services/s3/provider.py,sha256=3L-S5dzhi4ITL6KHvv81iTI7htCdZa8WG6lbznAW7MQ,198140
693
+ localstack/services/s3/provider.py,sha256=4NZ-dM7NrPSQEszp6AYuUx_Q5jP6dH88h_8t023K8CM,198184
694
694
  localstack/services/s3/utils.py,sha256=GlLoLe2cIZtauCX2fwRDKVr1PVVavtvY7WrrftIFmAs,39138
695
695
  localstack/services/s3/validation.py,sha256=oj9Ezh4YuzMIgpboOG8yUKtFYQIIc2XwJqHF6cEsbu0,19966
696
696
  localstack/services/s3/website_hosting.py,sha256=I4cE7omiN7EBQjdlvueSb_DaD8cwEZxeh7K-H_We30k,16672
@@ -1291,13 +1291,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1291
1291
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1292
1292
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1293
1293
  localstack/utils/xray/traceid.py,sha256=GKO-R2sMMjlrH2UaLPXlQlZ6flbE7ZKb6IZMtMu_M5U,1110
1294
- localstack_core-4.7.1.dev119.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1295
- localstack_core-4.7.1.dev119.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1296
- localstack_core-4.7.1.dev119.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1297
- localstack_core-4.7.1.dev119.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1298
- localstack_core-4.7.1.dev119.dist-info/METADATA,sha256=rfamBGE1Wrsun2KdXxgSySH010CECHLcn1Xpb1q3apU,5538
1299
- localstack_core-4.7.1.dev119.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
- localstack_core-4.7.1.dev119.dist-info/entry_points.txt,sha256=BALZ7ZgTqj1hVImoXiSWJu7rTGsMnx3dAjIp6fDDAg8,20817
1301
- localstack_core-4.7.1.dev119.dist-info/plux.json,sha256=2r8pGULmfxc5w7x8B1xQXtau68MlCxyFGOxASnhItJ8,21042
1302
- localstack_core-4.7.1.dev119.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1303
- localstack_core-4.7.1.dev119.dist-info/RECORD,,
1294
+ localstack_core-4.7.1.dev121.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1295
+ localstack_core-4.7.1.dev121.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1296
+ localstack_core-4.7.1.dev121.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1297
+ localstack_core-4.7.1.dev121.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1298
+ localstack_core-4.7.1.dev121.dist-info/METADATA,sha256=-c5u5TpzUYbecPX2ES8whH80dHf1KNIDN3ISh_9NKHo,5538
1299
+ localstack_core-4.7.1.dev121.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
+ localstack_core-4.7.1.dev121.dist-info/entry_points.txt,sha256=BALZ7ZgTqj1hVImoXiSWJu7rTGsMnx3dAjIp6fDDAg8,20817
1301
+ localstack_core-4.7.1.dev121.dist-info/plux.json,sha256=VX2y0gvweJhOg1piSp6h9CDAN0yvgrd_B4mXBhv0mE8,21042
1302
+ localstack_core-4.7.1.dev121.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1303
+ localstack_core-4.7.1.dev121.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "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::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "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::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "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::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "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::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin"], "localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_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", "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", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package"], "localstack.hooks.on_infra_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_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "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", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "eager_load_services=localstack.services.plugins:eager_load_services", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "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", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler"], "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.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.hooks.on_infra_ready": ["publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment", "_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.hooks.on_infra_shutdown": ["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", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "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", "sns:v2=localstack.services.providers:sns_v2", "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"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "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::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "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::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "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::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "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::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin"], "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", "sns:v2=localstack.services.providers:sns_v2", "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.hooks.on_infra_start": ["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", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_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", "_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", "_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", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler"], "localstack.packages": ["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", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "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", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_ready": ["publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment", "_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.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"]}