localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__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/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/cloudformation/__init__.py +18 -4
- localstack/aws/api/cloudwatch/__init__.py +41 -1
- localstack/aws/api/config/__init__.py +4 -0
- localstack/aws/api/core.py +8 -5
- localstack/aws/api/dynamodb/__init__.py +30 -0
- localstack/aws/api/ec2/__init__.py +1545 -66
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/iam/__init__.py +7 -0
- localstack/aws/api/kinesis/__init__.py +19 -0
- localstack/aws/api/kms/__init__.py +6 -0
- localstack/aws/api/lambda_/__init__.py +36 -23
- localstack/aws/api/logs/__init__.py +20 -8
- localstack/aws/api/opensearch/__init__.py +16 -0
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/redshift/__init__.py +9 -3
- localstack/aws/api/route53/__init__.py +5 -0
- localstack/aws/api/s3/__init__.py +12 -0
- localstack/aws/api/s3control/__init__.py +56 -0
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/ssm/__init__.py +2 -0
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/api/transcribe/__init__.py +17 -0
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +14 -11
- localstack/aws/connect.py +42 -41
- localstack/aws/forwarder.py +57 -9
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +2 -3
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/internal_requests.py +6 -1
- localstack/aws/handlers/logging.py +13 -4
- localstack/aws/handlers/metric_handler.py +44 -5
- localstack/aws/handlers/service.py +48 -28
- localstack/aws/mocking.py +18 -27
- localstack/aws/patches.py +2 -2
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +475 -49
- localstack/aws/protocol/serializer.py +723 -106
- localstack/aws/protocol/service_router.py +133 -33
- localstack/aws/protocol/validate.py +6 -6
- localstack/aws/scaffold.py +9 -10
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +12 -11
- localstack/aws/spec-patches.json +58 -0
- localstack/aws/spec.py +66 -46
- localstack/cli/exceptions.py +1 -1
- localstack/cli/localstack.py +11 -11
- localstack/cli/lpm.py +4 -5
- localstack/cli/plugins.py +1 -1
- localstack/cli/profiles.py +1 -2
- localstack/config.py +44 -30
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +130 -7
- localstack/dev/run/__main__.py +5 -5
- localstack/dev/run/configurators.py +1 -4
- localstack/dev/run/paths.py +6 -6
- localstack/dns/models.py +2 -1
- localstack/dns/plugins.py +5 -1
- localstack/dns/server.py +16 -6
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +6 -6
- localstack/packages/api.py +13 -12
- localstack/packages/core.py +4 -4
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +38 -12
- localstack/packages/plugins.py +0 -8
- localstack/runtime/analytics.py +3 -0
- localstack/runtime/hooks.py +1 -1
- localstack/runtime/init.py +8 -9
- localstack/runtime/main.py +5 -5
- localstack/runtime/patches.py +2 -2
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +7 -10
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +27 -28
- localstack/services/apigateway/legacy/integration.py +11 -10
- localstack/services/apigateway/legacy/invocations.py +6 -5
- localstack/services/apigateway/legacy/provider.py +148 -68
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +6 -6
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
- localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
- localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/next_gen/provider.py +5 -0
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/api_utils.py +4 -8
- localstack/services/cloudformation/cfn_utils.py +2 -2
- localstack/services/cloudformation/deployment_utils.py +14 -12
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +27 -17
- localstack/services/cloudformation/engine/parameters.py +4 -4
- localstack/services/cloudformation/engine/template_deployer.py +15 -14
- localstack/services/cloudformation/engine/template_utils.py +34 -12
- localstack/services/cloudformation/engine/transformers.py +11 -8
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
- localstack/services/cloudformation/engine/v2/resolving.py +102 -0
- localstack/services/cloudformation/engine/yaml_parser.py +9 -2
- localstack/services/cloudformation/provider.py +11 -6
- localstack/services/cloudformation/provider_utils.py +34 -4
- localstack/services/cloudformation/resource_provider.py +31 -21
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/resources.py +24149 -0
- localstack/services/cloudformation/scaffolding/__main__.py +13 -12
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/service_models.py +2 -2
- localstack/services/cloudformation/stores.py +33 -22
- localstack/services/cloudformation/v2/entities.py +103 -88
- localstack/services/cloudformation/v2/provider.py +872 -131
- localstack/services/cloudformation/v2/types.py +38 -0
- localstack/services/cloudformation/v2/utils.py +4 -1
- localstack/services/cloudwatch/alarm_scheduler.py +11 -8
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +30 -25
- localstack/services/cloudwatch/provider_v2.py +27 -32
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +3 -3
- localstack/services/dynamodb/provider.py +159 -18
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/server.py +2 -2
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +157 -18
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +26 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +6 -6
- localstack/services/es/provider.py +21 -21
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/event_rule_engine.py +31 -13
- localstack/services/events/models.py +29 -30
- localstack/services/events/provider.py +29 -26
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +21 -13
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +15 -15
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +25 -16
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +14 -119
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/iam/resources/policy_simulator.py +133 -0
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +17 -5
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/provider.py +86 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +21 -18
- localstack/services/kms/provider.py +62 -26
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +4 -3
- localstack/services/lambda_/api_utils.py +19 -16
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
- localstack/services/lambda_/invocation/event_manager.py +1 -1
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
- localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
- localstack/services/lambda_/invocation/lambda_models.py +33 -30
- localstack/services/lambda_/invocation/lambda_service.py +12 -5
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/invocation/version_manager.py +31 -8
- localstack/services/lambda_/ldm.py +14 -0
- localstack/services/lambda_/packages.py +3 -4
- localstack/services/lambda_/provider.py +9 -26
- localstack/services/lambda_/provider_utils.py +1 -1
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/lambda_/urlrouter.py +14 -1
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +39 -22
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +5 -4
- localstack/services/opensearch/cluster.py +28 -20
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +27 -9
- localstack/services/opensearch/provider.py +15 -10
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +57 -10
- localstack/services/plugins.py +37 -32
- localstack/services/providers.py +10 -2
- localstack/services/redshift/provider.py +0 -21
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/constants.py +5 -2
- localstack/services/s3/cors.py +8 -8
- localstack/services/s3/models.py +73 -73
- localstack/services/s3/notifications.py +74 -58
- localstack/services/s3/presigned_url.py +41 -59
- localstack/services/s3/provider.py +86 -29
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +51 -31
- localstack/services/s3/validation.py +47 -33
- localstack/services/s3/website_hosting.py +9 -7
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +10 -12
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/models.py +8 -1
- localstack/services/ses/provider.py +128 -55
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/constants.py +7 -1
- localstack/services/sns/executor.py +9 -2
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +9 -7
- localstack/services/sns/publisher.py +37 -23
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sns/v2/models.py +167 -0
- localstack/services/sns/v2/provider.py +867 -0
- localstack/services/sns/v2/utils.py +130 -0
- localstack/services/sqs/constants.py +2 -2
- localstack/services/sqs/developer_api.py +205 -0
- localstack/services/sqs/models.py +71 -36
- localstack/services/sqs/provider.py +56 -332
- localstack/services/sqs/query_api.py +8 -5
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +123 -4
- localstack/services/ssm/provider.py +3 -4
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +9 -9
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
- localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +22 -24
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +12 -12
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
- localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +8 -8
- localstack/services/stepfunctions/backend/execution.py +29 -30
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +28 -28
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +9 -9
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/packages.py +14 -5
- localstack/services/stepfunctions/provider.py +34 -44
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +8 -8
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +8 -3
- localstack/state/codecs.py +61 -0
- localstack/state/core.py +11 -5
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +36 -23
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/cloudformation_utils.py +1 -1
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +68 -18
- localstack/testing/pytest/container.py +5 -5
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +188 -49
- localstack/testing/pytest/in_memory_localstack.py +1 -3
- localstack/testing/pytest/marking.py +42 -15
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +11 -10
- localstack/testing/pytest/util.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -4
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +8 -3
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metadata.py +6 -4
- localstack/utils/analytics/metrics/counter.py +11 -18
- localstack/utils/analytics/metrics/registry.py +2 -2
- localstack/utils/analytics/publisher.py +4 -5
- localstack/utils/analytics/service_providers.py +19 -0
- localstack/utils/analytics/service_request_aggregator.py +4 -4
- localstack/utils/archives.py +12 -12
- localstack/utils/asyncio.py +2 -2
- localstack/utils/aws/arns.py +26 -31
- localstack/utils/aws/aws_responses.py +21 -28
- localstack/utils/aws/aws_stack.py +7 -12
- localstack/utils/aws/dead_letter_queue.py +4 -9
- localstack/utils/aws/message_forwarding.py +8 -11
- localstack/utils/aws/request_context.py +5 -6
- localstack/utils/aws/resources.py +1 -1
- localstack/utils/aws/templating.py +4 -4
- localstack/utils/batch_policy.py +4 -4
- localstack/utils/bootstrap.py +37 -30
- localstack/utils/catalog/catalog.py +139 -0
- localstack/utils/catalog/catalog_loader.py +119 -0
- localstack/utils/catalog/common.py +58 -0
- localstack/utils/catalog/plugins.py +28 -0
- localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
- localstack/utils/collections.py +33 -27
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +5 -6
- localstack/utils/container_utils/container_client.py +156 -160
- localstack/utils/container_utils/docker_cmd_client.py +97 -81
- localstack/utils/container_utils/docker_sdk_client.py +75 -72
- localstack/utils/crypto.py +12 -13
- localstack/utils/diagnose.py +11 -12
- localstack/utils/docker_utils.py +11 -7
- localstack/utils/files.py +34 -15
- localstack/utils/functions.py +5 -4
- localstack/utils/http.py +14 -14
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +21 -7
- localstack/utils/kinesis/kinesis_connector.py +2 -1
- localstack/utils/net.py +25 -17
- localstack/utils/no_exit_argument_parser.py +2 -2
- localstack/utils/numbers.py +9 -2
- localstack/utils/objects.py +15 -14
- localstack/utils/patch.py +14 -7
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +15 -14
- localstack/utils/scheduler.py +13 -12
- localstack/utils/server/tcp_proxy.py +2 -2
- localstack/utils/serving.py +3 -4
- localstack/utils/strings.py +15 -16
- localstack/utils/sync.py +126 -1
- localstack/utils/tagging.py +10 -8
- localstack/utils/testutil.py +17 -17
- localstack/utils/threads.py +3 -3
- localstack/utils/time.py +12 -4
- localstack/utils/urls.py +1 -3
- localstack/utils/xml.py +1 -1
- localstack/utils/xray/traceid.py +1 -1
- localstack/version.py +16 -3
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
- localstack/packages/terraform.py +0 -47
- localstack/services/cloudformation/deploy.html +0 -144
- localstack/services/cloudformation/deploy_ui.py +0 -47
- localstack/services/cloudformation/plugins.py +0 -12
- 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.dev60.dist-info/plux.json +0 -1
- /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
|
@@ -5,8 +5,9 @@ import shutil
|
|
|
5
5
|
import tempfile
|
|
6
6
|
import threading
|
|
7
7
|
from collections import defaultdict
|
|
8
|
+
from collections.abc import Callable
|
|
8
9
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
10
|
+
from typing import Literal
|
|
10
11
|
|
|
11
12
|
from localstack import config
|
|
12
13
|
from localstack.aws.api.lambda_ import Architecture, PackageType, Runtime
|
|
@@ -23,7 +24,6 @@ from localstack.services.lambda_.invocation.runtime_executor import (
|
|
|
23
24
|
LambdaRuntimeException,
|
|
24
25
|
RuntimeExecutor,
|
|
25
26
|
)
|
|
26
|
-
from localstack.services.lambda_.lambda_debug_mode.ldm import LDM_ENV_VAR_DEBUG_PORT
|
|
27
27
|
from localstack.services.lambda_.lambda_utils import HINT_LOG
|
|
28
28
|
from localstack.services.lambda_.networking import (
|
|
29
29
|
get_all_container_networks_for_lambda,
|
|
@@ -146,7 +146,7 @@ class RuntimeImageResolver:
|
|
|
146
146
|
def __init__(
|
|
147
147
|
self, default_resolve_fn: Callable[[Runtime], str] = get_default_image_for_runtime
|
|
148
148
|
):
|
|
149
|
-
self._mapping =
|
|
149
|
+
self._mapping = {}
|
|
150
150
|
self._default_resolve_fn = default_resolve_fn
|
|
151
151
|
|
|
152
152
|
def _resolve(self, runtime: Runtime, custom_image_mapping: str = "") -> str:
|
|
@@ -275,12 +275,12 @@ class LambdaContainerConfiguration(ContainerConfiguration):
|
|
|
275
275
|
|
|
276
276
|
|
|
277
277
|
class DockerRuntimeExecutor(RuntimeExecutor):
|
|
278
|
-
ip:
|
|
279
|
-
executor_endpoint:
|
|
278
|
+
ip: str | None
|
|
279
|
+
executor_endpoint: ExecutorEndpoint | None
|
|
280
280
|
container_name: str
|
|
281
281
|
|
|
282
282
|
def __init__(self, id: str, function_version: FunctionVersion) -> None:
|
|
283
|
-
super(
|
|
283
|
+
super().__init__(id=id, function_version=function_version)
|
|
284
284
|
self.ip = None
|
|
285
285
|
self.executor_endpoint = ExecutorEndpoint(self.id)
|
|
286
286
|
self.container_name = self._generate_container_name()
|
|
@@ -376,10 +376,6 @@ class DockerRuntimeExecutor(RuntimeExecutor):
|
|
|
376
376
|
container_config.ports = PortMappings()
|
|
377
377
|
container_config.ports.add(config.LAMBDA_INIT_DELVE_PORT, config.LAMBDA_INIT_DELVE_PORT)
|
|
378
378
|
|
|
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
379
|
if (
|
|
384
380
|
self.function_version.config.layers
|
|
385
381
|
and not config.LAMBDA_PREBUILD_IMAGES
|
|
@@ -460,7 +456,7 @@ class DockerRuntimeExecutor(RuntimeExecutor):
|
|
|
460
456
|
def _get_networks_for_executor(self) -> list[str]:
|
|
461
457
|
return get_all_container_networks_for_lambda()
|
|
462
458
|
|
|
463
|
-
def invoke(self, payload:
|
|
459
|
+
def invoke(self, payload: dict[str, str]):
|
|
464
460
|
LOG.debug(
|
|
465
461
|
"Sending invoke-payload '%s' to executor '%s'",
|
|
466
462
|
truncate(json.dumps(payload), config.LAMBDA_TRUNCATE_STDOUT),
|
|
@@ -42,7 +42,7 @@ def get_sqs_client(function_version: FunctionVersion, client_config=None):
|
|
|
42
42
|
# TODO: remove once DLQ handling is refactored following the removal of the legacy lambda provider
|
|
43
43
|
class LegacyInvocationException(Exception):
|
|
44
44
|
def __init__(self, message, log_output=None, result=None):
|
|
45
|
-
super(
|
|
45
|
+
super().__init__(message)
|
|
46
46
|
self.log_output = log_output
|
|
47
47
|
self.result = result
|
|
48
48
|
|
|
@@ -2,10 +2,10 @@ import logging
|
|
|
2
2
|
import random
|
|
3
3
|
import string
|
|
4
4
|
import time
|
|
5
|
+
from collections.abc import Callable
|
|
5
6
|
from datetime import date, datetime
|
|
6
7
|
from enum import Enum, auto
|
|
7
8
|
from threading import RLock, Timer
|
|
8
|
-
from typing import Callable, Dict, Optional
|
|
9
9
|
|
|
10
10
|
from localstack import config
|
|
11
11
|
from localstack.aws.connect import connect_to
|
|
@@ -61,8 +61,8 @@ class ExecutionEnvironment:
|
|
|
61
61
|
status: RuntimeStatus
|
|
62
62
|
initialization_type: InitializationType
|
|
63
63
|
last_returned: datetime
|
|
64
|
-
startup_timer:
|
|
65
|
-
keepalive_timer:
|
|
64
|
+
startup_timer: Timer | None
|
|
65
|
+
keepalive_timer: Timer | None
|
|
66
66
|
on_timeout: Callable[[str, str], None]
|
|
67
67
|
|
|
68
68
|
def __init__(
|
|
@@ -91,7 +91,7 @@ class ExecutionEnvironment:
|
|
|
91
91
|
def get_log_stream_name(self) -> str:
|
|
92
92
|
return f"{date.today():%Y/%m/%d}/[{self.function_version.id.qualifier}]{self.id}"
|
|
93
93
|
|
|
94
|
-
def get_environment_variables(self) ->
|
|
94
|
+
def get_environment_variables(self) -> dict[str, str]:
|
|
95
95
|
"""
|
|
96
96
|
Returns the environment variable set for the runtime container
|
|
97
97
|
:return: Dict of environment variables
|
|
@@ -3,18 +3,15 @@ import logging
|
|
|
3
3
|
import time
|
|
4
4
|
from concurrent.futures import CancelledError, Future
|
|
5
5
|
from http import HTTPStatus
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
import requests
|
|
9
9
|
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
|
|
@@ -121,8 +118,8 @@ class ExecutorEndpoint(Endpoint):
|
|
|
121
118
|
def __init__(
|
|
122
119
|
self,
|
|
123
120
|
executor_id: str,
|
|
124
|
-
container_address:
|
|
125
|
-
container_port:
|
|
121
|
+
container_address: str | None = None,
|
|
122
|
+
container_port: int | None = INVOCATION_PORT,
|
|
126
123
|
) -> None:
|
|
127
124
|
self.container_address = container_address
|
|
128
125
|
self.container_port = container_port
|
|
@@ -143,7 +140,7 @@ class ExecutorEndpoint(Endpoint):
|
|
|
143
140
|
|
|
144
141
|
def invocation_logs(self, request: Request, invoke_id: str) -> Response:
|
|
145
142
|
logs = request.json
|
|
146
|
-
if isinstance(logs,
|
|
143
|
+
if isinstance(logs, dict):
|
|
147
144
|
self.logs = logs["logs"]
|
|
148
145
|
else:
|
|
149
146
|
LOG.error("Invalid logs from init! Logs: %s", logs)
|
|
@@ -186,7 +183,7 @@ class ExecutorEndpoint(Endpoint):
|
|
|
186
183
|
if self.invocation_future:
|
|
187
184
|
self.invocation_future.cancel()
|
|
188
185
|
|
|
189
|
-
def invoke(self, payload:
|
|
186
|
+
def invoke(self, payload: dict[str, str]) -> InvocationResult:
|
|
190
187
|
self.invocation_future = Future()
|
|
191
188
|
self.logs = None
|
|
192
189
|
if not self.container_address:
|
|
@@ -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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import threading
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Iterable
|
|
4
4
|
|
|
5
5
|
from localstack import config
|
|
6
6
|
from localstack.aws.api.sqs import (
|
|
@@ -19,13 +19,9 @@ from localstack.aws.api.sqs import (
|
|
|
19
19
|
String,
|
|
20
20
|
TagMap,
|
|
21
21
|
)
|
|
22
|
-
from localstack.services.sqs.models import SqsQueue, StandardQueue
|
|
23
|
-
from localstack.services.sqs.provider import
|
|
24
|
-
|
|
25
|
-
_create_message_attribute_hash,
|
|
26
|
-
to_sqs_api_message,
|
|
27
|
-
)
|
|
28
|
-
from localstack.services.sqs.utils import generate_message_id
|
|
22
|
+
from localstack.services.sqs.models import SqsQueue, StandardQueue, to_sqs_api_message
|
|
23
|
+
from localstack.services.sqs.provider import QueueUpdateWorker
|
|
24
|
+
from localstack.services.sqs.utils import create_message_attribute_hash, generate_message_id
|
|
29
25
|
from localstack.utils.objects import singleton_factory
|
|
30
26
|
from localstack.utils.strings import md5
|
|
31
27
|
from localstack.utils.time import now
|
|
@@ -189,7 +185,7 @@ class FakeSqsClient:
|
|
|
189
185
|
MD5OfBody=md5(MessageBody),
|
|
190
186
|
Body=MessageBody,
|
|
191
187
|
Attributes=self._create_message_attributes(MessageSystemAttributes),
|
|
192
|
-
MD5OfMessageAttributes=
|
|
188
|
+
MD5OfMessageAttributes=create_message_attribute_hash(MessageAttributes),
|
|
193
189
|
MessageAttributes=MessageAttributes,
|
|
194
190
|
)
|
|
195
191
|
queue_item = queue.put(
|
|
@@ -204,7 +200,7 @@ class FakeSqsClient:
|
|
|
204
200
|
"MD5OfMessageBody": message["MD5OfBody"],
|
|
205
201
|
"MD5OfMessageAttributes": message.get("MD5OfMessageAttributes"),
|
|
206
202
|
"SequenceNumber": queue_item.sequence_number,
|
|
207
|
-
"MD5OfMessageSystemAttributes":
|
|
203
|
+
"MD5OfMessageSystemAttributes": create_message_attribute_hash(MessageSystemAttributes),
|
|
208
204
|
}
|
|
209
205
|
|
|
210
206
|
|
|
@@ -12,8 +12,9 @@ import threading
|
|
|
12
12
|
from abc import ABCMeta, abstractmethod
|
|
13
13
|
from datetime import datetime
|
|
14
14
|
from pathlib import Path
|
|
15
|
-
from typing import IO,
|
|
15
|
+
from typing import IO, Literal, TypedDict
|
|
16
16
|
|
|
17
|
+
import boto3
|
|
17
18
|
from botocore.exceptions import ClientError
|
|
18
19
|
|
|
19
20
|
from localstack import config
|
|
@@ -40,7 +41,7 @@ from localstack.aws.api.lambda_ import (
|
|
|
40
41
|
TracingMode,
|
|
41
42
|
)
|
|
42
43
|
from localstack.aws.connect import connect_to
|
|
43
|
-
from localstack.constants import AWS_REGION_US_EAST_1
|
|
44
|
+
from localstack.constants import AWS_REGION_US_EAST_1, INTERNAL_AWS_SECRET_ACCESS_KEY
|
|
44
45
|
from localstack.services.lambda_.api_utils import qualified_lambda_arn, unqualified_lambda_arn
|
|
45
46
|
from localstack.utils.archives import unzip
|
|
46
47
|
from localstack.utils.strings import long_uid, short_uid
|
|
@@ -52,8 +53,8 @@ LOG = logging.getLogger(__name__)
|
|
|
52
53
|
@dataclasses.dataclass(frozen=True)
|
|
53
54
|
class VersionState:
|
|
54
55
|
state: State
|
|
55
|
-
code:
|
|
56
|
-
reason:
|
|
56
|
+
code: StateReasonCode | None = None
|
|
57
|
+
reason: str | None = None
|
|
57
58
|
|
|
58
59
|
|
|
59
60
|
@dataclasses.dataclass
|
|
@@ -66,7 +67,7 @@ class Invocation:
|
|
|
66
67
|
# = invocation_id
|
|
67
68
|
request_id: str
|
|
68
69
|
trace_context: dict
|
|
69
|
-
user_agent:
|
|
70
|
+
user_agent: str | None = None
|
|
70
71
|
|
|
71
72
|
|
|
72
73
|
InitializationType = Literal["on-demand", "provisioned-concurrency"]
|
|
@@ -74,7 +75,7 @@ InitializationType = Literal["on-demand", "provisioned-concurrency"]
|
|
|
74
75
|
|
|
75
76
|
class ArchiveCode(metaclass=ABCMeta):
|
|
76
77
|
@abstractmethod
|
|
77
|
-
def generate_presigned_url(self, endpoint_url: str
|
|
78
|
+
def generate_presigned_url(self, endpoint_url: str):
|
|
78
79
|
"""
|
|
79
80
|
Generates a presigned url pointing to the code archive
|
|
80
81
|
"""
|
|
@@ -168,15 +169,17 @@ class S3Code(ArchiveCode):
|
|
|
168
169
|
)
|
|
169
170
|
target_file.flush()
|
|
170
171
|
|
|
171
|
-
def generate_presigned_url(self, endpoint_url: str
|
|
172
|
+
def generate_presigned_url(self, endpoint_url: str) -> str:
|
|
172
173
|
"""
|
|
173
174
|
Generates a presigned url pointing to the code archive
|
|
174
175
|
"""
|
|
175
|
-
s3_client =
|
|
176
|
+
s3_client = boto3.client(
|
|
177
|
+
"s3",
|
|
176
178
|
region_name=AWS_REGION_US_EAST_1,
|
|
177
179
|
aws_access_key_id=config.INTERNAL_RESOURCE_ACCOUNT,
|
|
180
|
+
aws_secret_access_key=INTERNAL_AWS_SECRET_ACCESS_KEY,
|
|
178
181
|
endpoint_url=endpoint_url,
|
|
179
|
-
)
|
|
182
|
+
)
|
|
180
183
|
params = {"Bucket": self.s3_bucket, "Key": self.s3_key}
|
|
181
184
|
if self.s3_object_version:
|
|
182
185
|
params["VersionId"] = self.s3_object_version
|
|
@@ -257,8 +260,8 @@ class HotReloadingCode(ArchiveCode):
|
|
|
257
260
|
code_sha256: str = "hot-reloading-hash-not-available"
|
|
258
261
|
code_size: int = 0
|
|
259
262
|
|
|
260
|
-
def generate_presigned_url(self, endpoint_url: str
|
|
261
|
-
return f"
|
|
263
|
+
def generate_presigned_url(self, endpoint_url: str) -> str:
|
|
264
|
+
return f"file://{self.host_path}"
|
|
262
265
|
|
|
263
266
|
def get_unzipped_code_location(self) -> Path:
|
|
264
267
|
path = os.path.expandvars(self.host_path)
|
|
@@ -352,11 +355,11 @@ class FunctionUrlConfig:
|
|
|
352
355
|
url: str # full URL (e.g. "https://pfn5bdb2dl5mzkbn6eb2oi3xfe0nthdn.lambda-url.eu-west-3.on.aws/")
|
|
353
356
|
auth_type: FunctionUrlAuthType
|
|
354
357
|
creation_time: str # time
|
|
355
|
-
last_modified_time:
|
|
358
|
+
last_modified_time: str | None = (
|
|
356
359
|
None # TODO: check if this is the creation time when initially creating
|
|
357
360
|
)
|
|
358
|
-
function_qualifier:
|
|
359
|
-
invoke_mode:
|
|
361
|
+
function_qualifier: str | None = "$LATEST" # only $LATEST or alias name
|
|
362
|
+
invoke_mode: InvokeMode | None = None
|
|
360
363
|
|
|
361
364
|
|
|
362
365
|
@dataclasses.dataclass
|
|
@@ -374,12 +377,12 @@ class ProvisionedConcurrencyState:
|
|
|
374
377
|
status: ProvisionedConcurrencyStatusEnum = dataclasses.field(
|
|
375
378
|
default=ProvisionedConcurrencyStatusEnum.IN_PROGRESS
|
|
376
379
|
)
|
|
377
|
-
status_reason:
|
|
380
|
+
status_reason: str | None = None
|
|
378
381
|
|
|
379
382
|
|
|
380
383
|
@dataclasses.dataclass
|
|
381
384
|
class AliasRoutingConfig:
|
|
382
|
-
version_weights:
|
|
385
|
+
version_weights: dict[str, float]
|
|
383
386
|
|
|
384
387
|
|
|
385
388
|
@dataclasses.dataclass(frozen=True)
|
|
@@ -431,10 +434,10 @@ class EventInvokeConfig:
|
|
|
431
434
|
function_name: str
|
|
432
435
|
qualifier: str
|
|
433
436
|
|
|
434
|
-
last_modified:
|
|
435
|
-
destination_config:
|
|
436
|
-
maximum_retry_attempts:
|
|
437
|
-
maximum_event_age_in_seconds:
|
|
437
|
+
last_modified: str | None = dataclasses.field(compare=False)
|
|
438
|
+
destination_config: DestinationConfig | None = None
|
|
439
|
+
maximum_retry_attempts: int | None = None
|
|
440
|
+
maximum_event_age_in_seconds: int | None = None
|
|
438
441
|
|
|
439
442
|
|
|
440
443
|
# Result Models
|
|
@@ -484,7 +487,7 @@ class CodeSigningConfig:
|
|
|
484
487
|
allowed_publishers: AllowedPublishers
|
|
485
488
|
policies: CodeSigningPolicies
|
|
486
489
|
last_modified: str
|
|
487
|
-
description:
|
|
490
|
+
description: str | None = None
|
|
488
491
|
|
|
489
492
|
|
|
490
493
|
@dataclasses.dataclass
|
|
@@ -492,7 +495,7 @@ class LayerPolicyStatement:
|
|
|
492
495
|
sid: str
|
|
493
496
|
action: str
|
|
494
497
|
principal: str
|
|
495
|
-
organization_id:
|
|
498
|
+
organization_id: str | None
|
|
496
499
|
|
|
497
500
|
|
|
498
501
|
@dataclasses.dataclass
|
|
@@ -551,18 +554,18 @@ class VersionFunctionConfiguration:
|
|
|
551
554
|
last_modified: str # ISO string
|
|
552
555
|
state: VersionState
|
|
553
556
|
|
|
554
|
-
image:
|
|
555
|
-
image_config:
|
|
556
|
-
runtime_version_config:
|
|
557
|
-
last_update:
|
|
557
|
+
image: ImageCode | None = None
|
|
558
|
+
image_config: ImageConfig | None = None
|
|
559
|
+
runtime_version_config: RuntimeVersionConfig | None = None
|
|
560
|
+
last_update: UpdateStatus | None = None
|
|
558
561
|
revision_id: str = dataclasses.field(init=False, default_factory=long_uid)
|
|
559
562
|
layers: list[LayerVersion] = dataclasses.field(default_factory=list)
|
|
560
563
|
|
|
561
|
-
dead_letter_arn:
|
|
564
|
+
dead_letter_arn: str | None = None
|
|
562
565
|
|
|
563
566
|
# kms_key_arn: str
|
|
564
567
|
# file_system_configs: FileSystemConfig
|
|
565
|
-
vpc_config:
|
|
568
|
+
vpc_config: VpcConfig | None = None
|
|
566
569
|
|
|
567
570
|
logging_config: LoggingConfig = dataclasses.field(default_factory=dict)
|
|
568
571
|
|
|
@@ -580,7 +583,7 @@ class FunctionVersion:
|
|
|
580
583
|
@dataclasses.dataclass
|
|
581
584
|
class Function:
|
|
582
585
|
function_name: str
|
|
583
|
-
code_signing_config_arn:
|
|
586
|
+
code_signing_config_arn: str | None = None
|
|
584
587
|
aliases: dict[str, VersionAlias] = dataclasses.field(default_factory=dict)
|
|
585
588
|
versions: dict[str, FunctionVersion] = dataclasses.field(default_factory=dict)
|
|
586
589
|
function_url_configs: dict[str, FunctionUrlConfig] = dataclasses.field(
|
|
@@ -592,7 +595,7 @@ class Function:
|
|
|
592
595
|
event_invoke_configs: dict[str, EventInvokeConfig] = dataclasses.field(
|
|
593
596
|
default_factory=dict
|
|
594
597
|
) # key is $LATEST(?), version or alias
|
|
595
|
-
reserved_concurrent_executions:
|
|
598
|
+
reserved_concurrent_executions: int | None = None
|
|
596
599
|
recursive_loop: RecursiveLoop = RecursiveLoop.Terminate
|
|
597
600
|
provisioned_concurrency_configs: dict[str, ProvisionedConcurrencyConfiguration] = (
|
|
598
601
|
dataclasses.field(default_factory=dict)
|
|
@@ -11,7 +11,7 @@ from datetime import datetime
|
|
|
11
11
|
from hashlib import sha256
|
|
12
12
|
from pathlib import PurePosixPath, PureWindowsPath
|
|
13
13
|
from threading import RLock
|
|
14
|
-
from typing import TYPE_CHECKING
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
15
|
|
|
16
16
|
from localstack import config
|
|
17
17
|
from localstack.aws.api.lambda_ import (
|
|
@@ -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):
|
|
@@ -230,7 +233,7 @@ class LambdaService:
|
|
|
230
233
|
request_id: str,
|
|
231
234
|
payload: bytes | None,
|
|
232
235
|
trace_context: dict | None = None,
|
|
233
|
-
user_agent:
|
|
236
|
+
user_agent: str | None = None,
|
|
234
237
|
) -> InvocationResult | None:
|
|
235
238
|
"""
|
|
236
239
|
Invokes a specific version of a lambda
|
|
@@ -475,7 +478,11 @@ class LambdaService:
|
|
|
475
478
|
] = new_version_state
|
|
476
479
|
|
|
477
480
|
except Exception:
|
|
478
|
-
LOG.
|
|
481
|
+
LOG.error(
|
|
482
|
+
"Failed to update function version for arn %s",
|
|
483
|
+
function_arn,
|
|
484
|
+
exc_info=LOG.isEnabledFor(logging.DEBUG),
|
|
485
|
+
)
|
|
479
486
|
|
|
480
487
|
def update_alias(self, old_alias: VersionAlias, new_alias: VersionAlias, function: Function):
|
|
481
488
|
# if pointer changed, need to restart provisioned
|
|
@@ -624,7 +631,7 @@ def create_hot_reloading_code(path: str) -> HotReloadingCode:
|
|
|
624
631
|
def store_s3_bucket_archive(
|
|
625
632
|
archive_bucket: str,
|
|
626
633
|
archive_key: str,
|
|
627
|
-
archive_version:
|
|
634
|
+
archive_version: str | None,
|
|
628
635
|
function_name: str,
|
|
629
636
|
region_name: str,
|
|
630
637
|
account_id: str,
|
|
@@ -643,7 +650,7 @@ def store_s3_bucket_archive(
|
|
|
643
650
|
if archive_bucket == config.BUCKET_MARKER_LOCAL:
|
|
644
651
|
hotreload_counter.labels(operation="create").increment()
|
|
645
652
|
return create_hot_reloading_code(path=archive_key)
|
|
646
|
-
s3_client:
|
|
653
|
+
s3_client: S3Client = connect_to().s3
|
|
647
654
|
kwargs = {"VersionId": archive_version} if archive_version else {}
|
|
648
655
|
try:
|
|
649
656
|
archive_file = s3_client.get_object(Bucket=archive_bucket, Key=archive_key, **kwargs)[
|
|
@@ -3,7 +3,6 @@ import logging
|
|
|
3
3
|
import threading
|
|
4
4
|
import time
|
|
5
5
|
from queue import Queue
|
|
6
|
-
from typing import Optional, Union
|
|
7
6
|
|
|
8
7
|
from localstack.aws.connect import connect_to
|
|
9
8
|
from localstack.utils.aws.client_types import ServicePrincipal
|
|
@@ -28,9 +27,9 @@ class LogItem:
|
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
class LogHandler:
|
|
31
|
-
log_queue: "Queue[
|
|
30
|
+
log_queue: "Queue[LogItem | ShutdownPill]"
|
|
32
31
|
role_arn: str
|
|
33
|
-
_thread:
|
|
32
|
+
_thread: FuncThread | None
|
|
34
33
|
_shutdown_event: threading.Event
|
|
35
34
|
|
|
36
35
|
def __init__(self, role_arn: str, region: str) -> None:
|
|
@@ -2,7 +2,7 @@ import dataclasses
|
|
|
2
2
|
import logging
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import TypedDict
|
|
6
6
|
|
|
7
7
|
from plux import PluginManager
|
|
8
8
|
|
|
@@ -133,12 +133,12 @@ class ChmodPath(TypedDict):
|
|
|
133
133
|
mode: str
|
|
134
134
|
|
|
135
135
|
|
|
136
|
-
EXECUTOR_PLUGIN_MANAGER: PluginManager[
|
|
136
|
+
EXECUTOR_PLUGIN_MANAGER: PluginManager[type[RuntimeExecutor]] = PluginManager(
|
|
137
137
|
RuntimeExecutorPlugin.namespace
|
|
138
138
|
)
|
|
139
139
|
|
|
140
140
|
|
|
141
|
-
def get_runtime_executor() ->
|
|
141
|
+
def get_runtime_executor() -> type[RuntimeExecutor]:
|
|
142
142
|
plugin_name = config.LAMBDA_RUNTIME_EXECUTOR or "docker"
|
|
143
143
|
if not EXECUTOR_PLUGIN_MANAGER.exists(plugin_name):
|
|
144
144
|
LOG.warning(
|
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
import threading
|
|
4
4
|
import time
|
|
5
5
|
from concurrent.futures import Future
|
|
6
|
+
from concurrent.futures._base import CancelledError
|
|
6
7
|
|
|
7
8
|
from localstack import config
|
|
8
9
|
from localstack.aws.api.lambda_ import (
|
|
@@ -11,6 +12,7 @@ from localstack.aws.api.lambda_ import (
|
|
|
11
12
|
State,
|
|
12
13
|
StateReasonCode,
|
|
13
14
|
)
|
|
15
|
+
from localstack.services.lambda_ import hooks as lambda_hooks
|
|
14
16
|
from localstack.services.lambda_.invocation.assignment import AssignmentService
|
|
15
17
|
from localstack.services.lambda_.invocation.counting_service import CountingService
|
|
16
18
|
from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
|
|
@@ -29,8 +31,8 @@ from localstack.services.lambda_.invocation.metrics import (
|
|
|
29
31
|
record_cw_metric_invocation,
|
|
30
32
|
)
|
|
31
33
|
from localstack.services.lambda_.invocation.runtime_executor import get_runtime_executor
|
|
32
|
-
from localstack.services.lambda_.
|
|
33
|
-
from localstack.utils.strings import long_uid, truncate
|
|
34
|
+
from localstack.services.lambda_.ldm import LDMProvisioner
|
|
35
|
+
from localstack.utils.strings import long_uid, to_bytes, truncate
|
|
34
36
|
from localstack.utils.threads import FuncThread, start_thread
|
|
35
37
|
|
|
36
38
|
LOG = logging.getLogger(__name__)
|
|
@@ -53,6 +55,8 @@ class LambdaVersionManager:
|
|
|
53
55
|
counting_service: CountingService
|
|
54
56
|
assignment_service: AssignmentService
|
|
55
57
|
|
|
58
|
+
ldm_provisioner: LDMProvisioner | None
|
|
59
|
+
|
|
56
60
|
def __init__(
|
|
57
61
|
self,
|
|
58
62
|
function_arn: str,
|
|
@@ -80,6 +84,9 @@ class LambdaVersionManager:
|
|
|
80
84
|
# https://aws.amazon.com/blogs/compute/coming-soon-expansion-of-aws-lambda-states-to-all-functions/
|
|
81
85
|
self.state = VersionState(state=State.Pending)
|
|
82
86
|
|
|
87
|
+
self.ldm_provisioner = None
|
|
88
|
+
lambda_hooks.inject_ldm_provisioner.run(self)
|
|
89
|
+
|
|
83
90
|
def start(self) -> VersionState:
|
|
84
91
|
try:
|
|
85
92
|
self.log_handler.start_subscriber()
|
|
@@ -194,15 +201,31 @@ class LambdaVersionManager:
|
|
|
194
201
|
|
|
195
202
|
# If the environment has debugging enabled, route the invocation there;
|
|
196
203
|
# debug environments bypass Lambda service quotas.
|
|
197
|
-
if
|
|
198
|
-
|
|
199
|
-
|
|
204
|
+
if self.ldm_provisioner and (
|
|
205
|
+
ldm_execution_environment := self.ldm_provisioner.get_execution_environment(
|
|
206
|
+
qualified_lambda_arn=self.function_version.qualified_arn,
|
|
207
|
+
user_agent=invocation.user_agent,
|
|
208
|
+
)
|
|
200
209
|
):
|
|
201
210
|
try:
|
|
202
|
-
invocation_result =
|
|
211
|
+
invocation_result = ldm_execution_environment.invoke(invocation)
|
|
203
212
|
invocation_result.executed_version = self.function_version.id.qualifier
|
|
204
213
|
self.store_logs(
|
|
205
|
-
invocation_result=invocation_result, execution_env=
|
|
214
|
+
invocation_result=invocation_result, execution_env=ldm_execution_environment
|
|
215
|
+
)
|
|
216
|
+
except CancelledError as e:
|
|
217
|
+
# Timeouts for invocation futures are managed by LDM, a cancelled error here is
|
|
218
|
+
# aligned with the debug container terminating whilst debugging/invocation.
|
|
219
|
+
LOG.debug("LDM invocation future encountered a cancelled error: '%s'", e)
|
|
220
|
+
invocation_result = InvocationResult(
|
|
221
|
+
request_id="",
|
|
222
|
+
payload=to_bytes(
|
|
223
|
+
"The invocation was canceled because the debug configuration "
|
|
224
|
+
"was removed or the operation timed out"
|
|
225
|
+
),
|
|
226
|
+
is_error=True,
|
|
227
|
+
logs="",
|
|
228
|
+
executed_version=self.function_version.id.qualifier,
|
|
206
229
|
)
|
|
207
230
|
except StatusErrorException as e:
|
|
208
231
|
invocation_result = InvocationResult(
|
|
@@ -213,7 +236,7 @@ class LambdaVersionManager:
|
|
|
213
236
|
executed_version=self.function_version.id.qualifier,
|
|
214
237
|
)
|
|
215
238
|
finally:
|
|
216
|
-
|
|
239
|
+
ldm_execution_environment.release()
|
|
217
240
|
return invocation_result
|
|
218
241
|
|
|
219
242
|
with self.counting_service.get_invocation_lease(
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import abc
|
|
2
|
+
|
|
3
|
+
from localstack.aws.api.lambda_ import Arn
|
|
4
|
+
from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
|
|
5
|
+
|
|
6
|
+
DEFAULT_LDM_TIMEOUT_SECONDS: int = 3_600
|
|
7
|
+
IS_LDM_ENABLED: bool = False
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LDMProvisioner(abc.ABC):
|
|
11
|
+
@abc.abstractmethod
|
|
12
|
+
def get_execution_environment(
|
|
13
|
+
self, qualified_lambda_arn: Arn, user_agent: str | None
|
|
14
|
+
) -> ExecutionEnvironment | None: ...
|
|
@@ -4,7 +4,6 @@ import os
|
|
|
4
4
|
import stat
|
|
5
5
|
from functools import cache
|
|
6
6
|
from pathlib import Path
|
|
7
|
-
from typing import List
|
|
8
7
|
|
|
9
8
|
from localstack import config
|
|
10
9
|
from localstack.packages import DownloadInstaller, InstallTarget, Package, PackageInstaller
|
|
@@ -13,7 +12,7 @@ from localstack.utils.platform import get_arch
|
|
|
13
12
|
"""Customized LocalStack version of the AWS Lambda Runtime Interface Emulator (RIE).
|
|
14
13
|
https://github.com/localstack/lambda-runtime-init/blob/localstack/README-LOCALSTACK.md
|
|
15
14
|
"""
|
|
16
|
-
LAMBDA_RUNTIME_DEFAULT_VERSION = "v0.1.
|
|
15
|
+
LAMBDA_RUNTIME_DEFAULT_VERSION = "v0.1.36-pre"
|
|
17
16
|
LAMBDA_RUNTIME_VERSION = config.LAMBDA_INIT_RELEASE_VERSION or LAMBDA_RUNTIME_DEFAULT_VERSION
|
|
18
17
|
LAMBDA_RUNTIME_INIT_URL = "https://github.com/localstack/lambda-runtime-init/releases/download/{version}/aws-lambda-rie-{arch}"
|
|
19
18
|
|
|
@@ -35,7 +34,7 @@ class LambdaRuntimePackage(Package):
|
|
|
35
34
|
def __init__(self, default_version: str = LAMBDA_RUNTIME_VERSION):
|
|
36
35
|
super().__init__(name="Lambda", default_version=default_version)
|
|
37
36
|
|
|
38
|
-
def get_versions(self) ->
|
|
37
|
+
def get_versions(self) -> list[str]:
|
|
39
38
|
return [LAMBDA_RUNTIME_VERSION]
|
|
40
39
|
|
|
41
40
|
def _get_installer(self, version: str) -> PackageInstaller:
|
|
@@ -75,7 +74,7 @@ class LambdaJavaPackage(Package):
|
|
|
75
74
|
def __init__(self):
|
|
76
75
|
super().__init__("LambdaJavaLibs", "0.2.22")
|
|
77
76
|
|
|
78
|
-
def get_versions(self) ->
|
|
77
|
+
def get_versions(self) -> list[str]:
|
|
79
78
|
return ["0.2.22", "0.2.21"]
|
|
80
79
|
|
|
81
80
|
def _get_installer(self, version: str) -> PackageInstaller:
|