localstack-core 4.6.1.dev74__py3-none-any.whl → 4.10.1.dev7__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 +1524 -64
- 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 +13 -0
- 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 +40 -31
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +85 -5
- 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 +286 -139
- 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 +161 -31
- 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 +8 -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 +31 -22
- localstack/services/cloudformation/v2/entities.py +65 -92
- localstack/services/cloudformation/v2/provider.py +553 -128
- 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 +49 -8
- 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 +48 -7
- 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 +17 -11
- 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 +4 -4
- 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 +4 -4
- 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 +22 -60
- 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 -55
- 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 +11 -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.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/METADATA +18 -14
- {localstack_core-4.6.1.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/RECORD +663 -656
- {localstack_core-4.6.1.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev7.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.dev74.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.dev74.data → localstack_core-4.10.1.dev7.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev74.data → localstack_core-4.10.1.dev7.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev74.data → localstack_core-4.10.1.dev7.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev74.dist-info → localstack_core-4.10.1.dev7.dist-info}/top_level.txt +0 -0
localstack/aws/forwarder.py
CHANGED
|
@@ -3,10 +3,13 @@ This module contains utilities to call a backend (e.g., an external service proc
|
|
|
3
3
|
DynamoDBLocal) from a service provider.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Callable, Mapping
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
from botocore.awsrequest import AWSPreparedRequest, prepare_request_dict
|
|
9
10
|
from botocore.config import Config as BotoConfig
|
|
11
|
+
from botocore.model import OperationModel
|
|
12
|
+
from botocore.serialize import create_serializer
|
|
10
13
|
from werkzeug.datastructures import Headers
|
|
11
14
|
|
|
12
15
|
from localstack.aws.api.core import (
|
|
@@ -18,7 +21,7 @@ from localstack.aws.api.core import (
|
|
|
18
21
|
from localstack.aws.client import create_http_request, parse_response, raise_service_exception
|
|
19
22
|
from localstack.aws.connect import connect_to
|
|
20
23
|
from localstack.aws.skeleton import DispatchTable, create_dispatch_table
|
|
21
|
-
from localstack.aws.spec import load_service
|
|
24
|
+
from localstack.aws.spec import ProtocolName, load_service
|
|
22
25
|
from localstack.constants import AWS_REGION_US_EAST_1
|
|
23
26
|
from localstack.http import Response
|
|
24
27
|
from localstack.http.proxy import Proxy
|
|
@@ -54,7 +57,7 @@ class AwsRequestProxy:
|
|
|
54
57
|
self,
|
|
55
58
|
context: RequestContext,
|
|
56
59
|
service_request: ServiceRequest = None,
|
|
57
|
-
) ->
|
|
60
|
+
) -> ServiceResponse | Response | None:
|
|
58
61
|
"""Method to satisfy the ``ServiceRequestHandler`` protocol."""
|
|
59
62
|
return self.forward(context, service_request)
|
|
60
63
|
|
|
@@ -62,7 +65,7 @@ class AwsRequestProxy:
|
|
|
62
65
|
self,
|
|
63
66
|
context: RequestContext,
|
|
64
67
|
service_request: ServiceRequest = None,
|
|
65
|
-
) ->
|
|
68
|
+
) -> ServiceResponse | Response | None:
|
|
66
69
|
"""
|
|
67
70
|
Forwards the given request to the backend configured by ``endpoint_url``.
|
|
68
71
|
|
|
@@ -78,7 +81,7 @@ class AwsRequestProxy:
|
|
|
78
81
|
if not self.parse_response:
|
|
79
82
|
return http_response
|
|
80
83
|
parsed_response = parse_response(
|
|
81
|
-
context.operation, http_response, self.include_response_metadata
|
|
84
|
+
context.operation, context.protocol, http_response, self.include_response_metadata
|
|
82
85
|
)
|
|
83
86
|
raise_service_exception(http_response, parsed_response)
|
|
84
87
|
return parsed_response
|
|
@@ -89,6 +92,7 @@ class AwsRequestProxy:
|
|
|
89
92
|
action=original.operation.name,
|
|
90
93
|
parameters=service_request,
|
|
91
94
|
region=original.region,
|
|
95
|
+
protocol=original.protocol,
|
|
92
96
|
)
|
|
93
97
|
# update the newly created context with non-payload specific request headers (the payload can differ from
|
|
94
98
|
# the original request, f.e. it could be JSON encoded now while the initial request was CBOR encoded)
|
|
@@ -183,7 +187,9 @@ def dispatch_to_backend(
|
|
|
183
187
|
:raises ServiceException: if the dispatcher returned an error response
|
|
184
188
|
"""
|
|
185
189
|
http_response = http_request_dispatcher(context)
|
|
186
|
-
parsed_response = parse_response(
|
|
190
|
+
parsed_response = parse_response(
|
|
191
|
+
context.operation, context.protocol, http_response, include_response_metadata
|
|
192
|
+
)
|
|
187
193
|
raise_service_exception(http_response, parsed_response)
|
|
188
194
|
return parsed_response
|
|
189
195
|
|
|
@@ -195,9 +201,10 @@ _non_validating_boto_config = BotoConfig(parameter_validation=False)
|
|
|
195
201
|
def create_aws_request_context(
|
|
196
202
|
service_name: str,
|
|
197
203
|
action: str,
|
|
204
|
+
protocol: ProtocolName = None,
|
|
198
205
|
parameters: Mapping[str, Any] = None,
|
|
199
206
|
region: str = None,
|
|
200
|
-
endpoint_url:
|
|
207
|
+
endpoint_url: str | None = None,
|
|
201
208
|
) -> RequestContext:
|
|
202
209
|
"""
|
|
203
210
|
This is a stripped-down version of what the botocore client does to perform an HTTP request from a client call. A
|
|
@@ -209,6 +216,7 @@ def create_aws_request_context(
|
|
|
209
216
|
|
|
210
217
|
:param service_name: the AWS service
|
|
211
218
|
:param action: the action to invoke
|
|
219
|
+
:param protocol: the protocol to use
|
|
212
220
|
:param parameters: the invocation parameters
|
|
213
221
|
:param region: the region name (default is us-east-1)
|
|
214
222
|
:param endpoint_url: the endpoint to call (defaults to localstack)
|
|
@@ -221,6 +229,8 @@ def create_aws_request_context(
|
|
|
221
229
|
|
|
222
230
|
service = load_service(service_name)
|
|
223
231
|
operation = service.operation_model(action)
|
|
232
|
+
# TODO: remove this once every usage upstream has been removed
|
|
233
|
+
protocol = protocol or service.resolved_protocol
|
|
224
234
|
|
|
225
235
|
# we re-use botocore internals here to serialize the HTTP request,
|
|
226
236
|
# but deactivate validation (validation errors should be handled by the backend)
|
|
@@ -242,8 +252,14 @@ def create_aws_request_context(
|
|
|
242
252
|
endpoint_url = "http://localhost.localstack.cloud"
|
|
243
253
|
# pre-process the request args (some params are modified using botocore event handlers)
|
|
244
254
|
parameters = client._emit_api_params(parameters, operation, request_context)
|
|
245
|
-
|
|
246
|
-
|
|
255
|
+
|
|
256
|
+
request_dict = _convert_to_request_dict_with_protocol(
|
|
257
|
+
client=client,
|
|
258
|
+
protocol=protocol,
|
|
259
|
+
api_params=parameters,
|
|
260
|
+
operation_model=operation,
|
|
261
|
+
endpoint_url=endpoint_url,
|
|
262
|
+
context=request_context,
|
|
247
263
|
)
|
|
248
264
|
|
|
249
265
|
if auth_path := request_dict.get("auth_path"):
|
|
@@ -265,7 +281,39 @@ def create_aws_request_context(
|
|
|
265
281
|
context = RequestContext(request=create_http_request(aws_request))
|
|
266
282
|
context.service = service
|
|
267
283
|
context.operation = operation
|
|
284
|
+
context.protocol = protocol
|
|
268
285
|
context.region = region
|
|
269
286
|
context.service_request = parameters
|
|
270
287
|
|
|
271
288
|
return context
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _convert_to_request_dict_with_protocol(
|
|
292
|
+
client,
|
|
293
|
+
protocol: ProtocolName,
|
|
294
|
+
api_params: dict,
|
|
295
|
+
operation_model: OperationModel,
|
|
296
|
+
endpoint_url: str,
|
|
297
|
+
context: dict,
|
|
298
|
+
set_user_agent_header: bool = True,
|
|
299
|
+
) -> dict:
|
|
300
|
+
"""
|
|
301
|
+
This function is taken from botocore Client._convert_to_request_dict, but we are overriding the serializer
|
|
302
|
+
Botocore does not expose a way to create a client with a specific protocol, but we need this functionality
|
|
303
|
+
to support multi-protocols.
|
|
304
|
+
"""
|
|
305
|
+
serializer = create_serializer(protocol, include_validation=False)
|
|
306
|
+
request_dict = serializer.serialize_to_request(api_params, operation_model)
|
|
307
|
+
if not client._client_config.inject_host_prefix:
|
|
308
|
+
request_dict.pop("host_prefix", None)
|
|
309
|
+
if set_user_agent_header:
|
|
310
|
+
user_agent = client._user_agent_creator.to_string()
|
|
311
|
+
else:
|
|
312
|
+
user_agent = None
|
|
313
|
+
prepare_request_dict(
|
|
314
|
+
request_dict,
|
|
315
|
+
endpoint_url=endpoint_url,
|
|
316
|
+
user_agent=user_agent,
|
|
317
|
+
context=context,
|
|
318
|
+
)
|
|
319
|
+
return request_dict
|
localstack/aws/gateway.py
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import typing as t
|
|
2
|
-
|
|
3
1
|
from rolo.gateway import Gateway as RoloGateway
|
|
4
2
|
from rolo.response import Response
|
|
5
3
|
|
|
@@ -17,7 +15,7 @@ class Gateway(RoloGateway):
|
|
|
17
15
|
response_handlers: list[Handler] = None,
|
|
18
16
|
finalizers: list[Handler] = None,
|
|
19
17
|
exception_handlers: list[ExceptionHandler] = None,
|
|
20
|
-
context_class:
|
|
18
|
+
context_class: type[RequestContext] = None,
|
|
21
19
|
) -> None:
|
|
22
20
|
super().__init__(
|
|
23
21
|
request_handlers,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import threading
|
|
3
|
-
from typing import Optional
|
|
4
3
|
|
|
5
4
|
from localstack import config
|
|
6
5
|
from localstack.aws.api import RequestContext
|
|
@@ -52,7 +51,7 @@ class ServiceRequestCounter:
|
|
|
52
51
|
)
|
|
53
52
|
)
|
|
54
53
|
|
|
55
|
-
def _get_err_type(self, context: RequestContext, response: Response) ->
|
|
54
|
+
def _get_err_type(self, context: RequestContext, response: Response) -> str | None:
|
|
56
55
|
"""
|
|
57
56
|
Attempts to re-use the existing service_response, or parse and return the error type from the response body,
|
|
58
57
|
e.g. ``ResourceInUseException``.
|
|
@@ -61,7 +60,7 @@ class ServiceRequestCounter:
|
|
|
61
60
|
if context.service_exception:
|
|
62
61
|
return context.service_exception.code
|
|
63
62
|
|
|
64
|
-
response = parse_response(context.operation, response)
|
|
63
|
+
response = parse_response(context.operation, context.protocol, response)
|
|
65
64
|
return response["Error"]["Code"]
|
|
66
65
|
except Exception:
|
|
67
66
|
if config.DEBUG_ANALYTICS:
|
localstack/aws/handlers/cors.py
CHANGED
|
@@ -4,7 +4,6 @@ A set of handlers which handle Cross Origin Resource Sharing (CORS).
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
|
-
from typing import List, Set
|
|
8
7
|
from urllib.parse import urlparse
|
|
9
8
|
|
|
10
9
|
from werkzeug.datastructures import Headers
|
|
@@ -83,7 +82,7 @@ ALLOWED_CORS_RESPONSE_HEADERS = [
|
|
|
83
82
|
]
|
|
84
83
|
|
|
85
84
|
|
|
86
|
-
def _get_allowed_cors_internal_domains() ->
|
|
85
|
+
def _get_allowed_cors_internal_domains() -> set[str]:
|
|
87
86
|
"""
|
|
88
87
|
Construct the list of allowed internal domains for CORS enforcement purposes
|
|
89
88
|
Defined as function to allow easier testing with monkeypatch of config values
|
|
@@ -94,7 +93,7 @@ def _get_allowed_cors_internal_domains() -> Set[str]:
|
|
|
94
93
|
_ALLOWED_INTERNAL_DOMAINS = _get_allowed_cors_internal_domains()
|
|
95
94
|
|
|
96
95
|
|
|
97
|
-
def _get_allowed_cors_ports() ->
|
|
96
|
+
def _get_allowed_cors_ports() -> set[int]:
|
|
98
97
|
"""
|
|
99
98
|
Construct the list of allowed ports for CORS enforcement purposes
|
|
100
99
|
Defined as function to allow easier testing with monkeypatch of config values
|
|
@@ -105,7 +104,7 @@ def _get_allowed_cors_ports() -> Set[int]:
|
|
|
105
104
|
_ALLOWED_INTERNAL_PORTS = _get_allowed_cors_ports()
|
|
106
105
|
|
|
107
106
|
|
|
108
|
-
def _get_allowed_cors_origins() ->
|
|
107
|
+
def _get_allowed_cors_origins() -> list[str]:
|
|
109
108
|
"""Construct the list of allowed origins for CORS enforcement purposes"""
|
|
110
109
|
result = [
|
|
111
110
|
# allow access from Web app and localhost domains
|
|
@@ -210,7 +209,7 @@ class CorsEnforcer(Handler):
|
|
|
210
209
|
return True
|
|
211
210
|
|
|
212
211
|
@staticmethod
|
|
213
|
-
def _is_in_allowed_origins(allowed_origins:
|
|
212
|
+
def _is_in_allowed_origins(allowed_origins: list[str], origin: str) -> bool:
|
|
214
213
|
"""Returns true if the `origin` is in the `allowed_origins`."""
|
|
215
214
|
for allowed_origin in allowed_origins:
|
|
216
215
|
if allowed_origin == "*" or origin == allowed_origin:
|
|
@@ -20,7 +20,12 @@ class InternalRequestParamsEnricher(Handler):
|
|
|
20
20
|
try:
|
|
21
21
|
dto = MappingProxyType(load_dto(header))
|
|
22
22
|
except Exception as e:
|
|
23
|
-
LOG.
|
|
23
|
+
LOG.error(
|
|
24
|
+
"Error loading request parameters '%s', Error: %s",
|
|
25
|
+
header,
|
|
26
|
+
e,
|
|
27
|
+
exc_info=LOG.isEnabledFor(logging.DEBUG),
|
|
28
|
+
)
|
|
24
29
|
return
|
|
25
30
|
|
|
26
31
|
context.internal_request_params = dto
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Handlers for logging."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import types
|
|
4
5
|
from functools import cached_property
|
|
5
|
-
from typing import Type
|
|
6
6
|
|
|
7
7
|
from localstack.aws.api import RequestContext, ServiceException
|
|
8
8
|
from localstack.aws.chain import ExceptionHandler, HandlerChain
|
|
@@ -22,6 +22,14 @@ class ExceptionLogger(ExceptionHandler):
|
|
|
22
22
|
def __init__(self, logger=None):
|
|
23
23
|
self.logger = logger or LOG
|
|
24
24
|
|
|
25
|
+
try:
|
|
26
|
+
import moto.core.exceptions
|
|
27
|
+
|
|
28
|
+
self._moto_service_exception = moto.core.exceptions.ServiceException
|
|
29
|
+
except (ModuleNotFoundError, AttributeError):
|
|
30
|
+
# Moto may not be available in stripped-down versions of LocalStack, like LocalStack S3 image.
|
|
31
|
+
self._moto_service_exception = types.EllipsisType
|
|
32
|
+
|
|
25
33
|
def __call__(
|
|
26
34
|
self,
|
|
27
35
|
chain: HandlerChain,
|
|
@@ -29,9 +37,10 @@ class ExceptionLogger(ExceptionHandler):
|
|
|
29
37
|
context: RequestContext,
|
|
30
38
|
response: Response,
|
|
31
39
|
):
|
|
32
|
-
if isinstance(exception, ServiceException):
|
|
40
|
+
if isinstance(exception, (ServiceException, self._moto_service_exception)):
|
|
33
41
|
# We do not want to log an error/stacktrace if the handler is working as expected, but chooses to throw
|
|
34
|
-
# a service exception
|
|
42
|
+
# a service exception. It may also throw a Moto ServiceException, which should not be logged either
|
|
43
|
+
# because ServiceExceptionHandler understands it.
|
|
35
44
|
return
|
|
36
45
|
if self.logger.isEnabledFor(level=logging.DEBUG):
|
|
37
46
|
self.logger.exception("exception during call chain", exc_info=exception)
|
|
@@ -71,7 +80,7 @@ class ResponseLogger:
|
|
|
71
80
|
)
|
|
72
81
|
|
|
73
82
|
# make sure loggers are loaded after logging config is loaded
|
|
74
|
-
def _prepare_logger(self, logger: logging.Logger, formatter:
|
|
83
|
+
def _prepare_logger(self, logger: logging.Logger, formatter: type):
|
|
75
84
|
if logger.isEnabledFor(logging.DEBUG):
|
|
76
85
|
logger.propagate = False
|
|
77
86
|
handler = create_default_handler(logger.level)
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import csv
|
|
1
2
|
import logging
|
|
2
|
-
|
|
3
|
+
import os
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
3
6
|
|
|
4
7
|
from localstack import config
|
|
5
8
|
from localstack.aws.api import RequestContext
|
|
6
9
|
from localstack.aws.chain import HandlerChain
|
|
10
|
+
from localstack.constants import ENV_INTERNAL_TEST_STORE_METRICS_PATH
|
|
7
11
|
from localstack.http import Response
|
|
12
|
+
from localstack.utils.strings import short_uid
|
|
8
13
|
|
|
9
14
|
LOG = logging.getLogger(__name__)
|
|
10
15
|
|
|
@@ -16,7 +21,7 @@ class MetricHandlerItem:
|
|
|
16
21
|
|
|
17
22
|
request_id: str
|
|
18
23
|
request_context: RequestContext
|
|
19
|
-
parameters_after_parse:
|
|
24
|
+
parameters_after_parse: list[str] | None
|
|
20
25
|
|
|
21
26
|
def __init__(self, request_contex: RequestContext) -> None:
|
|
22
27
|
super().__init__()
|
|
@@ -35,7 +40,7 @@ class Metric:
|
|
|
35
40
|
headers: str
|
|
36
41
|
parameters: str
|
|
37
42
|
status_code: int
|
|
38
|
-
response_code:
|
|
43
|
+
response_code: str | None
|
|
39
44
|
exception: str
|
|
40
45
|
origin: str
|
|
41
46
|
xfail: bool
|
|
@@ -134,10 +139,36 @@ class Metric:
|
|
|
134
139
|
|
|
135
140
|
|
|
136
141
|
class MetricHandler:
|
|
137
|
-
metric_data:
|
|
142
|
+
metric_data: list[Metric] = []
|
|
138
143
|
|
|
139
144
|
def __init__(self) -> None:
|
|
140
145
|
self.metrics_handler_items = {}
|
|
146
|
+
self.local_filename = None
|
|
147
|
+
|
|
148
|
+
if self.should_store_metric_locally():
|
|
149
|
+
self.local_filename = self.create_local_file()
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def should_store_metric_locally() -> bool:
|
|
153
|
+
return config.is_collect_metrics_mode() and config.store_test_metrics_in_local_filesystem()
|
|
154
|
+
|
|
155
|
+
@staticmethod
|
|
156
|
+
def create_local_file():
|
|
157
|
+
folder = Path(
|
|
158
|
+
os.environ.get(ENV_INTERNAL_TEST_STORE_METRICS_PATH, "/tmp/localstack-metrics")
|
|
159
|
+
)
|
|
160
|
+
if not folder.exists():
|
|
161
|
+
folder.mkdir(parents=True, exist_ok=True)
|
|
162
|
+
LOG.debug("Metric reports will be stored in %s", folder)
|
|
163
|
+
filename = (
|
|
164
|
+
folder
|
|
165
|
+
/ f"metric-report-raw-data-{datetime.utcnow().strftime('%Y-%m-%d__%H_%M_%S')}-{short_uid()}.csv"
|
|
166
|
+
)
|
|
167
|
+
with open(filename, "w") as fd:
|
|
168
|
+
LOG.debug("Creating new metric data file %s", filename)
|
|
169
|
+
writer = csv.writer(fd)
|
|
170
|
+
writer.writerow(Metric.RAW_DATA_HEADER)
|
|
171
|
+
return filename
|
|
141
172
|
|
|
142
173
|
def create_metric_handler_item(
|
|
143
174
|
self, chain: HandlerChain, context: RequestContext, response: Response
|
|
@@ -195,7 +226,15 @@ class MetricHandler:
|
|
|
195
226
|
)
|
|
196
227
|
# refrain from adding duplicates
|
|
197
228
|
if metric not in MetricHandler.metric_data:
|
|
198
|
-
|
|
229
|
+
self.append_metric(metric)
|
|
199
230
|
|
|
200
231
|
# cleanup
|
|
201
232
|
del self.metrics_handler_items[context]
|
|
233
|
+
|
|
234
|
+
def append_metric(self, metric: Metric):
|
|
235
|
+
if self.should_store_metric_locally():
|
|
236
|
+
with open(self.local_filename, "a") as fd:
|
|
237
|
+
writer = csv.writer(fd)
|
|
238
|
+
writer.writerow(metric)
|
|
239
|
+
else:
|
|
240
|
+
MetricHandler.metric_data.append(metric)
|
|
@@ -2,22 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import traceback
|
|
5
|
+
import types
|
|
5
6
|
from collections import defaultdict
|
|
6
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
from botocore.model import OperationModel, ServiceModel
|
|
9
10
|
|
|
10
11
|
from localstack import config
|
|
11
12
|
from localstack.http import Response
|
|
12
|
-
from localstack.utils.coverage_docs import get_coverage_link_for_service
|
|
13
13
|
|
|
14
|
+
from ...utils.coverage_docs import get_coverage_link_for_service
|
|
14
15
|
from ..api import CommonServiceException, RequestContext, ServiceException
|
|
15
16
|
from ..api.core import ServiceOperation
|
|
16
17
|
from ..chain import CompositeResponseHandler, ExceptionHandler, Handler, HandlerChain
|
|
17
18
|
from ..client import parse_response, parse_service_exception
|
|
18
19
|
from ..protocol.parser import RequestParser, create_parser
|
|
19
20
|
from ..protocol.serializer import create_serializer
|
|
20
|
-
from ..protocol.service_router import determine_aws_service_model
|
|
21
|
+
from ..protocol.service_router import determine_aws_protocol, determine_aws_service_model
|
|
21
22
|
from ..skeleton import Skeleton, create_skeleton
|
|
22
23
|
|
|
23
24
|
LOG = logging.getLogger(__name__)
|
|
@@ -33,6 +34,8 @@ class ServiceNameParser(Handler):
|
|
|
33
34
|
# example). If it is already set, we can skip the parsing of the request. It is very important for S3, because
|
|
34
35
|
# parsing the request will consume the data stream and prevent streaming.
|
|
35
36
|
if context.service:
|
|
37
|
+
if not context.protocol:
|
|
38
|
+
context.protocol = determine_aws_protocol(context.request, context.service)
|
|
36
39
|
return
|
|
37
40
|
|
|
38
41
|
service_model = determine_aws_service_model(context.request)
|
|
@@ -41,6 +44,7 @@ class ServiceNameParser(Handler):
|
|
|
41
44
|
return
|
|
42
45
|
|
|
43
46
|
context.service = service_model
|
|
47
|
+
context.protocol = determine_aws_protocol(context.request, service_model)
|
|
44
48
|
|
|
45
49
|
|
|
46
50
|
class ServiceRequestParser(Handler):
|
|
@@ -49,10 +53,10 @@ class ServiceRequestParser(Handler):
|
|
|
49
53
|
already be resolved in the RequestContext (e.g., through a ServiceNameParser)
|
|
50
54
|
"""
|
|
51
55
|
|
|
52
|
-
parsers:
|
|
56
|
+
parsers: dict[str, RequestParser]
|
|
53
57
|
|
|
54
58
|
def __init__(self):
|
|
55
|
-
self.parsers =
|
|
59
|
+
self.parsers = {}
|
|
56
60
|
|
|
57
61
|
def __call__(self, chain: HandlerChain, context: RequestContext, response: Response):
|
|
58
62
|
# determine service
|
|
@@ -63,7 +67,7 @@ class ServiceRequestParser(Handler):
|
|
|
63
67
|
return self.parse_and_enrich(context)
|
|
64
68
|
|
|
65
69
|
def parse_and_enrich(self, context: RequestContext):
|
|
66
|
-
parser = create_parser(context.service)
|
|
70
|
+
parser = create_parser(context.service, context.protocol)
|
|
67
71
|
operation, instance = parser.parse(context.request)
|
|
68
72
|
|
|
69
73
|
# enrich context
|
|
@@ -89,10 +93,10 @@ class ServiceRequestRouter(Handler):
|
|
|
89
93
|
Routes ServiceOperations to Handlers.
|
|
90
94
|
"""
|
|
91
95
|
|
|
92
|
-
handlers:
|
|
96
|
+
handlers: dict[ServiceOperation, Handler]
|
|
93
97
|
|
|
94
98
|
def __init__(self):
|
|
95
|
-
self.handlers =
|
|
99
|
+
self.handlers = {}
|
|
96
100
|
|
|
97
101
|
def __call__(self, chain: HandlerChain, context: RequestContext, response: Response):
|
|
98
102
|
if not context.service:
|
|
@@ -118,7 +122,7 @@ class ServiceRequestRouter(Handler):
|
|
|
118
122
|
|
|
119
123
|
self.handlers[key] = handler
|
|
120
124
|
|
|
121
|
-
def add_provider(self, provider: Any, service:
|
|
125
|
+
def add_provider(self, provider: Any, service: str | ServiceModel):
|
|
122
126
|
self.add_skeleton(create_skeleton(service, provider))
|
|
123
127
|
|
|
124
128
|
def add_skeleton(self, skeleton: Skeleton):
|
|
@@ -137,7 +141,7 @@ class ServiceRequestRouter(Handler):
|
|
|
137
141
|
operation_name = operation.name
|
|
138
142
|
message = f"no handler for operation '{operation_name}' on service '{service_name}'"
|
|
139
143
|
error = CommonServiceException("InternalFailure", message, status_code=501)
|
|
140
|
-
serializer = create_serializer(context.service)
|
|
144
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
141
145
|
return serializer.serialize_error_to_response(
|
|
142
146
|
error, operation, context.request.headers, context.request_id
|
|
143
147
|
)
|
|
@@ -153,6 +157,15 @@ class ServiceExceptionSerializer(ExceptionHandler):
|
|
|
153
157
|
def __init__(self):
|
|
154
158
|
self.handle_internal_failures = True
|
|
155
159
|
|
|
160
|
+
try:
|
|
161
|
+
import moto.core.exceptions
|
|
162
|
+
|
|
163
|
+
self._moto_service_exception = moto.core.exceptions.ServiceException
|
|
164
|
+
except (ModuleNotFoundError, AttributeError) as exc:
|
|
165
|
+
# Moto may not be available in stripped-down versions of LocalStack, like LocalStack S3 image.
|
|
166
|
+
LOG.debug("Unable to set up Moto ServiceException translation: %s", exc)
|
|
167
|
+
self._moto_service_exception = types.EllipsisType
|
|
168
|
+
|
|
156
169
|
def __call__(
|
|
157
170
|
self,
|
|
158
171
|
chain: HandlerChain,
|
|
@@ -176,43 +189,48 @@ class ServiceExceptionSerializer(ExceptionHandler):
|
|
|
176
189
|
action_name = operation.name
|
|
177
190
|
exception_message: str | None = exception.args[0] if exception.args else None
|
|
178
191
|
message = exception_message or get_coverage_link_for_service(service_name, action_name)
|
|
179
|
-
LOG.info(message)
|
|
180
192
|
error = CommonServiceException("InternalFailure", message, status_code=501)
|
|
181
|
-
|
|
193
|
+
LOG.info(message)
|
|
194
|
+
|
|
195
|
+
elif isinstance(exception, self._moto_service_exception):
|
|
196
|
+
# Translate Moto ServiceException to native ServiceException if Moto is available.
|
|
197
|
+
# This allows handler chain to gracefully handles Moto errors when provider handlers invoke Moto methods directly.
|
|
198
|
+
error = CommonServiceException(
|
|
199
|
+
code=exception.code,
|
|
200
|
+
message=exception.message,
|
|
201
|
+
)
|
|
182
202
|
|
|
183
203
|
elif not isinstance(exception, ServiceException):
|
|
184
204
|
if not self.handle_internal_failures:
|
|
185
205
|
return
|
|
186
206
|
|
|
187
|
-
if config.
|
|
188
|
-
|
|
207
|
+
if config.INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE:
|
|
208
|
+
message = "".join(
|
|
189
209
|
traceback.format_exception(
|
|
190
210
|
type(exception), value=exception, tb=exception.__traceback__
|
|
191
211
|
)
|
|
192
212
|
)
|
|
213
|
+
else:
|
|
214
|
+
message = str(exception)
|
|
193
215
|
|
|
194
216
|
# wrap exception for serialization
|
|
195
217
|
if operation:
|
|
196
218
|
operation_name = operation.name
|
|
197
|
-
msg = "exception while calling
|
|
198
|
-
service_name,
|
|
199
|
-
operation_name,
|
|
200
|
-
exception,
|
|
201
|
-
)
|
|
219
|
+
msg = f"exception while calling {service_name}.{operation_name}: {message}"
|
|
202
220
|
else:
|
|
203
221
|
# just use any operation for mocking purposes (the parser needs it to populate the default response)
|
|
204
222
|
operation = context.service.operation_model(context.service.operation_names[0])
|
|
205
|
-
msg = "exception while calling
|
|
206
|
-
service_name,
|
|
207
|
-
exception,
|
|
208
|
-
)
|
|
223
|
+
msg = f"exception while calling {service_name} with unknown operation: {message}"
|
|
209
224
|
|
|
210
225
|
status_code = 501 if config.FAIL_FAST else 500
|
|
211
226
|
|
|
212
|
-
error = CommonServiceException(
|
|
213
|
-
|
|
227
|
+
error = CommonServiceException(
|
|
228
|
+
"InternalError", msg, status_code=status_code
|
|
229
|
+
).with_traceback(exception.__traceback__)
|
|
214
230
|
|
|
215
|
-
|
|
231
|
+
context.service_exception = error
|
|
232
|
+
|
|
233
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
216
234
|
return serializer.serialize_error_to_response(
|
|
217
235
|
error, operation, context.request.headers, context.request_id
|
|
218
236
|
)
|
|
@@ -255,7 +273,9 @@ class ServiceResponseParser(Handler):
|
|
|
255
273
|
return
|
|
256
274
|
|
|
257
275
|
# in this case we need to parse the raw response
|
|
258
|
-
parsed = parse_response(
|
|
276
|
+
parsed = parse_response(
|
|
277
|
+
context.operation, context.protocol, response, include_response_metadata=False
|
|
278
|
+
)
|
|
259
279
|
if service_exception := parse_service_exception(response, parsed):
|
|
260
280
|
context.service_exception = service_exception
|
|
261
281
|
else:
|
|
@@ -278,7 +298,7 @@ class ServiceResponseHandlers(Handler):
|
|
|
278
298
|
are only called if the request context has a service, and there are handlers for that particular service.
|
|
279
299
|
"""
|
|
280
300
|
|
|
281
|
-
handlers:
|
|
301
|
+
handlers: dict[str, CompositeResponseHandler]
|
|
282
302
|
|
|
283
303
|
def __init__(self):
|
|
284
304
|
self.handlers = defaultdict(CompositeResponseHandler)
|