localstack-core 4.9.3.dev45__py3-none-any.whl → 4.9.3.dev57__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.

Potentially problematic release.


This version of localstack-core might be problematic. Click here for more details.

Files changed (25) hide show
  1. localstack/aws/api/ec2/__init__.py +526 -46
  2. localstack/services/apigateway/legacy/provider.py +23 -1
  3. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +0 -1
  4. localstack/services/cloudformation/v2/provider.py +6 -0
  5. localstack/services/s3/constants.py +0 -2
  6. localstack/services/s3/notifications.py +1 -1
  7. localstack/services/s3/presigned_url.py +13 -28
  8. localstack/services/s3/provider.py +4 -4
  9. localstack/services/s3/utils.py +2 -11
  10. localstack/testing/aws/cloudformation_utils.py +1 -1
  11. localstack/testing/pytest/in_memory_localstack.py +0 -4
  12. localstack/utils/files.py +31 -7
  13. localstack/utils/json.py +16 -2
  14. localstack/version.py +2 -2
  15. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/METADATA +14 -9
  16. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/RECORD +24 -24
  17. localstack_core-4.9.3.dev57.dist-info/plux.json +1 -0
  18. localstack_core-4.9.3.dev45.dist-info/plux.json +0 -1
  19. {localstack_core-4.9.3.dev45.data → localstack_core-4.9.3.dev57.data}/scripts/localstack +0 -0
  20. {localstack_core-4.9.3.dev45.data → localstack_core-4.9.3.dev57.data}/scripts/localstack-supervisor +0 -0
  21. {localstack_core-4.9.3.dev45.data → localstack_core-4.9.3.dev57.data}/scripts/localstack.bat +0 -0
  22. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/WHEEL +0 -0
  23. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/entry_points.txt +0 -0
  24. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/licenses/LICENSE.txt +0 -0
  25. {localstack_core-4.9.3.dev45.dist-info → localstack_core-4.9.3.dev57.dist-info}/top_level.txt +0 -0
@@ -323,8 +323,18 @@ class ApigatewayProvider(ApigatewayApi, ServiceLifecycleHook):
323
323
  tags: MapOfStringToString = None,
324
324
  **kwargs,
325
325
  ) -> ApiKey:
326
+ if name and len(name) > 1024:
327
+ raise BadRequestException("Invalid API Key name, can be at most 1024 characters.")
328
+ if value:
329
+ if len(value) > 128:
330
+ raise BadRequestException("API Key value exceeds maximum size of 128 characters")
331
+ elif len(value) < 20:
332
+ raise BadRequestException("API Key value should be at least 20 characters")
333
+ if description and len(description) > 125000:
334
+ raise BadRequestException("Invalid API Key description specified.")
326
335
  api_key = call_moto(context)
327
-
336
+ if name == "":
337
+ api_key.pop("name", None)
328
338
  # transform array of stage keys [{'restApiId': '0iscapk09u', 'stageName': 'dev'}] into
329
339
  # array of strings ['0iscapk09u/dev']
330
340
  stage_keys = api_key.get("stageKeys", [])
@@ -2420,6 +2430,10 @@ class ApigatewayProvider(ApigatewayApi, ServiceLifecycleHook):
2420
2430
  for api_key in api_keys:
2421
2431
  api_key.pop("value")
2422
2432
 
2433
+ if limit is not None:
2434
+ if limit < 1 or limit > 500:
2435
+ limit = None
2436
+
2423
2437
  item_list = PaginatedList(api_keys)
2424
2438
 
2425
2439
  def token_generator(item):
@@ -2444,6 +2458,14 @@ class ApigatewayProvider(ApigatewayApi, ServiceLifecycleHook):
2444
2458
  patch_operations: ListOfPatchOperation = None,
2445
2459
  **kwargs,
2446
2460
  ) -> ApiKey:
2461
+ for patch_op in patch_operations:
2462
+ if patch_op["path"] not in ("/description", "/enabled", "/name", "/customerId"):
2463
+ raise BadRequestException(
2464
+ f"Invalid patch path '{patch_op['path']}' specified for op '{patch_op['op']}'. Must be one of: [/description, /enabled, /name, /customerId]"
2465
+ )
2466
+
2467
+ if patch_op["path"] == "/description" and len(patch_op["value"]) > 125000:
2468
+ raise BadRequestException("Invalid API Key description specified.")
2447
2469
  response: ApiKey = call_moto(context)
2448
2470
  if "value" in response:
2449
2471
  response.pop("value", None)
@@ -576,7 +576,6 @@ class ChangeSetModelExecutor(ChangeSetModelPreproc):
576
576
  )
577
577
  # TODO: do we actually need this line?
578
578
  resolved_resource.update(extra_resource_properties)
579
-
580
579
  case OperationStatus.FAILED:
581
580
  reason = event.message
582
581
  LOG.warning(
@@ -1109,6 +1109,12 @@ class CloudformationProviderV2(CloudformationProvider, ServiceLifecycleHook):
1109
1109
 
1110
1110
  try:
1111
1111
  resource = stack.resolved_resources[logical_resource_id]
1112
+ if resource.get("ResourceStatus") not in [
1113
+ StackStatus.CREATE_COMPLETE,
1114
+ StackStatus.UPDATE_COMPLETE,
1115
+ StackStatus.ROLLBACK_COMPLETE,
1116
+ ]:
1117
+ raise KeyError
1112
1118
  except KeyError:
1113
1119
  raise ValidationError(
1114
1120
  f"Resource {logical_resource_id} does not exist for stack {stack_name}"
@@ -10,8 +10,6 @@ from localstack.aws.api.s3 import (
10
10
  )
11
11
  from localstack.aws.api.s3 import Type as GranteeType
12
12
 
13
- S3_VIRTUAL_HOST_FORWARDED_HEADER = "x-s3-vhost-forwarded-for"
14
-
15
13
  S3_UPLOAD_PART_MIN_SIZE = 5242880
16
14
  """
17
15
  This is minimum size allowed by S3 when uploading more than one part for a Multipart Upload, except for the last part
@@ -105,7 +105,7 @@ class S3EventNotificationContext:
105
105
  key_storage_class: StorageClass | None
106
106
 
107
107
  @classmethod
108
- def from_request_context_native(
108
+ def from_request_context(
109
109
  cls,
110
110
  request_context: RequestContext,
111
111
  s3_bucket: S3Bucket,
@@ -45,10 +45,8 @@ from localstack.services.s3.constants import (
45
45
  SIGNATURE_V4_PARAMS,
46
46
  )
47
47
  from localstack.services.s3.utils import (
48
- S3_VIRTUAL_HOST_FORWARDED_HEADER,
49
48
  capitalize_header_name_from_snake_case,
50
49
  extract_bucket_name_and_key_from_headers_and_path,
51
- forwarded_from_virtual_host_addressed_request,
52
50
  is_bucket_name_valid,
53
51
  is_presigned_url_request,
54
52
  uses_host_addressing,
@@ -567,34 +565,21 @@ class S3SigV4SignatureContext:
567
565
  self._query_parameters
568
566
  )
569
567
 
570
- if forwarded_from_virtual_host_addressed_request(self._headers):
571
- # FIXME: maybe move this so it happens earlier in the chain when using virtual host?
572
- if not is_bucket_name_valid(self._bucket):
573
- raise InvalidBucketName(BucketName=self._bucket)
574
- netloc = self._headers.get(S3_VIRTUAL_HOST_FORWARDED_HEADER)
575
- self.host = netloc
576
- self._original_host = netloc
577
- self.signed_headers["host"] = netloc
578
- # the request comes from the Virtual Host router, we need to remove the bucket from the path
568
+ netloc = urlparse.urlparse(self.request.url).netloc
569
+ self.host = netloc
570
+ self._original_host = netloc
571
+ if (host_addressed := uses_host_addressing(self._headers)) and not is_bucket_name_valid(
572
+ self._bucket
573
+ ):
574
+ raise InvalidBucketName(BucketName=self._bucket)
575
+
576
+ if not host_addressed and not self.request.path.startswith(f"/{self._bucket}"):
577
+ # if in path style, check that the path starts with the bucket
578
+ # our path has been sanitized, we should use the un-sanitized one
579
579
  splitted_path = self.request.path.split("/", maxsplit=2)
580
- self.path = f"/{splitted_path[-1]}"
581
-
580
+ self.path = f"/{self._bucket}/{splitted_path[-1]}"
582
581
  else:
583
- netloc = urlparse.urlparse(self.request.url).netloc
584
- self.host = netloc
585
- self._original_host = netloc
586
- if (host_addressed := uses_host_addressing(self._headers)) and not is_bucket_name_valid(
587
- self._bucket
588
- ):
589
- raise InvalidBucketName(BucketName=self._bucket)
590
-
591
- if not host_addressed and not self.request.path.startswith(f"/{self._bucket}"):
592
- # if in path style, check that the path starts with the bucket
593
- # our path has been sanitized, we should use the un-sanitized one
594
- splitted_path = self.request.path.split("/", maxsplit=2)
595
- self.path = f"/{self._bucket}/{splitted_path[-1]}"
596
- else:
597
- self.path = self.request.path
582
+ self.path = self.request.path
598
583
 
599
584
  # we need to URL encode the path, as the key needs to be urlencoded for the signature to match
600
585
  self.path = urlparse.quote(self.path)
@@ -384,7 +384,7 @@ class S3Provider(S3Api, ServiceLifecycleHook):
384
384
  """
385
385
  if s3_bucket.notification_configuration:
386
386
  if not s3_notif_ctx:
387
- s3_notif_ctx = S3EventNotificationContext.from_request_context_native(
387
+ s3_notif_ctx = S3EventNotificationContext.from_request_context(
388
388
  context,
389
389
  s3_bucket=s3_bucket,
390
390
  s3_object=s3_object,
@@ -1271,7 +1271,7 @@ class S3Provider(S3Api, ServiceLifecycleHook):
1271
1271
  delete_marker_id = generate_version_id(s3_bucket.versioning_status)
1272
1272
  delete_marker = S3DeleteMarker(key=key, version_id=delete_marker_id)
1273
1273
  s3_bucket.objects.set(key, delete_marker)
1274
- s3_notif_ctx = S3EventNotificationContext.from_request_context_native(
1274
+ s3_notif_ctx = S3EventNotificationContext.from_request_context(
1275
1275
  context,
1276
1276
  s3_bucket=s3_bucket,
1277
1277
  s3_object=delete_marker,
@@ -1374,7 +1374,7 @@ class S3Provider(S3Api, ServiceLifecycleHook):
1374
1374
  delete_marker_id = generate_version_id(s3_bucket.versioning_status)
1375
1375
  delete_marker = S3DeleteMarker(key=object_key, version_id=delete_marker_id)
1376
1376
  s3_bucket.objects.set(object_key, delete_marker)
1377
- s3_notif_ctx = S3EventNotificationContext.from_request_context_native(
1377
+ s3_notif_ctx = S3EventNotificationContext.from_request_context(
1378
1378
  context,
1379
1379
  s3_bucket=s3_bucket,
1380
1380
  s3_object=delete_marker,
@@ -2202,7 +2202,7 @@ class S3Provider(S3Api, ServiceLifecycleHook):
2202
2202
  # TODO: add a way to transition from ongoing-request=true to false? for now it is instant
2203
2203
  s3_object.restore = f'ongoing-request="false", expiry-date="{restore_expiration_date}"'
2204
2204
 
2205
- s3_notif_ctx_initiated = S3EventNotificationContext.from_request_context_native(
2205
+ s3_notif_ctx_initiated = S3EventNotificationContext.from_request_context(
2206
2206
  context,
2207
2207
  s3_bucket=s3_bucket,
2208
2208
  s3_object=s3_object,
@@ -7,6 +7,7 @@ import logging
7
7
  import re
8
8
  import time
9
9
  import zlib
10
+ from collections.abc import Mapping
10
11
  from enum import StrEnum
11
12
  from secrets import token_bytes
12
13
  from typing import Any, Literal, NamedTuple, Protocol
@@ -63,7 +64,6 @@ from localstack.services.s3.constants import (
63
64
  AUTHENTICATED_USERS_ACL_GRANTEE,
64
65
  CHECKSUM_ALGORITHMS,
65
66
  LOG_DELIVERY_ACL_GRANTEE,
66
- S3_VIRTUAL_HOST_FORWARDED_HEADER,
67
67
  SIGNATURE_V2_PARAMS,
68
68
  SIGNATURE_V4_PARAMS,
69
69
  SYSTEM_METADATA_SETTABLE_HEADERS,
@@ -522,7 +522,7 @@ def is_valid_canonical_id(canonical_id: str) -> bool:
522
522
  return False
523
523
 
524
524
 
525
- def uses_host_addressing(headers: dict[str, str]) -> str | None:
525
+ def uses_host_addressing(headers: Mapping[str, str]) -> str | None:
526
526
  """
527
527
  Determines if the request is targeting S3 with virtual host addressing
528
528
  :param headers: the request headers
@@ -551,15 +551,6 @@ def get_system_metadata_from_request(request: dict) -> Metadata:
551
551
  return metadata
552
552
 
553
553
 
554
- def forwarded_from_virtual_host_addressed_request(headers: dict[str, str]) -> bool:
555
- """
556
- Determines if the request was forwarded from a v-host addressing style into a path one
557
- """
558
- # we can assume that the host header we are receiving here is actually the header we originally received
559
- # from the client (because the edge service is forwarding the request in memory)
560
- return S3_VIRTUAL_HOST_FORWARDED_HEADER in headers
561
-
562
-
563
554
  def extract_bucket_name_and_key_from_headers_and_path(
564
555
  headers: dict[str, str], path: str
565
556
  ) -> tuple[str | None, str | None]:
@@ -29,7 +29,7 @@ def load_template_file(file_path: str | os.PathLike, *, path_ctx: str | os.PathL
29
29
  elif not file_path_obj.is_absolute():
30
30
  raise ValueError("Provided path must be absolute if no path_ctx is provided")
31
31
 
32
- return load_file(file_path_obj.absolute())
32
+ return load_file(file_path_obj.absolute(), strict=True)
33
33
 
34
34
 
35
35
  # TODO: TBH this utility really doesn't add anything, probably better to just remove it
@@ -63,8 +63,6 @@ def pytest_runtestloop(session: Session):
63
63
  return
64
64
  LOG.info("TEST_FORCE_LOCALSTACK_START is set, a Localstack instance will be created.")
65
65
 
66
- from localstack.utils.common import safe_requests
67
-
68
66
  if is_aws_cloud():
69
67
  localstack_config.DEFAULT_DELAY = 5
70
68
  localstack_config.DEFAULT_MAX_ATTEMPTS = 60
@@ -73,8 +71,6 @@ def pytest_runtestloop(session: Session):
73
71
  os.environ[ENV_INTERNAL_TEST_RUN] = "1"
74
72
  localstack_config.INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE = True
75
73
 
76
- safe_requests.verify_ssl = False
77
-
78
74
  from localstack.runtime import current
79
75
 
80
76
  _started.set()
localstack/utils/files.py CHANGED
@@ -80,9 +80,26 @@ def save_file(file, content, append=False, permissions=None):
80
80
  f.flush()
81
81
 
82
82
 
83
- def load_file(file_path: str, default=None, mode=None):
83
+ def load_file(
84
+ file_path: str | os.PathLike,
85
+ default: str | bytes | None = None,
86
+ mode: str | None = None,
87
+ strict: bool = False,
88
+ ) -> str | bytes | None:
89
+ """
90
+ Return file contents
91
+
92
+ :param file_path: path of the file
93
+ :param default: if strict=False then return this value if the file does not exist
94
+ :param mode: mode to open the file with (e.g. `r`, `rw`)
95
+ :param strict: raise an error if the file path is not a file
96
+ :return: the file contents
97
+ """
84
98
  if not os.path.isfile(file_path):
85
- return default
99
+ if strict:
100
+ raise FileNotFoundError(file_path)
101
+ else:
102
+ return default
86
103
  if not mode:
87
104
  mode = "r"
88
105
  with open(file_path, mode) as f:
@@ -288,7 +305,7 @@ def cleanup_tmp_files():
288
305
  del TMP_FILES[:]
289
306
 
290
307
 
291
- def new_tmp_file(suffix: str = None, dir: str = None) -> str:
308
+ def new_tmp_file(suffix: str | None = None, dir: str | None = None) -> str:
292
309
  """Return a path to a new temporary file."""
293
310
  tmp_file, tmp_path = tempfile.mkstemp(suffix=suffix, dir=dir)
294
311
  os.close(tmp_file)
@@ -296,8 +313,15 @@ def new_tmp_file(suffix: str = None, dir: str = None) -> str:
296
313
  return tmp_path
297
314
 
298
315
 
299
- def new_tmp_dir(dir: str = None):
300
- folder = new_tmp_file(dir=dir)
301
- rm_rf(folder)
302
- mkdir(folder)
316
+ def new_tmp_dir(dir: str | None = None, mode: int = 0o777) -> str:
317
+ """
318
+ Create a new temporary directory with the specified permissions. The directory is added to the tracked temporary
319
+ files.
320
+ :param dir: parent directory for the temporary directory to be created. Systems's default otherwise.
321
+ :param mode: file permission for the directory (default: 0o777)
322
+ :return: the absolute path of the created directory
323
+ """
324
+ folder = tempfile.mkdtemp(dir=dir)
325
+ TMP_FILES.append(folder)
326
+ idempotent_chmod(folder, mode=mode)
303
327
  return folder
localstack/utils/json.py CHANGED
@@ -169,10 +169,24 @@ def extract_jsonpath(value, path):
169
169
  return result
170
170
 
171
171
 
172
- def assign_to_path(target, path: str, value, delimiter: str = "."):
172
+ def assign_to_path(target: dict, path: str, value: any, delimiter: str = ".") -> dict:
173
+ """Assign the given value to a dict. If the path doesn't exist in the target dict, it will be created.
174
+ The delimiter can be used to provide a path with a different delimiter.
175
+
176
+ Examples:
177
+ - assign_to_path({}, "a", "b") => {"a": "b"}
178
+ - assign_to_path({}, "a.b.c", "d") => {"a": {"b": {"c": "d"}}}
179
+ - assign_to_path({}, "a.b/c", "d", delimiter="/") => {"a.b": {"c": "d"}}
180
+
181
+ """
173
182
  parts = path.strip(delimiter).split(delimiter)
183
+
184
+ if len(parts) == 1:
185
+ target[parts[0]] = value
186
+ return target
187
+
174
188
  path_to_parent = delimiter.join(parts[:-1])
175
- parent = extract_from_jsonpointer_path(target, path_to_parent, auto_create=True)
189
+ parent = extract_from_jsonpointer_path(target, path_to_parent, delimiter, auto_create=True)
176
190
  if not isinstance(parent, dict):
177
191
  LOG.debug(
178
192
  'Unable to find parent (type %s) for path "%s" in object: %s',
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.9.3.dev45'
32
- __version_tuple__ = version_tuple = (4, 9, 3, 'dev45')
31
+ __version__ = version = '4.9.3.dev57'
32
+ __version_tuple__ = version_tuple = (4, 9, 3, 'dev57')
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.9.3.dev45
3
+ Version: 4.9.3.dev57
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
@@ -15,7 +15,6 @@ Classifier: Topic :: Software Development :: Testing
15
15
  Classifier: Topic :: System :: Emulators
16
16
  Requires-Python: >=3.10
17
17
  License-File: LICENSE.txt
18
- Requires-Dist: build
19
18
  Requires-Dist: click>=7.1
20
19
  Requires-Dist: cachetools>=5.0
21
20
  Requires-Dist: cryptography
@@ -29,48 +28,53 @@ Requires-Dist: pyyaml>=5.1
29
28
  Requires-Dist: rich>=12.3.0
30
29
  Requires-Dist: requests>=2.20.0
31
30
  Requires-Dist: semver>=2.10
32
- Requires-Dist: tailer>=0.4.1
33
31
  Provides-Extra: base-runtime
34
- Requires-Dist: boto3==1.40.51; extra == "base-runtime"
35
- Requires-Dist: botocore==1.40.51; extra == "base-runtime"
32
+ Requires-Dist: boto3==1.40.55; extra == "base-runtime"
33
+ Requires-Dist: botocore==1.40.55; extra == "base-runtime"
36
34
  Requires-Dist: awscrt!=0.27.1,>=0.13.14; extra == "base-runtime"
37
35
  Requires-Dist: cbor2>=5.5.0; extra == "base-runtime"
38
36
  Requires-Dist: dnspython>=1.16.0; extra == "base-runtime"
39
37
  Requires-Dist: docker>=6.1.1; extra == "base-runtime"
40
38
  Requires-Dist: jsonpatch>=1.24; extra == "base-runtime"
39
+ Requires-Dist: jsonpointer>=3.0.0; extra == "base-runtime"
40
+ Requires-Dist: jsonschema>=4.25.1; extra == "base-runtime"
41
41
  Requires-Dist: hypercorn>=0.14.4; extra == "base-runtime"
42
42
  Requires-Dist: localstack-twisted>=23.0; extra == "base-runtime"
43
43
  Requires-Dist: openapi-core>=0.19.2; extra == "base-runtime"
44
44
  Requires-Dist: pyopenssl>=23.0.0; extra == "base-runtime"
45
+ Requires-Dist: python-dateutil>=2.9.0; extra == "base-runtime"
45
46
  Requires-Dist: readerwriterlock>=1.0.7; extra == "base-runtime"
46
47
  Requires-Dist: requests-aws4auth>=1.0; extra == "base-runtime"
48
+ Requires-Dist: typing-extensions>=4.15.0; extra == "base-runtime"
47
49
  Requires-Dist: urllib3>=2.0.7; extra == "base-runtime"
48
50
  Requires-Dist: Werkzeug>=3.1.3; extra == "base-runtime"
49
51
  Requires-Dist: xmltodict>=0.13.0; extra == "base-runtime"
50
52
  Requires-Dist: rolo>=0.7; extra == "base-runtime"
51
53
  Provides-Extra: runtime
52
54
  Requires-Dist: localstack-core[base-runtime]; extra == "runtime"
53
- Requires-Dist: awscli==1.42.51; extra == "runtime"
55
+ Requires-Dist: awscli==1.42.55; extra == "runtime"
54
56
  Requires-Dist: airspeed-ext>=0.6.3; extra == "runtime"
55
- Requires-Dist: kclpy-ext>=3.0.0; extra == "runtime"
56
57
  Requires-Dist: antlr4-python3-runtime==4.13.2; extra == "runtime"
57
58
  Requires-Dist: apispec>=5.1.1; extra == "runtime"
58
59
  Requires-Dist: aws-sam-translator>=1.15.1; extra == "runtime"
59
60
  Requires-Dist: crontab>=0.22.6; extra == "runtime"
60
61
  Requires-Dist: cryptography>=41.0.5; extra == "runtime"
62
+ Requires-Dist: jinja2>=3.1.6; extra == "runtime"
61
63
  Requires-Dist: jpype1>=1.6.0; extra == "runtime"
62
- Requires-Dist: json5>=0.9.11; extra == "runtime"
63
64
  Requires-Dist: jsonpath-ng>=1.6.1; extra == "runtime"
64
65
  Requires-Dist: jsonpath-rw>=1.4.0; extra == "runtime"
66
+ Requires-Dist: kclpy-ext>=3.0.0; extra == "runtime"
65
67
  Requires-Dist: moto-ext[all]>=5.1.12.post22; extra == "runtime"
66
68
  Requires-Dist: opensearch-py>=2.4.1; extra == "runtime"
69
+ Requires-Dist: pydantic>=2.11.9; extra == "runtime"
67
70
  Requires-Dist: pymongo>=4.2.0; extra == "runtime"
68
71
  Requires-Dist: pyopenssl>=23.0.0; extra == "runtime"
72
+ Requires-Dist: responses>=0.25.8; extra == "runtime"
69
73
  Provides-Extra: test
70
74
  Requires-Dist: localstack-core[runtime]; extra == "test"
71
75
  Requires-Dist: coverage[toml]>=5.5; extra == "test"
72
- Requires-Dist: deepdiff>=6.4.1; extra == "test"
73
76
  Requires-Dist: httpx[http2]>=0.25; extra == "test"
77
+ Requires-Dist: json5>=0.12.1; extra == "test"
74
78
  Requires-Dist: pluggy>=1.3.0; extra == "test"
75
79
  Requires-Dist: pytest>=7.4.2; extra == "test"
76
80
  Requires-Dist: pytest-split>=0.8.0; extra == "test"
@@ -83,6 +87,7 @@ Requires-Dist: localstack-snapshot>=0.1.1; extra == "test"
83
87
  Provides-Extra: dev
84
88
  Requires-Dist: localstack-core[test]; extra == "dev"
85
89
  Requires-Dist: coveralls>=3.3.1; extra == "dev"
90
+ Requires-Dist: deptry>=0.13.0; extra == "dev"
86
91
  Requires-Dist: Cython; extra == "dev"
87
92
  Requires-Dist: networkx>=2.8.4; extra == "dev"
88
93
  Requires-Dist: openapi-spec-validator>=0.7.1; extra == "dev"
@@ -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=VHmQ0XvHS_jKqeYDA8_sIz9N6eTxFg8wVs_XLbEhDEk,719
7
+ localstack/version.py,sha256=Cf3cyVS0vyE8hP_EWgo9igAG28dTqO3kdsW05REdwqU,719
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
@@ -30,7 +30,7 @@ localstack/aws/api/cloudwatch/__init__.py,sha256=EgYlhAU_w0D2E2VMd9jzjTnjwR5S9-A
30
30
  localstack/aws/api/config/__init__.py,sha256=5LWxjUmRzrmiiO_9S7CEQEAOyNfoplKRw37lMQNDUDY,145087
31
31
  localstack/aws/api/dynamodb/__init__.py,sha256=DrFVVZOiEPM2oidelJvhFlq_KFRkyu8OFTGdMG6eM6M,94576
32
32
  localstack/aws/api/dynamodbstreams/__init__.py,sha256=WUSvC51HIBnpDqDLQjCi2zh1HD1GccwsnpLiqcoftik,7316
33
- localstack/aws/api/ec2/__init__.py,sha256=98x3BwCPw11HvMGmVSMbmBF-aWLs4bCGYI3VcNEdUUE,961220
33
+ localstack/aws/api/ec2/__init__.py,sha256=TCVNm50o2cuAhG5vrvO9CvUCZ9q6RGq-zo_8_KYlmJM,978617
34
34
  localstack/aws/api/es/__init__.py,sha256=QQiin0n_ug9gl_tI6noSFBjdmaL4GVv4EOkvoQyOxrk,64252
35
35
  localstack/aws/api/events/__init__.py,sha256=j0hW_k2AeuMn9-1INuYSg6MUV1JRu5c0XuQb_3OU-Iw,61874
36
36
  localstack/aws/api/firehose/__init__.py,sha256=_lCSkVCQ4Y25EHtAAAmbfOjdVK1PlCkH5XeTGtCZPzk,58579
@@ -192,7 +192,7 @@ localstack/services/apigateway/legacy/context.py,sha256=Srs_q3YItn9ylzrR7W64JEGm
192
192
  localstack/services/apigateway/legacy/helpers.py,sha256=zEWCHvb7EnyT5uSFjnyIvrXTMfIq3m3BgNDnfEAORsw,27595
193
193
  localstack/services/apigateway/legacy/integration.py,sha256=5kmMuAumwkpYt6uGoJB08aesT-SjecZrWYO1hlrKiPo,48705
194
194
  localstack/services/apigateway/legacy/invocations.py,sha256=6zzau8rr-ww-6Yvh7SvT7nKvQVWuD0RumYWyhNGQfj8,15393
195
- localstack/services/apigateway/legacy/provider.py,sha256=6Z0MvrcCT7o6_OTygDhGVdonwDfGhLyL7TGK9zDav0w,134809
195
+ localstack/services/apigateway/legacy/provider.py,sha256=Jbe4KH1Cq1WXtrLzvL2VFzeiEsRxxyoH5dsjkoIModU,136042
196
196
  localstack/services/apigateway/legacy/router_asf.py,sha256=Usj-inyFvTLeDJgspQFl6Ztxcb5gT4gZHVam1XjE-BU,6096
197
197
  localstack/services/apigateway/legacy/templates.py,sha256=56fo6AoFexgXxAJL8heWLFhBeDTj5LZfSmRA3g-_9IY,15015
198
198
  localstack/services/apigateway/next_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -313,7 +313,7 @@ localstack/services/cloudformation/engine/yaml_parser.py,sha256=LQpAVq9Syze9jXUG
313
313
  localstack/services/cloudformation/engine/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
314
314
  localstack/services/cloudformation/engine/v2/change_set_model.py,sha256=FwpBgys6khq_FLabJVqrHQDEtSQN2zNVLtKWK4GBa54,67271
315
315
  localstack/services/cloudformation/engine/v2/change_set_model_describer.py,sha256=rUT0V1MmgMD1hqfC5ebUu5u5RplkWmSozNE1ab1osHc,12381
316
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=iw-yaa9MDMQgRMA3Da4zEbXb-niq8vLf48rU5F4cQHw,27498
316
+ localstack/services/cloudformation/engine/v2/change_set_model_executor.py,sha256=UolewpkpCX9IHjNEJqYNcV922o-odoYnrAona-For8w,27497
317
317
  localstack/services/cloudformation/engine/v2/change_set_model_preproc.py,sha256=_3oAbhJUg80VK_Yb_sEgXIIQTJ2wJJd-V9w6twkCjwU,58991
318
318
  localstack/services/cloudformation/engine/v2/change_set_model_transform.py,sha256=7ylip_9dpwRlbBl4npRkK0Iy6E8FzcoGTaf7nAv0l3k,23471
319
319
  localstack/services/cloudformation/engine/v2/change_set_model_validator.py,sha256=pyj4QmJVrDUgdnamAEJmglq9phX4gjh45N3K6wOU1q8,8120
@@ -337,7 +337,7 @@ 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=5LCHm2ltmBt-yoojSkwQgVJcdnE91T0jwF9olhZNNJM,9287
340
- localstack/services/cloudformation/v2/provider.py,sha256=KlKbtQHaswwVyKO9FFV2fZueGZIG0tBs8Y8v1IdzRDE,71066
340
+ localstack/services/cloudformation/v2/provider.py,sha256=g6n5EAQQ_Gp513PupWI8RQ0H87iM75OBOxAm-DXJnh0,71304
341
341
  localstack/services/cloudformation/v2/types.py,sha256=jsfvn2z6weqruaDvv6qtSILtFiOTRl9fIjl0vXvl108,1060
342
342
  localstack/services/cloudformation/v2/utils.py,sha256=U1-YK7BEfA2lRKuUzDUVQ_dXUXybTHciNZA1G3xuZI8,202
343
343
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -684,14 +684,14 @@ localstack/services/route53resolver/utils.py,sha256=ioMx7t3YmR4yWjCOBjw1b7Glf6dF
684
684
  localstack/services/s3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
685
685
  localstack/services/s3/checksums.py,sha256=lJavOPAcEkp1fLUnxmb2H1Ol2PeeQ1szX-VSqksdhPU,4832
686
686
  localstack/services/s3/codec.py,sha256=3Yvdw0_Qz-_iKE_JoYTKjlu8T8QrmFX4qE9KRdYOFzc,4821
687
- localstack/services/s3/constants.py,sha256=zZCTRowcMhQ3RHxQ7-8ZkXtQ1RcIBs2H77w5IoCgALo,4019
687
+ localstack/services/s3/constants.py,sha256=uNG8XMDAPVeRUaVWR2tJmdH18QOHe7GOZGfFZoU6tcg,3956
688
688
  localstack/services/s3/cors.py,sha256=m1YCEYAnHdHeHyMTqp4rJuHG1pxgXx9kVpwNtBdG3EA,13486
689
689
  localstack/services/s3/exceptions.py,sha256=zQ6p5a1ROqI79gxTpTa-wktKu41d6cOdbgl24FAoN-A,1942
690
690
  localstack/services/s3/models.py,sha256=4pc_sm986jhRWP3puO6yuFoNfKzroZvCwR0rlnXg3Dg,30779
691
- localstack/services/s3/notifications.py,sha256=OS3fJ8-B62pFVcvFbK7MePRVz1ykGQbuvvaG6h8niS8,32575
692
- localstack/services/s3/presigned_url.py,sha256=1GZMpPcKL9bvK_770wTrkNb4ivEzmvdWbW_L1cpD-pQ,39304
693
- localstack/services/s3/provider.py,sha256=ApfCc_28-r9B2t7Kj8Zy3WoDwzv4zmvMpjqPB8BF3fw,199564
694
- localstack/services/s3/utils.py,sha256=8yR-ax7qXGsBTz_X0eCX6oCELr_6L3FJ5vOtah_Rlqs,40529
691
+ localstack/services/s3/notifications.py,sha256=JRvZTs3YpEXX-tPdliarVKjKsp42fdzrTNOC51y2-8I,32568
692
+ localstack/services/s3/presigned_url.py,sha256=2rbkrEYMimmanUW6RQdYGSb9PGFDZa6MmLru8ZkBri8,38438
693
+ localstack/services/s3/provider.py,sha256=qJ9PBdvnt2aqlmiGp6lEt2SE5Z1a4Kjcizz2PWuY-UQ,199536
694
+ localstack/services/s3/utils.py,sha256=I_vEKpJxm_yqJkWihvQTTVSVl5R7zVThV0WgHrqRs-4,40088
695
695
  localstack/services/s3/validation.py,sha256=n4XdJLJdGddKd9JFBjtbRHaPzzTW8H1I_1uQS4N_w1s,20202
696
696
  localstack/services/s3/website_hosting.py,sha256=I4cE7omiN7EBQjdlvueSb_DaD8cwEZxeh7K-H_We30k,16672
697
697
  localstack/services/s3/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1169,7 +1169,7 @@ localstack/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
1169
1169
  localstack/testing/config.py,sha256=3rRbrM9v1RnbHhwOGTvcymDB7Qs1KMxEgaNHwKpOcb4,1239
1170
1170
  localstack/testing/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1171
1171
  localstack/testing/aws/asf_utils.py,sha256=gt94PW5r4jnAYPQqAXZjPnwaSDsz5wCAsKYVC6L9MGk,8129
1172
- localstack/testing/aws/cloudformation_utils.py,sha256=alTnLbTosyJVhm0CU-OLV_CbLPARLukdAU6SoclLLoY,1466
1172
+ localstack/testing/aws/cloudformation_utils.py,sha256=o1-Adm5fF9yuEhIx-xSuXPM1hzzST6SHLqk_2GDA_xk,1479
1173
1173
  localstack/testing/aws/eventbus_utils.py,sha256=iD9fTRlVML8NEMIL3_3UxE3gxs6MBCRht09VozNf52w,1733
1174
1174
  localstack/testing/aws/lambda_utils.py,sha256=oLUP4kWythvkS5wVENoo-BZQ3t_vljfl1K_6Ea4vMnQ,12360
1175
1175
  localstack/testing/aws/util.py,sha256=h3Cc53imm-fqTxb8nOwUoyJZbuCRJqyzRBjKMyB8vIA,8938
@@ -1181,7 +1181,7 @@ localstack/testing/pytest/filters.py,sha256=4PUUj6B-L8leWE00qzS0LP76LHZ3eiycM9jT
1181
1181
  localstack/testing/pytest/find_orphaned_snapshots.py,sha256=-abDUtXa2-9PkZBDjU9XxQkT7i0dATXnFR2GzsX0TFc,1336
1182
1182
  localstack/testing/pytest/fixture_conflicts.py,sha256=cCWOEwO5clVRFseFS0_9wH5v47n_x4OQeIfVXHJvSOU,1497
1183
1183
  localstack/testing/pytest/fixtures.py,sha256=hbHYxwDo3zUOcGm5ZUdTx_08lJ9Z7Jpe46sarFF2lAs,94405
1184
- localstack/testing/pytest/in_memory_localstack.py,sha256=y0sm_1Nb-hUW2VHj_Nu74ohRv3E6y8Cqey1dJUxrU_g,3335
1184
+ localstack/testing/pytest/in_memory_localstack.py,sha256=GDR-VEarQWROfHqF4BHbo4ENI5bYmXuMFqY0jhHWF7Y,3242
1185
1185
  localstack/testing/pytest/marker_report.py,sha256=_GOdUQQ5e-FUdw-26rHJ3B13qHrM9m4qGuzKvW2CdsE,5549
1186
1186
  localstack/testing/pytest/marking.py,sha256=S1MkyZVIx9wAX6UxXf_cCY829FZ7tH9m9bINitggH-I,8916
1187
1187
  localstack/testing/pytest/metric_collection.py,sha256=mwKhqY5URNkZWle_H5LDGw--EUN7_Qq9A_O6a-hNsU0,2323
@@ -1226,13 +1226,13 @@ localstack/utils/crypto.py,sha256=IEPV_IqMckDAoP8JrfmDQYIP9LQPlZB5mC9_WFb2CZs,72
1226
1226
  localstack/utils/diagnose.py,sha256=31rxZlYSNIll2rqF9p6l7qyAJJhsXkoF5q4sBu6LYOY,4677
1227
1227
  localstack/utils/docker_utils.py,sha256=Z2IfnB2h5U6mzd8Bsrdo2Cw7Sv1KVYCWLA0DUsB39co,9787
1228
1228
  localstack/utils/event_matcher.py,sha256=_DtCZI0ba4Zcit_-TwCUSIG_NXiYgIjmWbuKuMrsZkk,2024
1229
- localstack/utils/files.py,sha256=5gIVWHXbybhnJ1nleiMEgTiWNcK61s6jCpOX03NnxcM,9472
1229
+ localstack/utils/files.py,sha256=p4irp9v9pgAO2e9nxzGYdswx6fSU1r2jXDfUre_IGSM,10450
1230
1230
  localstack/utils/functions.py,sha256=qGMyHxtXVgE3h3cMrnlOD2T85YuAlrXCUw-PO8Aic3g,2980
1231
1231
  localstack/utils/http.py,sha256=a5Wy8G54wy8b-V6uzsNC1nmileMCVe5KT9ahWkF24gs,11667
1232
1232
  localstack/utils/id_generator.py,sha256=ncGLyjA8QOy-2n16bBf3B_oTI1Kck1-RJcTLcJEvQHA,1697
1233
1233
  localstack/utils/iputils.py,sha256=L89jtcvs5ugeAiBvBXKSqnmm2E_huMCIitCfg2AdE5s,2111
1234
1234
  localstack/utils/java.py,sha256=3a5lN_j6wOxAR_OVAMtyPkX4_FDRbl5usqGgabQRs3k,3099
1235
- localstack/utils/json.py,sha256=4T453CymA679JGwgvDbhLDKzbry7nLdYQ6WUlil6uYE,6272
1235
+ localstack/utils/json.py,sha256=J_5X9JBTuPrxCNHTAgYCE83RWMmWwX0o0w32zfEdqiA,6786
1236
1236
  localstack/utils/net.py,sha256=a7vHgENpxlXpXLT224wKBEsShUeLOjFDQPQLueX03F8,19903
1237
1237
  localstack/utils/no_exit_argument_parser.py,sha256=B4APcRIzioPSjWgogQLFrim7mWMB2QD1KCIaMCpBwww,799
1238
1238
  localstack/utils/numbers.py,sha256=qmyiqCiuC7J1aMyxLMJSRQjhnm7spYf1IoLl-McJfN0,1453
@@ -1297,13 +1297,13 @@ localstack/utils/server/tcp_proxy.py,sha256=y2NJAmvftTiAYsLU_8qe4W5LGqwUw21i90Pu
1297
1297
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1298
1298
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1299
1299
  localstack/utils/xray/traceid.py,sha256=GKO-R2sMMjlrH2UaLPXlQlZ6flbE7ZKb6IZMtMu_M5U,1110
1300
- localstack_core-4.9.3.dev45.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1301
- localstack_core-4.9.3.dev45.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1302
- localstack_core-4.9.3.dev45.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1303
- localstack_core-4.9.3.dev45.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1304
- localstack_core-4.9.3.dev45.dist-info/METADATA,sha256=TiNFiJzvD3ArAyVc9Vs5Z4pcYtvYy6-yVRJuxQwXZDw,5539
1305
- localstack_core-4.9.3.dev45.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1306
- localstack_core-4.9.3.dev45.dist-info/entry_points.txt,sha256=5IoyjalZoY-PWY5Lk_AeEjEEQ-rKQJhijLe697GVlnM,20953
1307
- localstack_core-4.9.3.dev45.dist-info/plux.json,sha256=4m2GuK4PVCnYgvZkp41ah-81Xmk5itdJajupBniIzXw,21181
1308
- localstack_core-4.9.3.dev45.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1309
- localstack_core-4.9.3.dev45.dist-info/RECORD,,
1300
+ localstack_core-4.9.3.dev57.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1301
+ localstack_core-4.9.3.dev57.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1302
+ localstack_core-4.9.3.dev57.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1303
+ localstack_core-4.9.3.dev57.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1304
+ localstack_core-4.9.3.dev57.dist-info/METADATA,sha256=QN8xUTfEYxmrxy9iTJDDG7h1M9vzCpWG5A649Yc3FZk,5885
1305
+ localstack_core-4.9.3.dev57.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1306
+ localstack_core-4.9.3.dev57.dist-info/entry_points.txt,sha256=5IoyjalZoY-PWY5Lk_AeEjEEQ-rKQJhijLe697GVlnM,20953
1307
+ localstack_core-4.9.3.dev57.dist-info/plux.json,sha256=AK0GEhgAeFEGv0YYFXnJ_tnssI0YpKVz3UGkgoEHpL4,21181
1308
+ localstack_core-4.9.3.dev57.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1309
+ localstack_core-4.9.3.dev57.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "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::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "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::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "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::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "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::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "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::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "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::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin"], "localstack.hooks.on_infra_shutdown": ["publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "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", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "stop_server=localstack.dns.plugins:stop_server"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.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", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "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", "eager_load_services=localstack.services.plugins:eager_load_services", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger"], "localstack.packages": ["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", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package"], "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.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.utils.catalog": ["aws-catalog-remote-state=localstack.utils.catalog.catalog:AwsCatalogRemoteStatePlugin", "aws-catalog-runtime-only=localstack.utils.catalog.catalog:AwsCatalogRuntimePlugin"], "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.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:engine-legacy=localstack.services.providers:cloudformation", "cloudformation:default=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"]}