localstack-core 4.5.1.dev60__py3-none-any.whl → 4.5.1.dev62__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.
@@ -63,7 +63,12 @@ class DownloadInstaller(ExecutableInstaller):
63
63
 
64
64
 
65
65
  class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
66
- def __init__(self, name: str, version: str, extract_single_directory: bool = False):
66
+ def __init__(
67
+ self,
68
+ name: str,
69
+ version: str,
70
+ extract_single_directory: bool = False,
71
+ ):
67
72
  """
68
73
  :param name: technical package name, f.e. "opensearch"
69
74
  :param version: version of the package to install
@@ -78,6 +83,16 @@ class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
78
83
  def _get_download_url(self) -> str:
79
84
  raise NotImplementedError()
80
85
 
86
+ def _get_checksum_url(self) -> str | None:
87
+ """
88
+ Checksum URL for the archive. This is used to verify the integrity of the downloaded archive.
89
+ This method can be implemented by subclasses to provide the correct URL for the checksum file.
90
+ If not implemented, checksum verification will be skipped.
91
+
92
+ :return: URL to the checksum file for the archive, or None if not available.
93
+ """
94
+ return None
95
+
81
96
  def get_installed_dir(self) -> str | None:
82
97
  installed_dir = super().get_installed_dir()
83
98
  subdir = self._get_archive_subdir()
@@ -107,29 +122,55 @@ class ArchiveDownloadAndExtractInstaller(ExecutableInstaller):
107
122
  return self._get_install_marker_path(install_dir)
108
123
  return None
109
124
 
110
- def _install(self, target: InstallTarget) -> None:
125
+ def _handle_single_directory_extraction(self, target_directory: str) -> None:
126
+ """
127
+ Handle extraction of archives that contain a single root directory.
128
+ Moves the contents up one level if extract_single_directory is True.
129
+
130
+ :param target_directory: The target extraction directory
131
+ :return: None
132
+ """
133
+ if not self.extract_single_directory:
134
+ return
135
+
136
+ dir_contents = os.listdir(target_directory)
137
+ if len(dir_contents) != 1:
138
+ return
139
+ target_subdir = os.path.join(target_directory, dir_contents[0])
140
+ if not os.path.isdir(target_subdir):
141
+ return
142
+ os.rename(target_subdir, f"{target_directory}.backup")
143
+ rm_rf(target_directory)
144
+ os.rename(f"{target_directory}.backup", target_directory)
145
+
146
+ def _download_archive(
147
+ self,
148
+ target: InstallTarget,
149
+ download_url: str,
150
+ ) -> None:
111
151
  target_directory = self._get_install_dir(target)
112
152
  mkdir(target_directory)
113
- download_url = self._get_download_url()
153
+ download_url = download_url or self._get_download_url()
114
154
  archive_name = os.path.basename(download_url)
115
155
  archive_path = os.path.join(config.dirs.tmp, archive_name)
116
- download_and_extract(
117
- download_url,
118
- retries=3,
119
- tmp_archive=archive_path,
120
- target_dir=target_directory,
121
- )
122
- rm_rf(archive_path)
123
- if self.extract_single_directory:
124
- dir_contents = os.listdir(target_directory)
125
- if len(dir_contents) != 1:
126
- return
127
- target_subdir = os.path.join(target_directory, dir_contents[0])
128
- if not os.path.isdir(target_subdir):
129
- return
130
- os.rename(target_subdir, f"{target_directory}.backup")
131
- rm_rf(target_directory)
132
- os.rename(f"{target_directory}.backup", target_directory)
156
+
157
+ # Get checksum info if available
158
+ checksum_url = self._get_checksum_url()
159
+
160
+ try:
161
+ download_and_extract(
162
+ download_url,
163
+ retries=3,
164
+ tmp_archive=archive_path,
165
+ target_dir=target_directory,
166
+ checksum_url=checksum_url,
167
+ )
168
+ self._handle_single_directory_extraction(target_directory)
169
+ finally:
170
+ rm_rf(archive_path)
171
+
172
+ def _install(self, target: InstallTarget) -> None:
173
+ self._download_archive(target, self._get_download_url())
133
174
 
134
175
 
135
176
  class PermissionDownloadInstaller(DownloadInstaller, ABC):
@@ -9,7 +9,9 @@ from localstack.utils.platform import Arch, get_arch
9
9
  ARCH_MAPPING = {Arch.amd64: "linux64", Arch.arm64: "linuxarm64"}
10
10
 
11
11
  # Download URL template for ffmpeg 7.1 LGPL builds from BtbN GitHub Releases
12
- FFMPEG_STATIC_BIN_URL = "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-n{version}-latest-{arch}-lgpl-{version}.tar.xz"
12
+ FFMPEG_BASE_URL = "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest"
13
+ FFMPEG_STATIC_BIN_URL = FFMPEG_BASE_URL + "/ffmpeg-n{version}-latest-{arch}-lgpl-{version}.tar.xz"
14
+ FFMPEG_STATIC_CHECKSUM_URL = FFMPEG_BASE_URL + "/checksums.sha256"
13
15
 
14
16
 
15
17
  class FfmpegPackage(Package["FfmpegPackageInstaller"]):
@@ -42,5 +44,8 @@ class FfmpegPackageInstaller(ArchiveDownloadAndExtractInstaller):
42
44
  def get_ffprobe_path(self) -> str:
43
45
  return os.path.join(self.get_installed_dir(), "bin", "ffprobe") # type: ignore[arg-type]
44
46
 
47
+ def _get_checksum_url(self) -> str | None:
48
+ return FFMPEG_STATIC_CHECKSUM_URL
49
+
45
50
 
46
51
  ffmpeg_package = FfmpegPackage()
@@ -11,6 +11,9 @@ TERRAFORM_VERSION = os.getenv("TERRAFORM_VERSION", "1.5.7")
11
11
  TERRAFORM_URL_TEMPLATE = (
12
12
  "https://releases.hashicorp.com/terraform/{version}/terraform_{version}_{os}_{arch}.zip"
13
13
  )
14
+ TERRAFORM_CHECKSUM_URL_TEMPLATE = (
15
+ "https://releases.hashicorp.com/terraform/{version}/terraform_{version}_SHA256SUMS"
16
+ )
14
17
 
15
18
 
16
19
  class TerraformPackage(Package["TerraformPackageInstaller"]):
@@ -37,5 +40,8 @@ class TerraformPackageInstaller(ArchiveDownloadAndExtractInstaller):
37
40
  super()._install(target)
38
41
  chmod_r(self.get_executable_path(), 0o777) # type: ignore[arg-type]
39
42
 
43
+ def _get_checksum_url(self) -> str | None:
44
+ return TERRAFORM_CHECKSUM_URL_TEMPLATE.format(version=TERRAFORM_VERSION)
45
+
40
46
 
41
47
  terraform_package = TerraformPackage()
@@ -31,6 +31,7 @@ from localstack.utils.strings import long_uid, short_uid
31
31
 
32
32
 
33
33
  class ResolvedResource(TypedDict):
34
+ Type: str
34
35
  Properties: dict
35
36
 
36
37
 
@@ -190,6 +191,9 @@ class Stack:
190
191
  result["Outputs"] = describe_outputs
191
192
  return result
192
193
 
194
+ def is_active(self) -> bool:
195
+ return self.status != StackStatus.DELETE_COMPLETE
196
+
193
197
 
194
198
  class ChangeSetRequestPayload(TypedDict, total=False):
195
199
  ChangeSetName: str
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  import logging
3
+ from collections import defaultdict
3
4
  from datetime import datetime, timezone
4
5
  from typing import Any, Optional
5
6
 
@@ -23,6 +24,8 @@ from localstack.aws.api.cloudformation import (
23
24
  DisableRollback,
24
25
  ExecuteChangeSetOutput,
25
26
  ExecutionStatus,
27
+ GetTemplateSummaryInput,
28
+ GetTemplateSummaryOutput,
26
29
  IncludePropertyValues,
27
30
  InvalidChangeSetStatusException,
28
31
  LogicalResourceId,
@@ -211,9 +214,7 @@ class CloudformationProviderV2(CloudformationProvider):
211
214
  stack_candidates: list[Stack] = [
212
215
  s for stack_arn, s in state.stacks_v2.items() if s.stack_name == stack_name
213
216
  ]
214
- active_stack_candidates = [
215
- s for s in stack_candidates if self._stack_status_is_active(s.status)
216
- ]
217
+ active_stack_candidates = [s for s in stack_candidates if s.is_active()]
217
218
 
218
219
  # on a CREATE an empty Stack should be generated if we didn't find an active one
219
220
  if not active_stack_candidates and change_set_type == ChangeSetType.CREATE:
@@ -565,6 +566,67 @@ class CloudformationProviderV2(CloudformationProvider):
565
566
  raise StackNotFoundError(stack_name)
566
567
  return DescribeStackEventsOutput(StackEvents=stack.events)
567
568
 
569
+ @handler("GetTemplateSummary", expand=False)
570
+ def get_template_summary(
571
+ self,
572
+ context: RequestContext,
573
+ request: GetTemplateSummaryInput,
574
+ ) -> GetTemplateSummaryOutput:
575
+ state = get_cloudformation_store(context.account_id, context.region)
576
+ stack_name = request.get("StackName")
577
+
578
+ if stack_name:
579
+ stack = find_stack_v2(state, stack_name)
580
+ if not stack:
581
+ raise StackNotFoundError(stack_name)
582
+ template = stack.template
583
+ else:
584
+ template_body = request.get("TemplateBody")
585
+ # s3 or secretsmanager url
586
+ template_url = request.get("TemplateURL")
587
+
588
+ # validate and resolve template
589
+ if template_body and template_url:
590
+ raise ValidationError(
591
+ "Specify exactly one of 'TemplateBody' or 'TemplateUrl'"
592
+ ) # TODO: check proper message
593
+
594
+ if not template_body and not template_url:
595
+ raise ValidationError(
596
+ "Specify exactly one of 'TemplateBody' or 'TemplateUrl'"
597
+ ) # TODO: check proper message
598
+
599
+ template_body = api_utils.extract_template_body(request)
600
+ template = template_preparer.parse_template(template_body)
601
+
602
+ id_summaries = defaultdict(list)
603
+ for resource_id, resource in template["Resources"].items():
604
+ res_type = resource["Type"]
605
+ id_summaries[res_type].append(resource_id)
606
+
607
+ summarized_parameters = []
608
+ for parameter_id, parameter_body in template.get("Parameters", {}).items():
609
+ summarized_parameters.append(
610
+ {
611
+ "ParameterKey": parameter_id,
612
+ "DefaultValue": parameter_body.get("Default"),
613
+ "ParameterType": parameter_body["Type"],
614
+ "Description": parameter_body.get("Description"),
615
+ }
616
+ )
617
+ result = GetTemplateSummaryOutput(
618
+ Parameters=summarized_parameters,
619
+ Metadata=template.get("Metadata"),
620
+ ResourceIdentifierSummaries=[
621
+ {"ResourceType": key, "LogicalResourceIds": values}
622
+ for key, values in id_summaries.items()
623
+ ],
624
+ ResourceTypes=list(id_summaries.keys()),
625
+ Version=template.get("AWSTemplateFormatVersion", "2010-09-09"),
626
+ )
627
+
628
+ return result
629
+
568
630
  @handler("UpdateStack", expand=False)
569
631
  def update_stack(
570
632
  self,
@@ -15,6 +15,7 @@ from localstack.utils.files import load_file, mkdir, new_tmp_file, rm_rf, save_f
15
15
  from localstack.utils.http import download
16
16
  from localstack.utils.run import run
17
17
 
18
+ from .checksum import verify_local_file_with_checksum_url
18
19
  from .run import is_command_available
19
20
  from .strings import truncate
20
21
 
@@ -176,7 +177,22 @@ def download_and_extract(
176
177
  retries: Optional[int] = 0,
177
178
  sleep: Optional[int] = 3,
178
179
  tmp_archive: Optional[str] = None,
180
+ checksum_url: Optional[str] = None,
179
181
  ) -> None:
182
+ """
183
+ Download and extract an archive to a target directory with optional checksum verification.
184
+
185
+ Checksum verification is only performed if a `checksum_url` is provided.
186
+ Else, the archive is downloaded and extracted without verification.
187
+
188
+ :param archive_url: URL of the archive to download
189
+ :param target_dir: Directory to extract the archive contents to
190
+ :param retries: Number of download retries (default: 0)
191
+ :param sleep: Sleep time between retries in seconds (default: 3)
192
+ :param tmp_archive: Optional path for the temporary archive file
193
+ :param checksum_url: Optional URL of the checksum file for verification
194
+ :return: None
195
+ """
180
196
  mkdir(target_dir)
181
197
 
182
198
  _, ext = os.path.splitext(tmp_archive or archive_url)
@@ -204,6 +220,19 @@ def download_and_extract(
204
220
  if os.path.getsize(tmp_archive) <= 0:
205
221
  raise Exception("Failed to download archive from %s: . Retries exhausted", archive_url)
206
222
 
223
+ # Verify checksum if provided
224
+ if checksum_url:
225
+ LOG.info("Verifying archive integrity...")
226
+ try:
227
+ verify_local_file_with_checksum_url(
228
+ file_path=tmp_archive,
229
+ checksum_url=checksum_url,
230
+ )
231
+ except Exception as e:
232
+ # clean up the corrupted download
233
+ rm_rf(tmp_archive)
234
+ raise e
235
+
207
236
  if ext == ".zip":
208
237
  unzip(tmp_archive, target_dir)
209
238
  elif ext in (
@@ -217,11 +246,26 @@ def download_and_extract(
217
246
  raise Exception(f"Unsupported archive format: {ext}")
218
247
 
219
248
 
220
- def download_and_extract_with_retry(archive_url, tmp_archive, target_dir):
249
+ def download_and_extract_with_retry(
250
+ archive_url,
251
+ tmp_archive,
252
+ target_dir,
253
+ checksum_url: Optional[str] = None,
254
+ ):
221
255
  try:
222
- download_and_extract(archive_url, target_dir, tmp_archive=tmp_archive)
256
+ download_and_extract(
257
+ archive_url,
258
+ target_dir,
259
+ tmp_archive=tmp_archive,
260
+ checksum_url=checksum_url,
261
+ )
223
262
  except Exception as e:
224
263
  # try deleting and re-downloading the zip file
225
264
  LOG.info("Unable to extract file, re-downloading ZIP archive %s: %s", tmp_archive, e)
226
265
  rm_rf(tmp_archive)
227
- download_and_extract(archive_url, target_dir, tmp_archive=tmp_archive)
266
+ download_and_extract(
267
+ archive_url,
268
+ target_dir,
269
+ tmp_archive=tmp_archive,
270
+ checksum_url=checksum_url,
271
+ )
@@ -0,0 +1,313 @@
1
+ import hashlib
2
+ import logging
3
+ import os
4
+ import re
5
+ import tempfile
6
+ from abc import ABC, abstractmethod
7
+
8
+ from localstack.utils.files import load_file, rm_rf
9
+
10
+ # Setup logger
11
+ LOG = logging.getLogger(__name__)
12
+
13
+
14
+ class ChecksumException(Exception):
15
+ """Base exception for checksum errors."""
16
+
17
+ pass
18
+
19
+
20
+ class ChecksumFormat(ABC):
21
+ """Abstract base class for checksum format parsers."""
22
+
23
+ @abstractmethod
24
+ def can_parse(self, content: str) -> bool:
25
+ """
26
+ Check if this parser can handle the given content.
27
+
28
+ :param content: The content to check
29
+ :return: True if parser can handle content, False otherwise
30
+ """
31
+ pass
32
+
33
+ @abstractmethod
34
+ def parse(self, content: str) -> dict[str, str]:
35
+ """
36
+ Parse the content and return filename to checksum mapping.
37
+
38
+ :param content: The content to parse
39
+ :return: Dictionary mapping filenames to checksums
40
+ """
41
+ pass
42
+
43
+
44
+ class StandardFormat(ChecksumFormat):
45
+ """
46
+ Handles standard checksum format.
47
+
48
+ Supports formats like:
49
+
50
+ * ``checksum filename``
51
+ * ``checksum *filename``
52
+ """
53
+
54
+ def can_parse(self, content: str) -> bool:
55
+ lines = content.strip().split("\n")
56
+ for line in lines[:5]: # Check first 5 lines
57
+ if re.match(r"^[a-fA-F0-9]{32,128}\s+\S+", line.strip()):
58
+ return True
59
+ return False
60
+
61
+ def parse(self, content: str) -> dict[str, str]:
62
+ checksums = {}
63
+ for line in content.strip().split("\n"):
64
+ line = line.strip()
65
+ if not line or line.startswith("#"):
66
+ continue
67
+
68
+ # Match: checksum (whitespace) filename
69
+ match = re.match(r"^([a-fA-F0-9]{32,128})\s+(\*?)(.+)$", line)
70
+ if match:
71
+ checksum, star, filename = match.groups()
72
+ checksums[filename.strip()] = checksum.lower()
73
+
74
+ return checksums
75
+
76
+
77
+ class BSDFormat(ChecksumFormat):
78
+ """
79
+ Handles BSD-style checksum format.
80
+
81
+ Format: ``SHA512 (filename) = checksum``
82
+ """
83
+
84
+ def can_parse(self, content: str) -> bool:
85
+ lines = content.strip().split("\n")
86
+ for line in lines[:5]:
87
+ if re.match(r"^(MD5|SHA1|SHA256|SHA512)\s*\(.+\)\s*=\s*[a-fA-F0-9]+", line):
88
+ return True
89
+ return False
90
+
91
+ def parse(self, content: str) -> dict[str, str]:
92
+ checksums = {}
93
+ for line in content.strip().split("\n"):
94
+ line = line.strip()
95
+ if not line:
96
+ continue
97
+
98
+ # Match: ALGORITHM (filename) = checksum
99
+ match = re.match(r"^(MD5|SHA1|SHA256|SHA512)\s*\((.+)\)\s*=\s*([a-fA-F0-9]+)$", line)
100
+ if match:
101
+ algo, filename, checksum = match.groups()
102
+ checksums[filename.strip()] = checksum.lower()
103
+
104
+ return checksums
105
+
106
+
107
+ class ApacheBSDFormat(ChecksumFormat):
108
+ """
109
+ Handles Apache's BSD-style format with split checksums.
110
+
111
+ Format::
112
+
113
+ filename: CHECKSUM_PART1
114
+ CHECKSUM_PART2
115
+ CHECKSUM_PART3
116
+ """
117
+
118
+ def can_parse(self, content: str) -> bool:
119
+ lines = content.strip().split("\n")
120
+ if lines and ":" in lines[0]:
121
+ # Check if it looks like filename: hex_data
122
+ parts = lines[0].split(":", 1)
123
+ if len(parts) == 2 and re.search(r"[a-fA-F0-9\s]+", parts[1]):
124
+ return True
125
+ return False
126
+
127
+ def parse(self, content: str) -> dict[str, str]:
128
+ checksums = {}
129
+ lines = content.strip().split("\n")
130
+
131
+ current_file = None
132
+ checksum_parts = []
133
+
134
+ for line in lines:
135
+ if ":" in line and not line.startswith(" "):
136
+ # New file entry
137
+ if current_file and checksum_parts:
138
+ # Save previous file's checksum
139
+ full_checksum = "".join(checksum_parts).replace(" ", "").lower()
140
+ if re.match(r"^[a-fA-F0-9]+$", full_checksum):
141
+ checksums[current_file] = full_checksum
142
+
143
+ # Start new file
144
+ parts = line.split(":", 1)
145
+ current_file = parts[0].strip()
146
+ checksum_part = parts[1].strip()
147
+ checksum_parts = [checksum_part]
148
+ elif line.strip() and current_file:
149
+ # Continuation of checksum
150
+ checksum_parts.append(line.strip())
151
+
152
+ # Don't forget the last file
153
+ if current_file and checksum_parts:
154
+ full_checksum = "".join(checksum_parts).replace(" ", "").lower()
155
+ if re.match(r"^[a-fA-F0-9]+$", full_checksum):
156
+ checksums[current_file] = full_checksum
157
+
158
+ return checksums
159
+
160
+
161
+ class ChecksumParser:
162
+ """Main parser that tries different checksum formats."""
163
+
164
+ def __init__(self):
165
+ """Initialize parser with available format parsers."""
166
+ self.formats = [
167
+ StandardFormat(),
168
+ BSDFormat(),
169
+ ApacheBSDFormat(),
170
+ ]
171
+
172
+ def parse(self, content: str) -> dict[str, str]:
173
+ """
174
+ Try each format parser until one works.
175
+
176
+ :param content: The content to parse
177
+ :return: Dictionary mapping filenames to checksums
178
+ """
179
+ for format_parser in self.formats:
180
+ if format_parser.can_parse(content):
181
+ result = format_parser.parse(content)
182
+ if result:
183
+ return result
184
+
185
+ return {}
186
+
187
+
188
+ def parse_checksum_file_from_url(checksum_url: str) -> dict[str, str]:
189
+ """
190
+ Parse a SHA checksum file from a URL using multiple format parsers.
191
+
192
+ :param checksum_url: URL of the checksum file
193
+ :return: Dictionary mapping filenames to checksums
194
+ """
195
+ # import here to avoid circular dependency issues
196
+ from localstack.utils.http import download
197
+
198
+ checksum_name = os.path.basename(checksum_url)
199
+ checksum_path = os.path.join(tempfile.gettempdir(), checksum_name)
200
+ try:
201
+ download(checksum_url, checksum_path)
202
+ checksum_content = load_file(checksum_path)
203
+
204
+ parser = ChecksumParser()
205
+ checksums = parser.parse(checksum_content)
206
+
207
+ return checksums
208
+ finally:
209
+ rm_rf(checksum_path)
210
+
211
+
212
+ def calculate_file_checksum(file_path: str, algorithm: str = "sha256") -> str:
213
+ """
214
+ Calculate checksum of a local file.
215
+
216
+ :param file_path: Path to the file
217
+ :param algorithm: Hash algorithm to use
218
+ :return: Calculated checksum as hexadecimal string
219
+
220
+ note: Supported algorithms: 'md5', 'sha1', 'sha256', 'sha512'
221
+ """
222
+ hash_func = getattr(hashlib, algorithm)()
223
+
224
+ with open(file_path, "rb") as f:
225
+ # Read file in chunks to handle large files efficiently
226
+ for chunk in iter(lambda: f.read(8192), b""):
227
+ hash_func.update(chunk)
228
+
229
+ return hash_func.hexdigest()
230
+
231
+
232
+ def verify_local_file_with_checksum_url(file_path: str, checksum_url: str, filename=None) -> bool:
233
+ """
234
+ Verify a local file against checksums from an online checksum file.
235
+
236
+ :param file_path: Path to the local file to verify
237
+ :param checksum_url: URL of the checksum file
238
+ :param filename: Filename to look for in checksum file (defaults to basename of file_path)
239
+ :return: True if verification succeeds, False otherwise
240
+
241
+ note: The algorithm is automatically detected based on checksum length:
242
+
243
+ * 32 characters: MD5
244
+ * 40 characters: SHA1
245
+ * 64 characters: SHA256
246
+ * 128 characters: SHA512
247
+ """
248
+ # Get checksums from URL
249
+ LOG.debug("Fetching checksums from %s...", checksum_url)
250
+ checksums = parse_checksum_file_from_url(checksum_url)
251
+
252
+ if not checksums:
253
+ raise ChecksumException(f"No checksums found in {checksum_url}")
254
+
255
+ # Determine filename to look for
256
+ if filename is None:
257
+ filename = os.path.basename(file_path)
258
+
259
+ # Find checksum for our file
260
+ if filename not in checksums:
261
+ # Try with different path variations
262
+ possible_names = [
263
+ filename,
264
+ os.path.basename(filename), # just filename without path
265
+ filename.replace("\\", "/"), # Unix-style paths
266
+ filename.replace("/", "\\"), # Windows-style paths
267
+ ]
268
+
269
+ found = False
270
+ for name in possible_names:
271
+ if name in checksums:
272
+ filename = name
273
+ found = True
274
+ break
275
+
276
+ if not found:
277
+ raise ChecksumException(f"Checksum for {filename} not found in {checksum_url}")
278
+
279
+ expected_checksum = checksums[filename]
280
+
281
+ # Detect algorithm based on checksum length
282
+ checksum_length = len(expected_checksum)
283
+ if checksum_length == 32:
284
+ algorithm = "md5"
285
+ elif checksum_length == 40:
286
+ algorithm = "sha1"
287
+ elif checksum_length == 64:
288
+ algorithm = "sha256"
289
+ elif checksum_length == 128:
290
+ algorithm = "sha512"
291
+ else:
292
+ raise ChecksumException(f"Unsupported checksum length: {checksum_length}")
293
+
294
+ # Calculate checksum of local file
295
+ LOG.debug("Calculating %s checksum of %s...", algorithm, file_path)
296
+ calculated_checksum = calculate_file_checksum(file_path, algorithm)
297
+
298
+ is_valid = calculated_checksum == expected_checksum.lower()
299
+
300
+ if not is_valid:
301
+ LOG.error(
302
+ "Checksum mismatch for %s: calculated %s, expected %s",
303
+ file_path,
304
+ calculated_checksum,
305
+ expected_checksum,
306
+ )
307
+ raise ChecksumException(
308
+ f"Checksum mismatch for {file_path}: calculated {calculated_checksum}, expected {expected_checksum}"
309
+ )
310
+ LOG.debug("Checksum verification successful for %s", file_path)
311
+
312
+ # Compare checksums
313
+ return calculated_checksum == expected_checksum.lower()
localstack/utils/files.py CHANGED
@@ -81,7 +81,7 @@ def save_file(file, content, append=False, permissions=None):
81
81
  f.flush()
82
82
 
83
83
 
84
- def load_file(file_path, default=None, mode=None):
84
+ def load_file(file_path: str, default=None, mode=None):
85
85
  if not os.path.isfile(file_path):
86
86
  return default
87
87
  if not mode:
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.5.1.dev60'
21
- __version_tuple__ = version_tuple = (4, 5, 1, 'dev60')
20
+ __version__ = version = '4.5.1.dev62'
21
+ __version_tuple__ = version_tuple = (4, 5, 1, 'dev62')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.5.1.dev60
3
+ Version: 4.5.1.dev62
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=6J5cXDEkPS03-hS78yEL2EzSG7oyv3hWhDlrz6R8VAM,526
7
+ localstack/version.py,sha256=QYOE4FT7nL_3BDW_DCEMrqvbI7DEnRFQHk6LWCl1QgQ,526
8
8
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
10
10
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -149,12 +149,12 @@ localstack/logging/format.py,sha256=AkTRZcLapZFKx7e6SjOAQ5Hxim19HhbL2sz-Z9WyRpk,
149
149
  localstack/logging/setup.py,sha256=tFUU8Jbw5Pa3Y3a0vyFXcBplz3qc-yGewVfrm59i1vk,4901
150
150
  localstack/packages/__init__.py,sha256=o22iDQIrfvTS3Qj2CSHQ7ouKpYhtcIa5DPPM73xe8kI,533
151
151
  localstack/packages/api.py,sha256=N1cJQ4Wl4H8BEutmJ_9zPfmbVlIoCZlqUnimb-h1MNo,17148
152
- localstack/packages/core.py,sha256=Y8PnGQN_A27uPjVZCfpD8sJ3V1O8KT5ddG5y6jnd9Mo,14797
152
+ localstack/packages/core.py,sha256=wvgZHyMS-Fs0dRiq8bG9NmAE6ff5aO8Z21DA00Ogu_8,16081
153
153
  localstack/packages/debugpy.py,sha256=L3VPJ6_iK7kzp1Yn6wqSKKsxtEyTmS_Y41qefhvBrdk,1388
154
- localstack/packages/ffmpeg.py,sha256=zrtyUnzZPdvqpEqkSDceNWiX3a1PVRjTONy_ZBEDnHc,1765
154
+ localstack/packages/ffmpeg.py,sha256=PQNCuZaRLzVzzfuz914YiI8F7UDyIvSuEbyfhCb2fEo,1961
155
155
  localstack/packages/java.py,sha256=3Rmzo6g5RweLoa2pxJ8ETeT-JL48fo8xRcR2YPUMwzk,7764
156
156
  localstack/packages/plugins.py,sha256=Ban7a_1tSzu0j5hD2nPN67K_8MQH7e4NrNUkpk9omM0,803
157
- localstack/packages/terraform.py,sha256=ygQPRMkEaefw-MBWUJVVdKfy4C80ukmjG_sBiq0Gl8Q,1421
157
+ localstack/packages/terraform.py,sha256=4SfKvMlqvfKSlpRDc3-wpMe1AlyZnT_8sBZW1wNXAN4,1676
158
158
  localstack/runtime/__init__.py,sha256=th-8bfJFd011WcYnrlmpe0-79UWJ2LOqEZWLpVQno5Y,83
159
159
  localstack/runtime/analytics.py,sha256=0ytf5BpRuL3ZIfdxdwiUXkH2jGuxCTs4E-uqtA5xiHI,4813
160
160
  localstack/runtime/components.py,sha256=Mkbukxm1TM2uKFKHXf5HoPsQ5jEywZ2hADxbPBteLOY,1641
@@ -334,8 +334,8 @@ localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcon
334
334
  localstack/services/cloudformation/scaffolding/__main__.py,sha256=zjedOdqvnfN99WzQ43gxtGZxLDitSnbFGA-zpWbyMQ0,30960
335
335
  localstack/services/cloudformation/scaffolding/propgen.py,sha256=9YsSCkDegcU_Yp8Sfw8eNV26N5ibOlLC6Hg6lxPeBBM,7949
336
336
  localstack/services/cloudformation/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
337
- localstack/services/cloudformation/v2/entities.py,sha256=hu6_1g2spNoYUo_CEjg4gfeUIlxLJ0UL4Rqfe2aOrFE,7928
338
- localstack/services/cloudformation/v2/provider.py,sha256=Hqss2pm_v3th_6b7JoIKofkhCPAtCQ3pPLu3ezCmHtM,30618
337
+ localstack/services/cloudformation/v2/entities.py,sha256=2GK1Fi1Mi3WwLm1j4F5CjMk4IXotyhwfA2JwTSv6I38,8034
338
+ localstack/services/cloudformation/v2/provider.py,sha256=A3ZUaVw_Xj6zB_LEKoFVlQcL1vZRwzCE3pcwn5zDFVw,33103
339
339
  localstack/services/cloudformation/v2/utils.py,sha256=xy4Lcp4X8XGJ0OKfnsE7pnfMcFrtIH0Chw35qwjhZuw,148
340
340
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
341
341
  localstack/services/cloudwatch/alarm_scheduler.py,sha256=XFllg0gI_WNV7cNxOcgXifzmbNA07OPpuEUuf37keP4,15663
@@ -1199,13 +1199,14 @@ localstack/testing/testselection/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5
1199
1199
  localstack/testing/testselection/scripts/filter_by_test_selection.py,sha256=NXMEJtAEbS1wEMWBA2TkpbYJvpcvqZF2DsHN-6SRHUc,1043
1200
1200
  localstack/testing/testselection/scripts/generate_test_selection.py,sha256=CGTgsSian0_F0BSyyspW3dLoIrzz1LDpkP3_tF3DK3M,4410
1201
1201
  localstack/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1202
- localstack/utils/archives.py,sha256=b1JtruBs7exm9MK5bC64a0jyhK7k_6cOGmadanjIBcM,8462
1202
+ localstack/utils/archives.py,sha256=5jA-vioItIfqWw7wy0DSlaXFVLco4nXuj4I-DywNTxM,9857
1203
1203
  localstack/utils/async_utils.py,sha256=diN_tDL6hIs1n7k1kWN5gOl141lFToLt6Tjf0dGNyBQ,282
1204
1204
  localstack/utils/asyncio.py,sha256=hBn7XH7Txk0WA_kwRvVjHudWJuDZxOkiNd9pQJl4_Lk,5210
1205
1205
  localstack/utils/auth.py,sha256=uZNbD3hoQE29BykHANiy0uh-yLcvR05zjyYGN7gDmXQ,2415
1206
1206
  localstack/utils/backoff.py,sha256=mVyADce0BzHFA0MzbQ3VH6R9i3DBLitxGOEj-LeLD48,4117
1207
1207
  localstack/utils/batch_policy.py,sha256=jLzSb5y_-fszblGXfz7hDCpTmomTBTfsTjU4uP8QS5Q,4243
1208
1208
  localstack/utils/bootstrap.py,sha256=b6zB9Z9xpIA03T8bQdlBEAZCaWpCKI4Xs1Cu1PJspS8,50144
1209
+ localstack/utils/checksum.py,sha256=1-TjZs7faIX23wi9cBfNOooe8SsJIdIsE6a7G49xLjg,9726
1209
1210
  localstack/utils/collections.py,sha256=RbNxoAeEp12PBriCkueMTBgShlsQ1sTM9QgkvKPh6vY,17517
1210
1211
  localstack/utils/common.py,sha256=A6pfxPHyDR8xsFTcxmxmKDSfGY1NMhn6NFXaS-sJDVM,6427
1211
1212
  localstack/utils/config_listener.py,sha256=x7mStigWGTM6vg4HViXdSeD8kE3GpWUOcRwvHrraghE,1218
@@ -1215,7 +1216,7 @@ localstack/utils/crypto.py,sha256=tz02ZyXsSL5O_nKyQDHfeBt1DbaVT0qJLdRCZmjMVLc,72
1215
1216
  localstack/utils/diagnose.py,sha256=n-Eerc9HfGAUCIwv-qDBnmNcN08ZqznP2_QdJ8VjSQA,4735
1216
1217
  localstack/utils/docker_utils.py,sha256=1LfOjtyImeQPQdicmL0UCf4-f8cE2rHsrFjNGHYlFEc,9637
1217
1218
  localstack/utils/event_matcher.py,sha256=_DtCZI0ba4Zcit_-TwCUSIG_NXiYgIjmWbuKuMrsZkk,2024
1218
- localstack/utils/files.py,sha256=yp5qoEVuPpW6YV-FsUk1Rut0SmlcPL6oeGWnieeM9aI,9413
1219
+ localstack/utils/files.py,sha256=6LVStQYQEMpwAd3oj9iV-3X1nHak3zve2S-991hYw2U,9418
1219
1220
  localstack/utils/functions.py,sha256=J_CfhahMm4VBED8ZJ9FGRH-ku_KyOE0W13UY1lHw5RQ,2981
1220
1221
  localstack/utils/http.py,sha256=wt9H-6jw1MbMgZsVpoGQdlFIHMdEBVXM_IzCdVVflLA,11690
1221
1222
  localstack/utils/id_generator.py,sha256=ncGLyjA8QOy-2n16bBf3B_oTI1Kck1-RJcTLcJEvQHA,1697
@@ -1285,13 +1286,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1285
1286
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1286
1287
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1287
1288
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1288
- localstack_core-4.5.1.dev60.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1289
- localstack_core-4.5.1.dev60.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1290
- localstack_core-4.5.1.dev60.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1291
- localstack_core-4.5.1.dev60.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1292
- localstack_core-4.5.1.dev60.dist-info/METADATA,sha256=qnOtcHJsHEMV7OufT98uS9tucKM0bFauWytH3YA9HIA,5539
1293
- localstack_core-4.5.1.dev60.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1294
- localstack_core-4.5.1.dev60.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1295
- localstack_core-4.5.1.dev60.dist-info/plux.json,sha256=3smcB3rcUW4NnqTy0xResDhcPV__O6fGaFYyrnHSn0c,20891
1296
- localstack_core-4.5.1.dev60.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1297
- localstack_core-4.5.1.dev60.dist-info/RECORD,,
1289
+ localstack_core-4.5.1.dev62.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1290
+ localstack_core-4.5.1.dev62.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1291
+ localstack_core-4.5.1.dev62.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1292
+ localstack_core-4.5.1.dev62.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1293
+ localstack_core-4.5.1.dev62.dist-info/METADATA,sha256=px0ddl0bIlz3PL9YBogwx3hRCY_zupu-ZIFlpwY7G0o,5539
1294
+ localstack_core-4.5.1.dev62.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1295
+ localstack_core-4.5.1.dev62.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1296
+ localstack_core-4.5.1.dev62.dist-info/plux.json,sha256=2vu1SPou3jivuZuj32fzUyyCZeWitMhsP7Hba7i8dZ0,20891
1297
+ localstack_core-4.5.1.dev62.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1298
+ localstack_core-4.5.1.dev62.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "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::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "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::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin"], "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": ["register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "eager_load_services=localstack.services.plugins:eager_load_services", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "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", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger"], "localstack.hooks.on_infra_shutdown": ["stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "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"], "localstack.packages": ["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", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "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::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "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::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "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::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "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::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "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", "_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", "_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", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "eager_load_services=localstack.services.plugins:eager_load_services", "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"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package"], "localstack.hooks.on_infra_shutdown": ["run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "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:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"]}