localstack-core 4.6.1.dev77__py3-none-any.whl → 4.7.1.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +3 -6
  2. localstack/services/lambda_/hooks.py +6 -1
  3. localstack/services/lambda_/invocation/docker_runtime_executor.py +0 -5
  4. localstack/services/lambda_/invocation/executor_endpoint.py +3 -6
  5. localstack/services/lambda_/invocation/lambda_service.py +3 -0
  6. localstack/services/lambda_/invocation/version_manager.py +15 -7
  7. localstack/services/lambda_/ldm.py +15 -0
  8. localstack/services/lambda_/provider.py +1 -19
  9. localstack/version.py +2 -2
  10. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/METADATA +1 -1
  11. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/RECORD +19 -23
  12. localstack_core-4.7.1.dev1.dist-info/plux.json +1 -0
  13. localstack/services/lambda_/lambda_debug_mode/__init__.py +0 -0
  14. localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
  15. localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
  16. localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
  17. localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
  18. localstack_core-4.6.1.dev77.dist-info/plux.json +0 -1
  19. {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack +0 -0
  20. {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack-supervisor +0 -0
  21. {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack.bat +0 -0
  22. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/WHEEL +0 -0
  23. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/entry_points.txt +0 -0
  24. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/licenses/LICENSE.txt +0 -0
  25. {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/top_level.txt +0 -0
@@ -18,6 +18,7 @@ from localstack.aws.api.pipes import (
18
18
  PipeTargetParameters,
19
19
  )
20
20
  from localstack.services.lambda_ import hooks as lambda_hooks
21
+ from localstack.services.lambda_ import ldm
21
22
  from localstack.services.lambda_.event_source_mapping.esm_event_processor import (
22
23
  EsmEventProcessor,
23
24
  )
@@ -37,10 +38,6 @@ from localstack.services.lambda_.event_source_mapping.pollers.sqs_poller import
37
38
  SqsPoller,
38
39
  )
39
40
  from localstack.services.lambda_.event_source_mapping.senders.lambda_sender import LambdaSender
40
- from localstack.services.lambda_.lambda_debug_mode.ldm import (
41
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS,
42
- LDM,
43
- )
44
41
  from localstack.utils.aws.arns import parse_arn
45
42
  from localstack.utils.aws.client_types import ServicePrincipal
46
43
 
@@ -65,8 +62,8 @@ class EsmWorkerFactory:
65
62
  # Sender (always Lambda)
66
63
  function_arn = self.esm_config["FunctionArn"]
67
64
 
68
- if LDM.is_enabled():
69
- timeout_seconds = DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
65
+ if ldm.IS_LDM_ENABLED:
66
+ timeout_seconds = ldm.DEFAULT_LDM_TIMEOUT_SECONDS
70
67
  else:
71
68
  # 900s is the maximum amount of time a Lambda can run for.
72
69
  lambda_max_timeout_seconds = 900
@@ -2,19 +2,24 @@
2
2
 
3
3
  from localstack.runtime.hooks import hook_spec
4
4
 
5
+ HOOKS_LAMBDA_CREATE_FUNCTION_VERSION = "localstack.hooks.lambda_create_function_version"
6
+ HOOKS_LAMBDA_DELETE_FUNCTION_VERSION = "localstack.hooks.lambda_delete_function_version"
5
7
  HOOKS_LAMBDA_START_DOCKER_EXECUTOR = "localstack.hooks.lambda_start_docker_executor"
6
8
  HOOKS_LAMBDA_PREPARE_DOCKER_EXECUTOR = "localstack.hooks.lambda_prepare_docker_executors"
7
9
  HOOKS_LAMBDA_INJECT_LAYER_FETCHER = "localstack.hooks.lambda_inject_layer_fetcher"
10
+ HOOKS_LAMBDA_INJECT_LDM_PROVISIONER = "localstack.hooks.lambda_inject_ldm_provisioner"
8
11
  HOOKS_LAMBDA_PREBUILD_ENVIRONMENT_IMAGE = "localstack.hooks.lambda_prebuild_environment_image"
9
12
  HOOKS_LAMBDA_CREATE_EVENT_SOURCE_POLLER = "localstack.hooks.lambda_create_event_source_poller"
10
13
  HOOKS_LAMBDA_SET_EVENT_SOURCE_CONFIG_DEFAULTS = (
11
14
  "localstack.hooks.lambda_set_event_source_config_defaults"
12
15
  )
13
16
 
14
-
17
+ create_function_version = hook_spec(HOOKS_LAMBDA_CREATE_FUNCTION_VERSION)
18
+ delete_function_version = hook_spec(HOOKS_LAMBDA_DELETE_FUNCTION_VERSION)
15
19
  start_docker_executor = hook_spec(HOOKS_LAMBDA_START_DOCKER_EXECUTOR)
16
20
  prepare_docker_executor = hook_spec(HOOKS_LAMBDA_PREPARE_DOCKER_EXECUTOR)
17
21
  inject_layer_fetcher = hook_spec(HOOKS_LAMBDA_INJECT_LAYER_FETCHER)
22
+ inject_ldm_provisioner = hook_spec(HOOKS_LAMBDA_INJECT_LDM_PROVISIONER)
18
23
  prebuild_environment_image = hook_spec(HOOKS_LAMBDA_PREBUILD_ENVIRONMENT_IMAGE)
19
24
  create_event_source_poller = hook_spec(HOOKS_LAMBDA_CREATE_EVENT_SOURCE_POLLER)
20
25
  set_event_source_config_defaults = hook_spec(HOOKS_LAMBDA_SET_EVENT_SOURCE_CONFIG_DEFAULTS)
@@ -23,7 +23,6 @@ from localstack.services.lambda_.invocation.runtime_executor import (
23
23
  LambdaRuntimeException,
24
24
  RuntimeExecutor,
25
25
  )
26
- from localstack.services.lambda_.lambda_debug_mode.ldm import LDM_ENV_VAR_DEBUG_PORT
27
26
  from localstack.services.lambda_.lambda_utils import HINT_LOG
28
27
  from localstack.services.lambda_.networking import (
29
28
  get_all_container_networks_for_lambda,
@@ -376,10 +375,6 @@ class DockerRuntimeExecutor(RuntimeExecutor):
376
375
  container_config.ports = PortMappings()
377
376
  container_config.ports.add(config.LAMBDA_INIT_DELVE_PORT, config.LAMBDA_INIT_DELVE_PORT)
378
377
 
379
- if ldm_debug_port := env_vars.get(LDM_ENV_VAR_DEBUG_PORT):
380
- ldm_debug_port = int(ldm_debug_port)
381
- container_config.ports.add(ldm_debug_port, ldm_debug_port)
382
-
383
378
  if (
384
379
  self.function_version.config.layers
385
380
  and not config.LAMBDA_PREBUILD_IMAGES
@@ -10,11 +10,8 @@ from werkzeug import Request
10
10
 
11
11
  from localstack.http import Response, route
12
12
  from localstack.services.edge import ROUTER
13
+ from localstack.services.lambda_ import ldm
13
14
  from localstack.services.lambda_.invocation.lambda_models import InvocationResult
14
- from localstack.services.lambda_.lambda_debug_mode.ldm import (
15
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS,
16
- LDM,
17
- )
18
15
  from localstack.utils.backoff import ExponentialBackoff
19
16
  from localstack.utils.objects import singleton_factory
20
17
  from localstack.utils.strings import to_str
@@ -209,9 +206,9 @@ class ExecutorEndpoint(Endpoint):
209
206
  # Note that if timeouts are enforced for the lambda function invoked at this endpoint
210
207
  # (this is needs to be configured in the Lambda Debug Mode Config file), the lambda
211
208
  # function will continue to enforce the expected timeouts.
212
- if LDM.is_enabled():
209
+ if ldm.IS_LDM_ENABLED:
213
210
  # The value is set to a default high value to ensure eventual termination.
214
- timeout_seconds = DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
211
+ timeout_seconds = ldm.DEFAULT_LDM_TIMEOUT_SECONDS
215
212
  else:
216
213
  # Do not wait longer for an invoke than the maximum lambda timeout plus a buffer
217
214
  lambda_max_timeout_seconds = 900
@@ -25,6 +25,7 @@ from localstack.aws.api.lambda_ import (
25
25
  )
26
26
  from localstack.aws.connect import connect_to
27
27
  from localstack.constants import AWS_REGION_US_EAST_1
28
+ from localstack.services.lambda_ import hooks as lambda_hooks
28
29
  from localstack.services.lambda_.analytics import (
29
30
  FunctionOperation,
30
31
  FunctionStatus,
@@ -130,6 +131,7 @@ class LambdaService:
130
131
  if not version_manager:
131
132
  raise ValueError(f"Unable to find version manager for {qualified_arn}")
132
133
  self.task_executor.submit(version_manager.stop)
134
+ lambda_hooks.delete_function_version.run(qualified_arn)
133
135
 
134
136
  def get_lambda_version_manager(self, function_arn: str) -> LambdaVersionManager:
135
137
  """
@@ -185,6 +187,7 @@ class LambdaService:
185
187
  assignment_service=self.assignment_service,
186
188
  )
187
189
  self.lambda_starting_versions[qualified_arn] = version_manager
190
+ lambda_hooks.create_function_version.run(function_version.qualified_arn)
188
191
  return self.task_executor.submit(self._start_lambda_version, version_manager)
189
192
 
190
193
  def publish_version(self, function_version: FunctionVersion):
@@ -11,6 +11,7 @@ from localstack.aws.api.lambda_ import (
11
11
  State,
12
12
  StateReasonCode,
13
13
  )
14
+ from localstack.services.lambda_ import hooks as lambda_hooks
14
15
  from localstack.services.lambda_.invocation.assignment import AssignmentService
15
16
  from localstack.services.lambda_.invocation.counting_service import CountingService
16
17
  from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
@@ -29,7 +30,7 @@ from localstack.services.lambda_.invocation.metrics import (
29
30
  record_cw_metric_invocation,
30
31
  )
31
32
  from localstack.services.lambda_.invocation.runtime_executor import get_runtime_executor
32
- from localstack.services.lambda_.lambda_debug_mode.ldm import LDM
33
+ from localstack.services.lambda_.ldm import LDMProvisioner
33
34
  from localstack.utils.strings import long_uid, truncate
34
35
  from localstack.utils.threads import FuncThread, start_thread
35
36
 
@@ -53,6 +54,8 @@ class LambdaVersionManager:
53
54
  counting_service: CountingService
54
55
  assignment_service: AssignmentService
55
56
 
57
+ ldm_provisioner: LDMProvisioner | None
58
+
56
59
  def __init__(
57
60
  self,
58
61
  function_arn: str,
@@ -80,6 +83,9 @@ class LambdaVersionManager:
80
83
  # https://aws.amazon.com/blogs/compute/coming-soon-expansion-of-aws-lambda-states-to-all-functions/
81
84
  self.state = VersionState(state=State.Pending)
82
85
 
86
+ self.ldm_provisioner = None
87
+ lambda_hooks.inject_ldm_provisioner.run(self)
88
+
83
89
  def start(self) -> VersionState:
84
90
  try:
85
91
  self.log_handler.start_subscriber()
@@ -194,15 +200,17 @@ class LambdaVersionManager:
194
200
 
195
201
  # If the environment has debugging enabled, route the invocation there;
196
202
  # debug environments bypass Lambda service quotas.
197
- if debug_execution_environment := LDM.get_execution_environment(
198
- qualified_lambda_arn=self.function_version.qualified_arn,
199
- user_agent=invocation.user_agent,
203
+ if self.ldm_provisioner and (
204
+ ldm_execution_environment := self.ldm_provisioner.get_execution_environment(
205
+ qualified_lambda_arn=self.function_version.qualified_arn,
206
+ user_agent=invocation.user_agent,
207
+ )
200
208
  ):
201
209
  try:
202
- invocation_result = debug_execution_environment.invoke(invocation)
210
+ invocation_result = ldm_execution_environment.invoke(invocation)
203
211
  invocation_result.executed_version = self.function_version.id.qualifier
204
212
  self.store_logs(
205
- invocation_result=invocation_result, execution_env=debug_execution_environment
213
+ invocation_result=invocation_result, execution_env=ldm_execution_environment
206
214
  )
207
215
  except StatusErrorException as e:
208
216
  invocation_result = InvocationResult(
@@ -213,7 +221,7 @@ class LambdaVersionManager:
213
221
  executed_version=self.function_version.id.qualifier,
214
222
  )
215
223
  finally:
216
- debug_execution_environment.release()
224
+ ldm_execution_environment.release()
217
225
  return invocation_result
218
226
 
219
227
  with self.counting_service.get_invocation_lease(
@@ -0,0 +1,15 @@
1
+ import abc
2
+ from typing import Optional
3
+
4
+ from localstack.aws.api.lambda_ import Arn
5
+ from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
6
+
7
+ DEFAULT_LDM_TIMEOUT_SECONDS: int = 3_600
8
+ IS_LDM_ENABLED: bool = False
9
+
10
+
11
+ class LDMProvisioner(abc.ABC):
12
+ @abc.abstractmethod
13
+ def get_execution_environment(
14
+ self, qualified_lambda_arn: Arn, user_agent: Optional[str]
15
+ ) -> Optional[ExecutionEnvironment]: ...
@@ -211,7 +211,6 @@ from localstack.services.lambda_.invocation.lambda_service import (
211
211
  )
212
212
  from localstack.services.lambda_.invocation.models import LambdaStore
213
213
  from localstack.services.lambda_.invocation.runtime_executor import get_runtime_executor
214
- from localstack.services.lambda_.lambda_debug_mode.ldm import LDM
215
214
  from localstack.services.lambda_.lambda_utils import HINT_LOG
216
215
  from localstack.services.lambda_.layerfetcher.layer_fetcher import LayerFetcher
217
216
  from localstack.services.lambda_.provider_utils import (
@@ -391,14 +390,6 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
391
390
 
392
391
  # TODO: should probably unregister routes?
393
392
  self.lambda_service.stop()
394
- # Attempt to signal to the Lambda Debug Mode session object to stop.
395
- try:
396
- LDM.stop_debug_mode()
397
- except Exception as ex:
398
- LOG.error(
399
- "Unexpected error encountered when attempting to signal Lambda Debug Mode to stop '%s'.",
400
- ex,
401
- )
402
393
 
403
394
  @staticmethod
404
395
  def _get_function(function_name: str, account_id: str, region: str) -> Function:
@@ -1068,9 +1059,6 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
1068
1059
  function_name,
1069
1060
  )
1070
1061
 
1071
- # Enable the LDM configuration for this qualified lambda arn, iff a configuration exists.
1072
- LDM.enable_configuration(qualified_lambda_arn=version.qualified_arn)
1073
-
1074
1062
  return api_utils.map_config_out(
1075
1063
  version, return_qualified_arn=False, return_update_status=False
1076
1064
  )
@@ -1427,8 +1415,6 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
1427
1415
  if version:
1428
1416
  self.lambda_service.stop_version(version.id.qualified_arn())
1429
1417
  destroy_code_if_not_used(code=version.config.code, function=function)
1430
- # Notify the LDM about the version deletion.
1431
- LDM.remove_configuration(qualified_lambda_arn=version.qualified_arn)
1432
1418
  else:
1433
1419
  # delete the whole function
1434
1420
  # TODO: introduce locking for safe deletion: We could create a new version at the API layer before
@@ -1439,8 +1425,6 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
1439
1425
  # we can safely destroy the code here
1440
1426
  if version.config.code:
1441
1427
  version.config.code.destroy()
1442
- # Notify the LDM about the version deletion.
1443
- LDM.remove_configuration(qualified_lambda_arn=version.qualified_arn)
1444
1428
 
1445
1429
  def list_functions(
1446
1430
  self,
@@ -1587,9 +1571,7 @@ class LambdaProvider(LambdaApi, ServiceLifecycleHook):
1587
1571
  function_name, qualifier, context
1588
1572
  )
1589
1573
 
1590
- user_agent = None
1591
- if user_agent_obj := context.request.user_agent:
1592
- user_agent = user_agent_obj.string
1574
+ user_agent = context.request.user_agent.string
1593
1575
 
1594
1576
  time_before = time.perf_counter()
1595
1577
  try:
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.6.1.dev77'
21
- __version_tuple__ = version_tuple = (4, 6, 1, 'dev77')
20
+ __version__ = version = '4.7.1.dev1'
21
+ __version_tuple__ = version_tuple = (4, 7, 1, 'dev1')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.6.1.dev77
3
+ Version: 4.7.1.dev1
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=V3qRwfoLzx6HExDTms1i-yXHIsIRL7feZY_yC1VqULk,526
7
+ localstack/version.py,sha256=4yYz9AIonOWxPKUwQsuMesfhfvPqb5cCE1wKcreZSlc,524
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
@@ -543,12 +543,13 @@ localstack/services/lambda_/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
543
543
  localstack/services/lambda_/analytics.py,sha256=akoypJaRwEcj5JT_Q11W3H3v7AGMDdxvuk7PZtpt2jk,1606
544
544
  localstack/services/lambda_/api_utils.py,sha256=2LJEkylloVQ-0fik5kBgWSC9PpaqkBao2z519lbfZW4,29763
545
545
  localstack/services/lambda_/custom_endpoints.py,sha256=eNnQ4FyfWxiK2ZZtjcAxrtEqscWGowPFei_RHh-qH3E,2017
546
- localstack/services/lambda_/hooks.py,sha256=mSthgopfc3XHVC-DBmMlQ56EhNRPZK6CtUo9ftUekI8,1146
546
+ localstack/services/lambda_/hooks.py,sha256=A2FbThhBtTiHa5BeCc5isnQ455jsIxNbfUF4y6DsMZI,1630
547
547
  localstack/services/lambda_/lambda_utils.py,sha256=pxnRJnYzwhwbHbW1-GKV1TJyJgn52IPNtb8kwxMkld8,1803
548
+ localstack/services/lambda_/ldm.py,sha256=flffZ9PDGU2hirWiRa7MKg4BF_UEeUeIYpIQN_v7Wd0,452
548
549
  localstack/services/lambda_/networking.py,sha256=H9fq1aYThqXZkOi0fCoJrHI9rm19qgUVxFe3vYloN08,938
549
550
  localstack/services/lambda_/packages.py,sha256=b2YaCsM3hnSbtwshMIjz1VG0ReMFHhV73niWPmBQ7jw,3965
550
551
  localstack/services/lambda_/plugins.py,sha256=eZsdzZqgEG9EZpd3W8TUdoydTpPXl6JBzJgDx_qeFUU,1275
551
- localstack/services/lambda_/provider.py,sha256=jcKrSPdGs-u6ABC2V0Vhk5cmSbzjtFMClbRim9M19fc,191232
552
+ localstack/services/lambda_/provider.py,sha256=mqM5NXS5bvweeDoFavW7OSXpq2Z_YNUibDtuuiDueS0,190304
552
553
  localstack/services/lambda_/provider_utils.py,sha256=-vM__pt5qIVhTiPA05N2P0P_pQpwyZggyRuL_QvsQHs,3210
553
554
  localstack/services/lambda_/runtimes.py,sha256=0ODrFfr2VYb1jWC-Gqyro7CoTyO3NyY_SpR9paE4_w8,8332
554
555
  localstack/services/lambda_/urlrouter.py,sha256=ZuVUaAn3tmesDQntkrVQ_-xkMAmdDzmAqx7XIzK9dOo,8351
@@ -556,7 +557,7 @@ localstack/services/lambda_/event_source_mapping/__init__.py,sha256=47DEQpj8HBSa
556
557
  localstack/services/lambda_/event_source_mapping/esm_config_factory.py,sha256=E7N81Dm9PV7lbvD_JRWDeqACYnEhazrFV4YEPejkXgw,6180
557
558
  localstack/services/lambda_/event_source_mapping/esm_event_processor.py,sha256=nPQYRRX3AMnqlNCTUapFy3bhCeM00VZQwMASfuA3VqQ,6990
558
559
  localstack/services/lambda_/event_source_mapping/esm_worker.py,sha256=ro4t7DAvrlMd-U7WWly1XKnyKXL6du3T4IgtVVtLoKw,9368
559
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py,sha256=CClyAlEen_eiV9iZ72TruBt6QWcCpNhkT3X6MOt8ubM,10498
560
+ localstack/services/lambda_/event_source_mapping/esm_worker_factory.py,sha256=_4bahrOKU533QAVGvSElK14rVoF9d1zyO80J6a_uCcw,10412
560
561
  localstack/services/lambda_/event_source_mapping/event_processor.py,sha256=lrneBFEeitdd-KVOtVzyWDHbE_dulRP5J44PpAONfJE,2481
561
562
  localstack/services/lambda_/event_source_mapping/noops_event_processor.py,sha256=rCdI2_y0yoOqQ1WwF3rrscwbNVz6AqDScPqAZcR5tTQ,382
562
563
  localstack/services/lambda_/event_source_mapping/pipe_utils.py,sha256=ajZGcrkXpr8skwkufe-alCvY002nm9nb19x7QjhBkXc,2553
@@ -576,24 +577,19 @@ localstack/services/lambda_/event_source_mapping/senders/sender_utils.py,sha256=
576
577
  localstack/services/lambda_/invocation/__init__.py,sha256=g6PC4HNlQSu3sgTQ8-L7YrW7bj8J0OQyuvE9vWUXY50,202
577
578
  localstack/services/lambda_/invocation/assignment.py,sha256=r_rDhgomY7V3wrod4oVQ9gUfWL1eirci2A3kOukPiD4,6725
578
579
  localstack/services/lambda_/invocation/counting_service.py,sha256=OTYk82lsqAWWbQoHmBe0gerOTPaT5nUzTPkbtkCbk0w,12824
579
- localstack/services/lambda_/invocation/docker_runtime_executor.py,sha256=lSXh3wzbW1eIFf7GGOcIz3QFBccQVNHkDIy4GUyodeY,21667
580
+ localstack/services/lambda_/invocation/docker_runtime_executor.py,sha256=gkCoIlRhdkNiQjWMlqCLBJ11VYcbv2gZ11uZGfGG4zo,21394
580
581
  localstack/services/lambda_/invocation/event_manager.py,sha256=OQTCHkpPPDv_Vis5lL5QtEbIKc7WcNFeFDkQQwBw2WE,27004
581
582
  localstack/services/lambda_/invocation/execution_environment.py,sha256=PZNEvOvO2MXYYfdALg7aKnbe8dyS0rFVkgdFOxyKYu0,17196
582
- localstack/services/lambda_/invocation/executor_endpoint.py,sha256=1VbSWK91TKl9EKhde_TPe6DDeZlfH8_aA18-7SzsYMM,11126
583
+ localstack/services/lambda_/invocation/executor_endpoint.py,sha256=P11N8qpYpeDsBUtUFU0Kh2f2-J_TD9YZeFvDGfrV35w,11040
583
584
  localstack/services/lambda_/invocation/internal_sqs_queue.py,sha256=h8wQPbJPtcUxKXmPzfrD5R5UzhZc248wkXNDJOexJ_I,7332
584
585
  localstack/services/lambda_/invocation/lambda_models.py,sha256=DghyrArISywojN09pGbnjzfz2u0dZgxD6yPwW6Ov_-U,19850
585
- localstack/services/lambda_/invocation/lambda_service.py,sha256=wZKJL5bfED5fZzITqdRn6Y2F40ttUS7PV1nwWWV87Fg,30411
586
+ localstack/services/lambda_/invocation/lambda_service.py,sha256=C3SKZbEeEhvoQGXS3-dRZahVU8W7dI04-QAsqh-shWs,30622
586
587
  localstack/services/lambda_/invocation/logs.py,sha256=8BkcTZWnKm7wcjcH6i1K3DpDp4eSIh1r6hQdpyDVRh8,3842
587
588
  localstack/services/lambda_/invocation/metrics.py,sha256=IOzQguI3v8xl47FP6jMZYL3g9k-NIZEkvldAImdXljQ,1134
588
589
  localstack/services/lambda_/invocation/models.py,sha256=22B5_QfiDj2Imjwhf9u7PGDWevQpn83AE84fpBRA6Ts,1084
589
590
  localstack/services/lambda_/invocation/plugins.py,sha256=axAnRqpDyPvqh95s21FX7CcYZ5Or6QPJ3LykXu4tpyc,402
590
591
  localstack/services/lambda_/invocation/runtime_executor.py,sha256=9PBCTd0FGHuamjiuDghseUb3h2VnxGUANnCHDo-uB_o,4197
591
- localstack/services/lambda_/invocation/version_manager.py,sha256=KPRyxaz01zRQCshN3UhZrxXF8ggG2p42S52D-OsSbW8,12737
592
- localstack/services/lambda_/lambda_debug_mode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
593
- localstack/services/lambda_/lambda_debug_mode/ldm.py,sha256=esW_UETNHbZ_GY64zfg2X6i2kvIQ6RzSgISRcMdKpF4,14825
594
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py,sha256=W-spgxeVLSU7n2YdhMZrol8axmgyTbR4UJnl6KKkoWs,6169
595
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py,sha256=nz54zBBy97uTM0H4tWLrYqlqZhikdmm_xGbkFYrzfiw,306
596
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py,sha256=l-KE9BcxtXem1VzKxW9sfO9Ywad5Skrd-i-5fBZvgtQ,1723
592
+ localstack/services/lambda_/invocation/version_manager.py,sha256=3eit70wG7HFN03n009J8koUcYM-eMIjwG6r45g1Z-XM,12997
597
593
  localstack/services/lambda_/layerfetcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
598
594
  localstack/services/lambda_/layerfetcher/layer_fetcher.py,sha256=GxTG_LKvMrjjy3zLqgHS4e2jPLGyTZ3sPHxQ4jeP_Zw,601
599
595
  localstack/services/lambda_/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1288,13 +1284,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1288
1284
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1289
1285
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1290
1286
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1291
- localstack_core-4.6.1.dev77.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1292
- localstack_core-4.6.1.dev77.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1293
- localstack_core-4.6.1.dev77.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1294
- localstack_core-4.6.1.dev77.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1295
- localstack_core-4.6.1.dev77.dist-info/METADATA,sha256=C_uVv_1TMutPbUG6Tp9OKEr1VcrPvxuaj2GNaVrpiHQ,5573
1296
- localstack_core-4.6.1.dev77.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1297
- localstack_core-4.6.1.dev77.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1298
- localstack_core-4.6.1.dev77.dist-info/plux.json,sha256=PkgYR4ljKvGQepf54wpuQDbo7SSzPpaVNxNXf2aKtZU,20891
1299
- localstack_core-4.6.1.dev77.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1300
- localstack_core-4.6.1.dev77.dist-info/RECORD,,
1287
+ localstack_core-4.7.1.dev1.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1288
+ localstack_core-4.7.1.dev1.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1289
+ localstack_core-4.7.1.dev1.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1290
+ localstack_core-4.7.1.dev1.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1291
+ localstack_core-4.7.1.dev1.dist-info/METADATA,sha256=9tK8V4zyuYuGFxgUnovGdaw2bQAJcmDF6Ae9qo8ijq8,5572
1292
+ localstack_core-4.7.1.dev1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1293
+ localstack_core-4.7.1.dev1.dist-info/entry_points.txt,sha256=-GFtw80qM_1GQIDUcyqXojJvnqvP_8lK1Vc-M9ShaJE,20668
1294
+ localstack_core-4.7.1.dev1.dist-info/plux.json,sha256=POjnS82RhrebXHkZpIh9mgbrRwomPqTG_ZuItHxVb8U,20891
1295
+ localstack_core-4.7.1.dev1.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1296
+ localstack_core-4.7.1.dev1.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "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::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "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::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::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "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::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "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::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin"], "localstack.hooks.on_infra_start": ["_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "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_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "eager_load_services=localstack.services.plugins:eager_load_services", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server"], "localstack.packages": ["opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package"], "localstack.hooks.on_infra_shutdown": ["publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "stop_server=localstack.dns.plugins:stop_server"], "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.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.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"]}
File without changes
@@ -1,375 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- import os
5
- import threading
6
- import time
7
- from threading import Event, RLock, Thread
8
- from typing import Callable, Dict, Final, Optional
9
-
10
- from localstack.aws.api.lambda_ import (
11
- Arn,
12
- FunctionVersion,
13
- ResourceNotFoundException,
14
- TooManyRequestsException,
15
- )
16
- from localstack.config import LAMBDA_DEBUG_MODE, LAMBDA_DEBUG_MODE_CONFIG_PATH
17
- from localstack.services.lambda_.invocation.execution_environment import (
18
- ExecutionEnvironment,
19
- InvalidStatusException,
20
- RuntimeStatus,
21
- )
22
- from localstack.services.lambda_.lambda_debug_mode.ldm_config_file import parse_ldm_config
23
- from localstack.services.lambda_.provider_utils import get_function_version
24
- from localstack.utils.aws.arns import parse_arn
25
- from localstack.utils.objects import singleton_factory
26
- from localstack.utils.strings import long_uid
27
-
28
- LOG = logging.getLogger(__name__)
29
-
30
- # Specifies the default timeout value in seconds to be used by time restricted workflows
31
- # when Debug Mode is enabled. The value is set to one hour to ensure eventual termination
32
- # of long-running processes.
33
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS: int = 3_600
34
- LDM_ENV_VAR_DEBUG_PORT: str = "LDM_DEBUG_PORT"
35
-
36
-
37
- class LambdaFunctionDebugConfig:
38
- qualified_lambda_arn: Final[Arn]
39
- port: Final[int]
40
- enforce_timeouts: Final[bool]
41
- user_agent: Final[Optional[str]]
42
-
43
- def __init__(
44
- self,
45
- qualified_lambda_arn: Arn,
46
- port: int,
47
- enforce_timeouts: bool = False,
48
- user_agent: Optional[str] = None,
49
- ):
50
- self.qualified_lambda_arn = qualified_lambda_arn
51
- self.port = port
52
- self.enforce_timeouts = enforce_timeouts
53
- self.user_agent = user_agent
54
-
55
-
56
- class DebugEnabledExecutionEnvironment(ExecutionEnvironment):
57
- _lambda_function_debug_config: Final[LambdaFunctionDebugConfig]
58
-
59
- def __init__(
60
- self,
61
- function_version: FunctionVersion,
62
- lambda_function_debug_config: LambdaFunctionDebugConfig,
63
- on_timeout: Callable[[str, str], None],
64
- ):
65
- super().__init__(
66
- function_version=function_version,
67
- version_manager_id=f"debug-enable-{long_uid()}",
68
- initialization_type="provisioned-concurrency",
69
- on_timeout=on_timeout,
70
- )
71
- self._lambda_function_debug_config = lambda_function_debug_config
72
-
73
- def get_environment_variables(self) -> Dict[str, str]:
74
- environment_variables = super().get_environment_variables()
75
- environment_variables[LDM_ENV_VAR_DEBUG_PORT] = str(self._lambda_function_debug_config.port)
76
- if not self._lambda_function_debug_config.enforce_timeouts:
77
- environment_variables["AWS_LAMBDA_FUNCTION_TIMEOUT"] = str(
78
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
79
- )
80
- return environment_variables
81
-
82
- def _get_startup_timeout_seconds(self) -> int:
83
- return DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
84
-
85
-
86
- class LambdaDebugTarget:
87
- _mutex: Final[RLock]
88
- _lambda_qualified_arn: Final[str]
89
- lambda_function_debug_config: Final[LambdaFunctionDebugConfig]
90
- _debug_execution_environment: Optional[DebugEnabledExecutionEnvironment]
91
-
92
- def __init__(self, lambda_function_debug_config: LambdaFunctionDebugConfig):
93
- self._mutex = RLock()
94
- self._lambda_qualified_arn = lambda_function_debug_config.qualified_lambda_arn
95
- self.lambda_function_debug_config = lambda_function_debug_config
96
- self._debug_execution_environment = None
97
-
98
- def start_debug_enabled_execution_environment(self):
99
- # Attempt to create the debug environment now if the function exists.
100
- with self._mutex:
101
- if self._debug_execution_environment is not None:
102
- return
103
- self.stop_debug_enabled_execution_environment()
104
-
105
- try:
106
- lambda_parsed_arn = parse_arn(self._lambda_qualified_arn)
107
- lambda_account_id = lambda_parsed_arn["account"]
108
- lambda_region_name = lambda_parsed_arn["region"]
109
- _, lambda_function_name, lambda_function_qualifier = lambda_parsed_arn[
110
- "resource"
111
- ].split(":")
112
- function_version = get_function_version(
113
- function_name=lambda_function_name,
114
- qualifier=lambda_function_qualifier,
115
- account_id=lambda_account_id,
116
- region=lambda_region_name,
117
- )
118
- except ResourceNotFoundException:
119
- # The lambda function has not being created yet.
120
- return
121
-
122
- self._debug_execution_environment = DebugEnabledExecutionEnvironment(
123
- function_version=function_version,
124
- lambda_function_debug_config=self.lambda_function_debug_config,
125
- on_timeout=self._on_execution_environment_timeout,
126
- )
127
- # FIXME: this log should take place after RuntimeStatus.READY, however the debug-enabled
128
- # docker container will not notify LS about it starting up until the user has
129
- # connected a debug client. Future work should resolve this notification issue.
130
- LOG.info(
131
- "LDM is ready for debugger connections for '%s' on port %i.",
132
- self.lambda_function_debug_config.qualified_lambda_arn,
133
- self.lambda_function_debug_config.port,
134
- )
135
- self._debug_execution_environment.start()
136
- if self._debug_execution_environment.status != RuntimeStatus.READY:
137
- LOG.error(
138
- "LDM could not create a debug environment for '%s'", self._lambda_qualified_arn
139
- )
140
- self._debug_execution_environment = None
141
-
142
- def stop_debug_enabled_execution_environment(self):
143
- with self._mutex:
144
- if environment := self._debug_execution_environment:
145
- environment.stop()
146
- self._debug_execution_environment = None
147
-
148
- def get_execution_environment(self) -> DebugEnabledExecutionEnvironment:
149
- # TODO: add support for concurrent invokes, such as invoke object queuing, new container spinup
150
- with self._mutex:
151
- # TODO: move this start-up logic to lambda function creation.
152
- self.start_debug_enabled_execution_environment()
153
- try:
154
- self._debug_execution_environment.reserve()
155
- return self._debug_execution_environment
156
- except InvalidStatusException:
157
- LOG.warning(
158
- "Concurrent lambda invocations disabled for '%s' by Lambda Debug Mode",
159
- self._lambda_qualified_arn,
160
- )
161
- raise TooManyRequestsException(
162
- "Rate Exceeded.",
163
- Reason="SingleLeaseEnforcement",
164
- Type="User",
165
- )
166
-
167
- def _on_execution_environment_timeout(
168
- self, version_manager_id: str, environment_id: str
169
- ) -> None:
170
- # This function is run by the ExecutionEnvironment when the
171
- # release of on-demand container times-out whilst waiting for
172
- # invokes. However, DebugEnabledExecutionEnvironment are
173
- # provisioned-concurrency ExecutionEnvironments.
174
- LOG.warning(
175
- "Lambda Debug Mode function '%s' timed out ('%s', '%s')",
176
- self._lambda_qualified_arn,
177
- version_manager_id,
178
- environment_id,
179
- )
180
- self.stop_debug_enabled_execution_environment()
181
-
182
-
183
- class LDMConfigFileWatch:
184
- _mutex: Final[RLock]
185
- _stop_event: Final[Event]
186
- _watch_thread: Final[Thread]
187
-
188
- def __init__(self):
189
- self._mutex = RLock()
190
- self._stop_event = Event()
191
- self._watch_thread = Thread(
192
- target=self._watch_logic, args=(), daemon=True, name="LDMConfigFileWatch"
193
- )
194
-
195
- def start(self):
196
- with self._mutex:
197
- self._stop_event.clear()
198
- if not self._watch_thread.is_alive():
199
- self._watch_thread.start()
200
-
201
- def stop(self):
202
- with self._mutex:
203
- self._stop_event.set()
204
-
205
- def _watch_logic(self) -> None:
206
- if not LAMBDA_DEBUG_MODE_CONFIG_PATH:
207
- LOG.info("LDM: no definitions for LAMBDA_DEBUG_MODE_CONFIG_PATH")
208
- return
209
-
210
- # TODO: consider relying on system calls (watchdog lib for cross-platform support)
211
- # instead of monitoring last modified dates.
212
- # Run the first load and signal as initialised.
213
- epoch_last_loaded: int = self._config_file_epoch_last_modified_or_now()
214
- self._update_ldm_from_ldm_config_file()
215
-
216
- # Monitor for file changes whilst the application is running.
217
- while not self._stop_event.is_set():
218
- time.sleep(1)
219
- epoch_last_modified = self._config_file_epoch_last_modified_or_now()
220
- if epoch_last_modified > epoch_last_loaded:
221
- epoch_last_loaded = epoch_last_modified
222
- self._update_ldm_from_ldm_config_file()
223
-
224
- @staticmethod
225
- def _update_ldm_from_ldm_config_file() -> None:
226
- yaml_configuration_string = None
227
- try:
228
- with open(LAMBDA_DEBUG_MODE_CONFIG_PATH, "r") as df:
229
- yaml_configuration_string = df.read()
230
- except FileNotFoundError:
231
- LOG.error(
232
- "LDM: The file lambda debug config file '%s' was not found.",
233
- LAMBDA_DEBUG_MODE_CONFIG_PATH,
234
- )
235
- except IsADirectoryError:
236
- LOG.error(
237
- "LDM: Expected a lambda debug config file but found a directory at '%s'.",
238
- LAMBDA_DEBUG_MODE_CONFIG_PATH,
239
- )
240
- except PermissionError:
241
- LOG.error(
242
- "LDM: Permission denied while trying to read the lambda debug config file '%s'.",
243
- LAMBDA_DEBUG_MODE_CONFIG_PATH,
244
- )
245
- except Exception as ex:
246
- LOG.error(
247
- "LDM: An unexpected error occurred while reading lambda debug config '%s': '%s'",
248
- LAMBDA_DEBUG_MODE_CONFIG_PATH,
249
- ex,
250
- )
251
-
252
- if not yaml_configuration_string:
253
- return
254
-
255
- config = parse_ldm_config(yaml_configuration_string)
256
- if config is not None:
257
- LDM.remove_all_configurations()
258
- for qualified_lambda_arn, ldm_config in config.functions.items():
259
- LDM.add_configuration(
260
- config=LambdaFunctionDebugConfig(
261
- qualified_lambda_arn=qualified_lambda_arn,
262
- port=ldm_config.debug_port,
263
- enforce_timeouts=ldm_config.enforce_timeouts,
264
- )
265
- )
266
- LDM.enable_configuration(qualified_lambda_arn=qualified_lambda_arn)
267
- LOG.info(
268
- "LDM is now enforcing the latest configuration from the LDM configuration file"
269
- )
270
- else:
271
- LOG.warning(
272
- "LDM could not load the latest Lambda debug mode configuration "
273
- "due to an error; check logs for more details."
274
- )
275
-
276
- @staticmethod
277
- def _config_file_epoch_last_modified_or_now() -> int:
278
- try:
279
- modified_time = os.path.getmtime(LAMBDA_DEBUG_MODE_CONFIG_PATH)
280
- return int(modified_time)
281
- except Exception as e:
282
- LOG.warning("LDM could not access the configuration file: %s", e)
283
- epoch_now = int(time.time())
284
- return epoch_now
285
-
286
-
287
- class LambdaDebugMode:
288
- _mutex: Final[RLock]
289
- _is_enabled: bool
290
- _debug_targets: Final[dict[str, LambdaDebugTarget]]
291
- _config_file_watch: Final[Optional[LDMConfigFileWatch]]
292
-
293
- def __init__(self):
294
- self._mutex = RLock()
295
- self._is_enabled = bool(LAMBDA_DEBUG_MODE)
296
- self._debug_targets = dict()
297
- self._config_file_watch = LDMConfigFileWatch() if LAMBDA_DEBUG_MODE_CONFIG_PATH else None
298
- if self._is_enabled:
299
- self.start_debug_mode()
300
-
301
- @staticmethod
302
- @singleton_factory
303
- def get() -> LambdaDebugMode:
304
- """Returns a singleton instance of the Lambda Debug Mode session."""
305
- return LambdaDebugMode()
306
-
307
- def start_debug_mode(self) -> None:
308
- with self._mutex:
309
- self._is_enabled = True
310
- if self._config_file_watch:
311
- self._config_file_watch.start()
312
-
313
- def stop_debug_mode(self) -> None:
314
- with self._mutex:
315
- self._is_enabled = False
316
- if self._config_file_watch:
317
- self._config_file_watch.stop()
318
- self.remove_all_configurations()
319
-
320
- def is_enabled(self) -> bool:
321
- return self._is_enabled
322
-
323
- def add_configuration(self, config: LambdaFunctionDebugConfig) -> None:
324
- with self._mutex:
325
- if not self._is_enabled:
326
- return
327
-
328
- arn = config.qualified_lambda_arn
329
- if existing_target := self._debug_targets.get(arn):
330
- existing_target.stop_debug_enabled_execution_environment()
331
-
332
- target = LambdaDebugTarget(lambda_function_debug_config=config)
333
- self._debug_targets[arn] = target
334
-
335
- def enable_configuration(self, qualified_lambda_arn: Arn) -> None:
336
- with self._mutex:
337
- if not self._is_enabled:
338
- return
339
-
340
- if target := self._debug_targets.get(qualified_lambda_arn):
341
- threading.Thread(
342
- target=target.start_debug_enabled_execution_environment,
343
- args=(),
344
- name=f"LambdaDebugTarget-start_debug_enabled_execution_environment-{qualified_lambda_arn}",
345
- daemon=True,
346
- ).start()
347
-
348
- def remove_configuration(self, qualified_lambda_arn: Arn) -> None:
349
- with self._mutex:
350
- if not self._is_enabled:
351
- return
352
-
353
- if target := self._debug_targets.pop(qualified_lambda_arn, None):
354
- target.stop_debug_enabled_execution_environment()
355
-
356
- def remove_all_configurations(self) -> None:
357
- with self._mutex:
358
- for target in self._debug_targets.values():
359
- target.stop_debug_enabled_execution_environment()
360
- self._debug_targets.clear()
361
-
362
- def get_execution_environment(
363
- self, qualified_lambda_arn: Arn, user_agent: Optional[str]
364
- ) -> Optional[DebugEnabledExecutionEnvironment]:
365
- if not self._is_enabled:
366
- return None
367
-
368
- if target := self._debug_targets.get(qualified_lambda_arn):
369
- target_user_agent = target.lambda_function_debug_config.user_agent
370
- if target_user_agent is None or target_user_agent == user_agent:
371
- return target.get_execution_environment()
372
- return None
373
-
374
-
375
- LDM: Final[LambdaDebugMode] = LambdaDebugMode.get()
@@ -1,178 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import logging
4
- from typing import Optional
5
-
6
- import yaml
7
- from pydantic import BaseModel, Field, ValidationError
8
- from yaml import Loader, MappingNode, MarkedYAMLError, SafeLoader
9
-
10
- from localstack.aws.api.lambda_ import Arn
11
- from localstack.services.lambda_.lambda_debug_mode.ldm_types import LDMException
12
- from localstack.services.lambda_.lambda_debug_mode.ldm_utils import to_qualified_lambda_function_arn
13
-
14
- LOG = logging.getLogger(__name__)
15
-
16
-
17
- class PortAlreadyInUse(LDMException):
18
- port_number: int
19
-
20
- def __init__(self, port_number: int):
21
- self.port_number = port_number
22
-
23
- def __str__(self):
24
- return f"PortAlreadyInUse: '{self.port_number}'"
25
-
26
-
27
- class DuplicateLDMConfig(LDMException):
28
- lambda_arn_debug_config_first: str
29
- lambda_arn_debug_config_second: str
30
-
31
- def __init__(self, lambda_arn_debug_config_first: str, lambda_arn_debug_config_second: str):
32
- self.lambda_arn_debug_config_first = lambda_arn_debug_config_first
33
- self.lambda_arn_debug_config_second = lambda_arn_debug_config_second
34
-
35
- def __str__(self):
36
- return (
37
- f"DuplicateLDMConfig: Lambda debug configuration in '{self.lambda_arn_debug_config_first}' "
38
- f"is redefined in '{self.lambda_arn_debug_config_second}'"
39
- )
40
-
41
-
42
- class LambdaFunctionConfig(BaseModel):
43
- debug_port: Optional[int] = Field(None, alias="debug-port")
44
- enforce_timeouts: bool = Field(False, alias="enforce-timeouts")
45
-
46
-
47
- class LDMConfigFile(BaseModel):
48
- # Bindings of Lambda function Arn and the respective debugging configuration.
49
- functions: dict[Arn, LambdaFunctionConfig]
50
-
51
-
52
- class _LDMConfigPostProcessingState:
53
- ports_used: set[int]
54
-
55
- def __init__(self):
56
- self.ports_used = set()
57
-
58
-
59
- class _SafeLoaderWithDuplicateCheck(SafeLoader):
60
- def __init__(self, stream):
61
- super().__init__(stream)
62
- self.add_constructor(
63
- yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
64
- self._construct_mappings_with_duplicate_check,
65
- )
66
-
67
- @staticmethod
68
- def _construct_mappings_with_duplicate_check(
69
- loader: Loader, node: MappingNode, deep=False
70
- ) -> dict:
71
- # Constructs yaml bindings, whilst checking for duplicate mapping key definitions, raising a
72
- # MarkedYAMLError when one is found.
73
- mapping = dict()
74
- for key_node, value_node in node.value:
75
- key = loader.construct_object(key_node, deep=deep)
76
- if key in mapping:
77
- # Create a MarkedYAMLError to indicate the duplicate key issue
78
- raise MarkedYAMLError(
79
- context="while constructing a mapping",
80
- context_mark=node.start_mark,
81
- problem=f"found duplicate key: {key}",
82
- problem_mark=key_node.start_mark,
83
- )
84
- value = loader.construct_object(value_node, deep=deep)
85
- mapping[key] = value
86
- return mapping
87
-
88
-
89
- def _from_yaml_string(yaml_string: str) -> Optional[LDMConfigFile]:
90
- try:
91
- data = yaml.load(yaml_string, _SafeLoaderWithDuplicateCheck)
92
- except yaml.YAMLError as yaml_error:
93
- LOG.error(
94
- "Could not parse yaml LDM configuration file due to: %s",
95
- yaml_error,
96
- )
97
- data = None
98
- if not data:
99
- return None
100
- config = LDMConfigFile(**data)
101
- return config
102
-
103
-
104
- def _post_process_ldm_config_file(
105
- ldm_config: LDMConfigFile,
106
- post_processing_state: Optional[_LDMConfigPostProcessingState] = None,
107
- ) -> None:
108
- post_processing_state = post_processing_state or _LDMConfigPostProcessingState()
109
- lambda_function_configs = ldm_config.functions
110
- lambda_arns = list(lambda_function_configs.keys())
111
- for lambda_arn in lambda_arns:
112
- qualified_lambda_arn = to_qualified_lambda_function_arn(lambda_arn)
113
- if lambda_arn != qualified_lambda_arn:
114
- if qualified_lambda_arn in lambda_function_configs:
115
- raise DuplicateLDMConfig(
116
- lambda_arn_debug_config_first=lambda_arn,
117
- lambda_arn_debug_config_second=qualified_lambda_arn,
118
- )
119
- lambda_function_configs[qualified_lambda_arn] = lambda_function_configs.pop(lambda_arn)
120
-
121
- for lambda_function_config in lambda_function_configs.values():
122
- _post_process_lambda_function_config(
123
- post_processing_state=post_processing_state,
124
- lambda_function_config=lambda_function_config,
125
- )
126
-
127
-
128
- def _post_process_lambda_function_config(
129
- post_processing_state: _LDMConfigPostProcessingState,
130
- lambda_function_config: LambdaFunctionConfig,
131
- ) -> None:
132
- debug_port: Optional[int] = lambda_function_config.debug_port
133
- if debug_port is None:
134
- return
135
- if debug_port in post_processing_state.ports_used:
136
- raise PortAlreadyInUse(port_number=debug_port)
137
- post_processing_state.ports_used.add(debug_port)
138
-
139
-
140
- def parse_ldm_config(yaml_string: str) -> Optional[LDMConfigFile]:
141
- # Attempt to parse the yaml string.
142
- try:
143
- yaml_data = yaml.load(yaml_string, _SafeLoaderWithDuplicateCheck)
144
- except yaml.YAMLError as yaml_error:
145
- LOG.error(
146
- "Could not parse yaml LDM configuration file due to: %s",
147
- yaml_error,
148
- )
149
- yaml_data = None
150
- if not yaml_data:
151
- return None
152
-
153
- # Attempt to build the LDMConfig object from the yaml object.
154
- try:
155
- config = LDMConfigFile(**yaml_data)
156
- except ValidationError as validation_error:
157
- validation_errors = validation_error.errors() or list()
158
- error_messages = [
159
- f"When parsing '{err.get('loc', '')}': {err.get('msg', str(err))}"
160
- for err in validation_errors
161
- ]
162
- LOG.error(
163
- "Unable to parse LDM configuration file due to errors: %s",
164
- error_messages,
165
- )
166
- return None
167
-
168
- # Attempt to post_process the configuration.
169
- try:
170
- _post_process_ldm_config_file(config)
171
- except LDMException as ldm_error:
172
- LOG.error(
173
- "Invalid LDM configuration due to: %s",
174
- ldm_error,
175
- )
176
- config = None
177
-
178
- return config
@@ -1,11 +0,0 @@
1
- class LDMException(Exception): ...
2
-
3
-
4
- class UnknownLambdaArnFormat(LDMException):
5
- unknown_lambda_arn: str
6
-
7
- def __init__(self, unknown_lambda_arn: str):
8
- self.unknown_lambda_arn = unknown_lambda_arn
9
-
10
- def __str__(self):
11
- return f"UnknownLambdaArnFormat: '{self.unknown_lambda_arn}'"
@@ -1,43 +0,0 @@
1
- from localstack.aws.api.lambda_ import Arn
2
- from localstack.services.lambda_.lambda_debug_mode.ldm_types import UnknownLambdaArnFormat
3
-
4
-
5
- def to_qualified_lambda_function_arn(lambda_arn: Arn) -> Arn:
6
- """
7
- Returns the $LATEST qualified version of a structurally unqualified version of a lambda Arn iff this
8
- is detected to be structurally unqualified. Otherwise, it returns the given string.
9
- Example:
10
- - arn:aws:lambda:eu-central-1:000000000000:function:functionname:$LATEST ->
11
- unchanged
12
-
13
- - arn:aws:lambda:eu-central-1:000000000000:function:functionname ->
14
- arn:aws:lambda:eu-central-1:000000000000:function:functionname:$LATEST
15
-
16
- - arn:aws:lambda:eu-central-1:000000000000:function:functionname: ->
17
- exception UnknownLambdaArnFormat
18
-
19
- - arn:aws:lambda:eu-central-1:000000000000:function ->
20
- exception UnknownLambdaArnFormat
21
- """
22
- # TODO: consider adding arn syntax validation at this depth.
23
-
24
- if not lambda_arn:
25
- return lambda_arn
26
- lambda_arn_parts = lambda_arn.split(":")
27
- lambda_arn_parts_len = len(lambda_arn_parts)
28
-
29
- # The arn is qualified and with a non-empy qualifier.
30
- is_qualified = lambda_arn_parts_len == 8
31
- if is_qualified and lambda_arn_parts[-1]:
32
- return lambda_arn
33
-
34
- # Unknown lambda arn format.
35
- is_unqualified = lambda_arn_parts_len == 7
36
- if not is_unqualified:
37
- raise UnknownLambdaArnFormat(unknown_lambda_arn=lambda_arn)
38
-
39
- # Structure-wise, the arn is missing the qualifier.
40
- qualifier = "$LATEST"
41
- arn_tail = f":{qualifier}" if is_unqualified else qualifier
42
- qualified_lambda_arn = lambda_arn + arn_tail
43
- return qualified_lambda_arn
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin"], "localstack.hooks.on_infra_start": ["apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "eager_load_services=localstack.services.plugins:eager_load_services", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "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_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui"], "localstack.packages": ["jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_shutdown": ["publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "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", "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.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.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.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"]}