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.
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +3 -6
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/docker_runtime_executor.py +0 -5
- localstack/services/lambda_/invocation/executor_endpoint.py +3 -6
- localstack/services/lambda_/invocation/lambda_service.py +3 -0
- localstack/services/lambda_/invocation/version_manager.py +15 -7
- localstack/services/lambda_/ldm.py +15 -0
- localstack/services/lambda_/provider.py +1 -19
- localstack/version.py +2 -2
- {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/METADATA +1 -1
- {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/RECORD +19 -23
- localstack_core-4.7.1.dev1.dist-info/plux.json +1 -0
- localstack/services/lambda_/lambda_debug_mode/__init__.py +0 -0
- localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
- localstack_core-4.6.1.dev77.dist-info/plux.json +0 -1
- {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/licenses/LICENSE.txt +0 -0
- {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
|
|
69
|
-
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
|
|
209
|
+
if ldm.IS_LDM_ENABLED:
|
|
213
210
|
# The value is set to a default high value to ensure eventual termination.
|
|
214
|
-
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_.
|
|
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
|
|
198
|
-
|
|
199
|
-
|
|
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 =
|
|
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=
|
|
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
|
-
|
|
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 =
|
|
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.
|
|
21
|
-
__version_tuple__ = version_tuple = (4,
|
|
20
|
+
__version__ = version = '4.7.1.dev1'
|
|
21
|
+
__version_tuple__ = version_tuple = (4, 7, 1, 'dev1')
|
|
@@ -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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1292
|
-
localstack_core-4.
|
|
1293
|
-
localstack_core-4.
|
|
1294
|
-
localstack_core-4.
|
|
1295
|
-
localstack_core-4.
|
|
1296
|
-
localstack_core-4.
|
|
1297
|
-
localstack_core-4.
|
|
1298
|
-
localstack_core-4.
|
|
1299
|
-
localstack_core-4.
|
|
1300
|
-
localstack_core-4.
|
|
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"]}
|
|
File without changes
|
{localstack_core-4.6.1.dev77.data → localstack_core-4.7.1.dev1.data}/scripts/localstack-supervisor
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|
{localstack_core-4.6.1.dev77.dist-info → localstack_core-4.7.1.dev1.dist-info}/top_level.txt
RENAMED
|
File without changes
|