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
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
from typing import NamedTuple
|
|
2
|
+
from typing import NamedTuple
|
|
3
3
|
|
|
4
4
|
from botocore.model import ServiceModel
|
|
5
5
|
from werkzeug.exceptions import RequestEntityTooLarge
|
|
6
6
|
from werkzeug.http import parse_dict_header
|
|
7
7
|
|
|
8
8
|
from localstack.aws.spec import (
|
|
9
|
+
ProtocolName,
|
|
9
10
|
ServiceCatalog,
|
|
10
11
|
ServiceModelIdentifier,
|
|
11
12
|
get_service_catalog,
|
|
13
|
+
is_protocol_in_service_model_identifier,
|
|
12
14
|
)
|
|
13
15
|
from localstack.http import Request
|
|
14
16
|
from localstack.services.s3.utils import uses_host_addressing
|
|
@@ -17,6 +19,23 @@ from localstack.utils.strings import to_bytes
|
|
|
17
19
|
|
|
18
20
|
LOG = logging.getLogger(__name__)
|
|
19
21
|
|
|
22
|
+
_PROTOCOL_DETECTION_PRIORITY: list[ProtocolName] = [
|
|
23
|
+
"smithy-rpc-v2-cbor",
|
|
24
|
+
"json",
|
|
25
|
+
"query",
|
|
26
|
+
"ec2",
|
|
27
|
+
"rest-json",
|
|
28
|
+
"rest-xml",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ProtocolError(Exception):
|
|
33
|
+
"""
|
|
34
|
+
Error which is thrown if we cannot detect the protocol for the request.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
20
39
|
|
|
21
40
|
class _ServiceIndicators(NamedTuple):
|
|
22
41
|
"""
|
|
@@ -28,21 +47,22 @@ class _ServiceIndicators(NamedTuple):
|
|
|
28
47
|
|
|
29
48
|
# AWS service's "signing name" - Contained in the Authorization header
|
|
30
49
|
# (https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)
|
|
31
|
-
signing_name:
|
|
50
|
+
signing_name: str | None = None
|
|
32
51
|
# Target prefix as defined in the service specs for non-rest protocols - Contained in the X-Amz-Target header
|
|
33
|
-
target_prefix:
|
|
52
|
+
target_prefix: str | None = None
|
|
34
53
|
# Targeted operation as defined in the service specs for non-rest protocols - Contained in the X-Amz-Target header
|
|
35
|
-
operation:
|
|
54
|
+
operation: str | None = None
|
|
36
55
|
# Host field of the HTTP request
|
|
37
|
-
host:
|
|
56
|
+
host: str | None = None
|
|
38
57
|
# Path of the HTTP request
|
|
39
|
-
path:
|
|
58
|
+
path: str | None = None
|
|
40
59
|
|
|
41
60
|
|
|
42
61
|
def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
43
62
|
"""Extracts all different fields that might indicate which service a request is targeting."""
|
|
44
63
|
x_amz_target = request.headers.get("x-amz-target")
|
|
45
64
|
authorization = request.headers.get("authorization")
|
|
65
|
+
is_rpc_v2 = "rpc-v2-cbor" in request.headers.get("Smithy-Protocol", "")
|
|
46
66
|
|
|
47
67
|
signing_name = None
|
|
48
68
|
if authorization:
|
|
@@ -55,7 +75,15 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
|
55
75
|
except (ValueError, KeyError):
|
|
56
76
|
LOG.debug("auth header could not be parsed for service routing: %s", authorization)
|
|
57
77
|
pass
|
|
58
|
-
if
|
|
78
|
+
if is_rpc_v2:
|
|
79
|
+
# https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#requests
|
|
80
|
+
rpc_v2_params = request.path.lstrip("/").split("/")
|
|
81
|
+
if len(rpc_v2_params) >= 4:
|
|
82
|
+
*_, service_shape_name, __, operation = rpc_v2_params
|
|
83
|
+
target_prefix = service_shape_name.split("#")[-1]
|
|
84
|
+
else:
|
|
85
|
+
target_prefix, operation = None, None
|
|
86
|
+
elif x_amz_target:
|
|
59
87
|
if "." in x_amz_target:
|
|
60
88
|
target_prefix, operation = x_amz_target.split(".", 1)
|
|
61
89
|
else:
|
|
@@ -67,6 +95,48 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
|
67
95
|
return _ServiceIndicators(signing_name, target_prefix, operation, request.host, request.path)
|
|
68
96
|
|
|
69
97
|
|
|
98
|
+
def _matches_protocol(request: Request, protocol: ProtocolName) -> bool:
|
|
99
|
+
headers = request.headers
|
|
100
|
+
mimetype = request.mimetype.lower()
|
|
101
|
+
match protocol:
|
|
102
|
+
case "smithy-rpc-v2-cbor":
|
|
103
|
+
# Every request for the rpcv2Cbor protocol MUST contain a `Smithy-Protocol` header with the value
|
|
104
|
+
# of `rpc-v2-cbor`.
|
|
105
|
+
# https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html
|
|
106
|
+
return headers.get("Smithy-Protocol", "") == "rpc-v2-cbor"
|
|
107
|
+
case "json":
|
|
108
|
+
return mimetype.startswith("application/x-amz-json")
|
|
109
|
+
case "query" | "ec2":
|
|
110
|
+
# https://smithy.io/2.0/aws/protocols/aws-query-protocol.html#request-serialization
|
|
111
|
+
return (
|
|
112
|
+
mimetype.startswith("application/x-www-form-urlencoded") or "Action" in request.args
|
|
113
|
+
)
|
|
114
|
+
case "rest-xml" | "rest-json":
|
|
115
|
+
# `rest-json` and `rest-xml` can accept any kind of Content-Type, and it can be configured on the operation
|
|
116
|
+
# level.
|
|
117
|
+
# https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html
|
|
118
|
+
return True
|
|
119
|
+
case _:
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def match_available_protocols(
|
|
124
|
+
request: Request, available_protocols: list[ProtocolName]
|
|
125
|
+
) -> ProtocolName | None:
|
|
126
|
+
"""
|
|
127
|
+
Tries to match the current request and determine the protocol used amongst the available protocols given.
|
|
128
|
+
We use a priority order to try to determine the protocol, as some protocols are more permissive that others.
|
|
129
|
+
:param request: the incoming request
|
|
130
|
+
:param available_protocols: the available protocols of the Service the request is directed to
|
|
131
|
+
:return: the protocol matched, if any
|
|
132
|
+
"""
|
|
133
|
+
for protocol in _PROTOCOL_DETECTION_PRIORITY:
|
|
134
|
+
if protocol in available_protocols and _matches_protocol(request, protocol):
|
|
135
|
+
return protocol
|
|
136
|
+
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
|
|
70
140
|
signing_name_path_prefix_rules = {
|
|
71
141
|
# custom rules based on URI path prefixes that are not easily generalizable
|
|
72
142
|
"apigateway": {
|
|
@@ -111,7 +181,7 @@ signing_name_path_prefix_rules = {
|
|
|
111
181
|
}
|
|
112
182
|
|
|
113
183
|
|
|
114
|
-
def custom_signing_name_rules(signing_name: str, path: str) ->
|
|
184
|
+
def custom_signing_name_rules(signing_name: str, path: str) -> ServiceModelIdentifier | None:
|
|
115
185
|
"""
|
|
116
186
|
Rules which are based on the signing name (in the auth header) and the request path.
|
|
117
187
|
"""
|
|
@@ -134,7 +204,7 @@ def custom_signing_name_rules(signing_name: str, path: str) -> Optional[ServiceM
|
|
|
134
204
|
return rules.get("*", ServiceModelIdentifier(signing_name))
|
|
135
205
|
|
|
136
206
|
|
|
137
|
-
def custom_host_addressing_rules(host: str) ->
|
|
207
|
+
def custom_host_addressing_rules(host: str) -> ServiceModelIdentifier | None:
|
|
138
208
|
"""
|
|
139
209
|
Rules based on the host header of the request, which is typically the data plane of a service.
|
|
140
210
|
|
|
@@ -147,7 +217,7 @@ def custom_host_addressing_rules(host: str) -> Optional[ServiceModelIdentifier]:
|
|
|
147
217
|
return ServiceModelIdentifier("s3")
|
|
148
218
|
|
|
149
219
|
|
|
150
|
-
def custom_path_addressing_rules(path: str) ->
|
|
220
|
+
def custom_path_addressing_rules(path: str) -> ServiceModelIdentifier | None:
|
|
151
221
|
"""
|
|
152
222
|
Rules which are only based on the request path.
|
|
153
223
|
"""
|
|
@@ -159,7 +229,7 @@ def custom_path_addressing_rules(path: str) -> Optional[ServiceModelIdentifier]:
|
|
|
159
229
|
return ServiceModelIdentifier("lambda")
|
|
160
230
|
|
|
161
231
|
|
|
162
|
-
def legacy_s3_rules(request: Request) ->
|
|
232
|
+
def legacy_s3_rules(request: Request) -> ServiceModelIdentifier | None:
|
|
163
233
|
"""
|
|
164
234
|
*Legacy* rules which allow us to fallback to S3 if no other service was matched.
|
|
165
235
|
All rules which are implemented here should be removed once we make sure it would not break any use-cases.
|
|
@@ -228,7 +298,7 @@ def legacy_s3_rules(request: Request) -> Optional[ServiceModelIdentifier]:
|
|
|
228
298
|
|
|
229
299
|
|
|
230
300
|
def resolve_conflicts(
|
|
231
|
-
candidates:
|
|
301
|
+
candidates: set[ServiceModelIdentifier], request: Request
|
|
232
302
|
) -> ServiceModelIdentifier:
|
|
233
303
|
"""
|
|
234
304
|
Some service definitions are overlapping to a point where they are _not_ distinguishable at all
|
|
@@ -248,17 +318,17 @@ def resolve_conflicts(
|
|
|
248
318
|
# The `application/x-amz-json-1.0` header is mandatory for requests targeting SQS with the `json` protocol. We
|
|
249
319
|
# can safely route them to the `sqs` JSON parser/serializer. If not present, route the request to the
|
|
250
320
|
# sqs-query protocol.
|
|
251
|
-
|
|
321
|
+
protocol = match_available_protocols(request, available_protocols=["json", "query"])
|
|
252
322
|
return (
|
|
253
323
|
ServiceModelIdentifier("sqs")
|
|
254
|
-
if
|
|
324
|
+
if protocol == "json"
|
|
255
325
|
else ServiceModelIdentifier("sqs", "query")
|
|
256
326
|
)
|
|
257
327
|
|
|
258
328
|
|
|
259
329
|
def determine_aws_service_model_for_data_plane(
|
|
260
330
|
request: Request, services: ServiceCatalog = None
|
|
261
|
-
) ->
|
|
331
|
+
) -> ServiceModel | None:
|
|
262
332
|
"""
|
|
263
333
|
A stripped down version of ``determine_aws_service_model`` which only checks hostname indicators for
|
|
264
334
|
the AWS data plane, such as s3 websites, lambda function URLs, or API gateway routes.
|
|
@@ -266,12 +336,30 @@ def determine_aws_service_model_for_data_plane(
|
|
|
266
336
|
custom_host_match = custom_host_addressing_rules(request.host)
|
|
267
337
|
if custom_host_match:
|
|
268
338
|
services = services or get_service_catalog()
|
|
269
|
-
return services.get(
|
|
339
|
+
return services.get(custom_host_match.name, custom_host_match.protocol)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def determine_aws_protocol(request: Request, service_model: ServiceModel) -> ProtocolName:
|
|
343
|
+
if not (protocols := service_model.metadata.get("protocols")):
|
|
344
|
+
# if the service does not define multiple protocols, return the `protocol` defined for the service
|
|
345
|
+
return service_model.protocol
|
|
346
|
+
|
|
347
|
+
if len(protocols) == 1:
|
|
348
|
+
return protocols[0]
|
|
349
|
+
|
|
350
|
+
if protocol := match_available_protocols(request, available_protocols=protocols):
|
|
351
|
+
return protocol
|
|
352
|
+
|
|
353
|
+
raise ProtocolError(
|
|
354
|
+
f"Could not determine the protocol for the request: "
|
|
355
|
+
f"{request.method} {request.path} for the service '{service_model.service_name}' "
|
|
356
|
+
f"(available protocols: {protocols})"
|
|
357
|
+
)
|
|
270
358
|
|
|
271
359
|
|
|
272
360
|
def determine_aws_service_model(
|
|
273
361
|
request: Request, services: ServiceCatalog = None
|
|
274
|
-
) ->
|
|
362
|
+
) -> ServiceModel | None:
|
|
275
363
|
"""
|
|
276
364
|
Tries to determine the name of the AWS service an incoming request is targeting.
|
|
277
365
|
:param request: to determine the target service name of
|
|
@@ -287,12 +375,13 @@ def determine_aws_service_model(
|
|
|
287
375
|
signing_name_candidates = services.by_signing_name(signing_name)
|
|
288
376
|
if len(signing_name_candidates) == 1:
|
|
289
377
|
# a unique signing-name -> service name mapping is the case for ~75% of service operations
|
|
290
|
-
|
|
378
|
+
candidate = signing_name_candidates[0]
|
|
379
|
+
return services.get(candidate.name, candidate.protocol)
|
|
291
380
|
|
|
292
381
|
# try to find a match with the custom signing name rules
|
|
293
382
|
custom_match = custom_signing_name_rules(signing_name, path)
|
|
294
383
|
if custom_match:
|
|
295
|
-
return services.get(
|
|
384
|
+
return services.get(custom_match.name, custom_match.protocol)
|
|
296
385
|
|
|
297
386
|
# still ambiguous - add the services to the list of candidates
|
|
298
387
|
candidates.update(signing_name_candidates)
|
|
@@ -302,33 +391,34 @@ def determine_aws_service_model(
|
|
|
302
391
|
target_candidates = services.by_target_prefix(target_prefix)
|
|
303
392
|
if len(target_candidates) == 1:
|
|
304
393
|
# a unique target prefix
|
|
305
|
-
|
|
394
|
+
candidate = target_candidates[0]
|
|
395
|
+
return services.get(candidate.name, candidate.protocol)
|
|
306
396
|
|
|
307
397
|
# still ambiguous - add the services to the list of candidates
|
|
308
398
|
candidates.update(target_candidates)
|
|
309
399
|
|
|
310
400
|
# exclude services where the operation is not contained in the service spec
|
|
311
401
|
for service_identifier in list(candidates):
|
|
312
|
-
service = services.get(
|
|
402
|
+
service = services.get(service_identifier.name, service_identifier.protocol)
|
|
313
403
|
if operation not in service.operation_names:
|
|
314
404
|
candidates.remove(service_identifier)
|
|
315
405
|
else:
|
|
316
406
|
# exclude services which have a target prefix (the current request does not have one)
|
|
317
407
|
for service_identifier in list(candidates):
|
|
318
|
-
service = services.get(
|
|
408
|
+
service = services.get(service_identifier.name, service_identifier.protocol)
|
|
319
409
|
if service.metadata.get("targetPrefix") is not None:
|
|
320
410
|
candidates.remove(service_identifier)
|
|
321
411
|
|
|
322
412
|
if len(candidates) == 1:
|
|
323
413
|
service_identifier = candidates.pop()
|
|
324
|
-
return services.get(
|
|
414
|
+
return services.get(service_identifier.name, service_identifier.protocol)
|
|
325
415
|
|
|
326
416
|
# 3. check the path if it is set and not a trivial root path
|
|
327
417
|
if path and path != "/":
|
|
328
418
|
# try to find a match with the custom path rules
|
|
329
419
|
custom_path_match = custom_path_addressing_rules(path)
|
|
330
420
|
if custom_path_match:
|
|
331
|
-
return services.get(
|
|
421
|
+
return services.get(custom_path_match.name, custom_path_match.protocol)
|
|
332
422
|
|
|
333
423
|
# 4. check the host (custom host addressing rules)
|
|
334
424
|
if host:
|
|
@@ -337,12 +427,14 @@ def determine_aws_service_model(
|
|
|
337
427
|
# this prevents a virtual host addressed bucket to be wrongly recognized
|
|
338
428
|
if host.startswith(f"{prefix}.") and ".s3." not in host:
|
|
339
429
|
if len(services_per_prefix) == 1:
|
|
340
|
-
|
|
430
|
+
candidate = services_per_prefix[0]
|
|
431
|
+
return services.get(candidate.name, candidate.protocol)
|
|
341
432
|
candidates.update(services_per_prefix)
|
|
342
433
|
|
|
343
434
|
custom_host_match = custom_host_addressing_rules(host)
|
|
344
435
|
if custom_host_match:
|
|
345
|
-
|
|
436
|
+
candidate = custom_host_match[0]
|
|
437
|
+
return services.get(candidate.name, candidate.protocol)
|
|
346
438
|
|
|
347
439
|
if request.shallow:
|
|
348
440
|
# from here on we would need access to the request body, which doesn't exist for shallow requests like
|
|
@@ -357,21 +449,28 @@ def determine_aws_service_model(
|
|
|
357
449
|
query_candidates = [
|
|
358
450
|
service
|
|
359
451
|
for service in services.by_operation(values["Action"])
|
|
360
|
-
if
|
|
452
|
+
if any(
|
|
453
|
+
is_protocol_in_service_model_identifier(protocol, service)
|
|
454
|
+
for protocol in ("ec2", "query")
|
|
455
|
+
)
|
|
361
456
|
]
|
|
362
457
|
|
|
363
458
|
if len(query_candidates) == 1:
|
|
364
|
-
|
|
459
|
+
candidate = query_candidates[0]
|
|
460
|
+
return services.get(candidate.name, candidate.protocol)
|
|
365
461
|
|
|
366
462
|
if "Version" in values:
|
|
367
463
|
for service_identifier in list(query_candidates):
|
|
368
|
-
service_model = services.get(
|
|
464
|
+
service_model = services.get(
|
|
465
|
+
service_identifier.name, service_identifier.protocol
|
|
466
|
+
)
|
|
369
467
|
if values["Version"] != service_model.api_version:
|
|
370
468
|
# the combination of Version and Action is not unique, add matches to the candidates
|
|
371
469
|
query_candidates.remove(service_identifier)
|
|
372
470
|
|
|
373
471
|
if len(query_candidates) == 1:
|
|
374
|
-
|
|
472
|
+
candidate = query_candidates[0]
|
|
473
|
+
return services.get(candidate.name, candidate.protocol)
|
|
375
474
|
|
|
376
475
|
candidates.update(query_candidates)
|
|
377
476
|
|
|
@@ -387,15 +486,16 @@ def determine_aws_service_model(
|
|
|
387
486
|
# 6. resolve service spec conflicts
|
|
388
487
|
resolved_conflict = resolve_conflicts(candidates, request)
|
|
389
488
|
if resolved_conflict:
|
|
390
|
-
return services.get(
|
|
489
|
+
return services.get(resolved_conflict.name, resolved_conflict.protocol)
|
|
391
490
|
|
|
392
491
|
# 7. check the legacy S3 rules in the end
|
|
393
492
|
legacy_match = legacy_s3_rules(request)
|
|
394
493
|
if legacy_match:
|
|
395
|
-
return services.get(
|
|
494
|
+
return services.get(legacy_match.name, legacy_match.protocol)
|
|
396
495
|
|
|
397
496
|
if signing_name:
|
|
398
497
|
return services.get(name=signing_name)
|
|
399
498
|
if candidates:
|
|
400
|
-
|
|
499
|
+
candidate = candidates.pop()
|
|
500
|
+
return services.get(candidate.name, candidate.protocol)
|
|
401
501
|
return None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Slightly extends the ``botocore.validate`` package to provide better integration with our parser/serializer."""
|
|
2
2
|
|
|
3
|
-
from typing import Any,
|
|
3
|
+
from typing import Any, NamedTuple
|
|
4
4
|
|
|
5
5
|
from botocore.model import OperationModel, Shape
|
|
6
6
|
from botocore.validate import ParamValidator as BotocoreParamValidator
|
|
@@ -22,7 +22,7 @@ class Error(NamedTuple):
|
|
|
22
22
|
|
|
23
23
|
reason: str
|
|
24
24
|
name: str
|
|
25
|
-
attributes:
|
|
25
|
+
attributes: dict[str, Any]
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class ParameterValidationError(Exception):
|
|
@@ -88,11 +88,11 @@ class EmptyInput(ParameterValidationError):
|
|
|
88
88
|
|
|
89
89
|
|
|
90
90
|
class ValidationErrors(BotocoreValidationErrors):
|
|
91
|
-
def __init__(self, shape: Shape, params:
|
|
91
|
+
def __init__(self, shape: Shape, params: dict[str, Any]):
|
|
92
92
|
super().__init__()
|
|
93
93
|
self.shape = shape
|
|
94
94
|
self.params = params
|
|
95
|
-
self._exceptions:
|
|
95
|
+
self._exceptions: list[ParameterValidationError] = []
|
|
96
96
|
|
|
97
97
|
@property
|
|
98
98
|
def exceptions(self):
|
|
@@ -133,7 +133,7 @@ class ValidationErrors(BotocoreValidationErrors):
|
|
|
133
133
|
|
|
134
134
|
|
|
135
135
|
class ParamValidator(BotocoreParamValidator):
|
|
136
|
-
def validate(self, params:
|
|
136
|
+
def validate(self, params: dict[str, Any], shape: Shape):
|
|
137
137
|
"""Validate parameters against a shape model.
|
|
138
138
|
|
|
139
139
|
This method will validate the parameters against a provided shape model.
|
|
@@ -159,7 +159,7 @@ class ParamValidator(BotocoreParamValidator):
|
|
|
159
159
|
if required_member in params and params[required_member] is None:
|
|
160
160
|
params.pop(required_member)
|
|
161
161
|
|
|
162
|
-
super(
|
|
162
|
+
super()._validate_structure(params, shape, errors, name)
|
|
163
163
|
|
|
164
164
|
|
|
165
165
|
def validate_request(operation: OperationModel, request: ServiceRequest) -> ValidationErrors:
|
localstack/aws/scaffold.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import io
|
|
2
2
|
import keyword
|
|
3
3
|
import re
|
|
4
|
+
from collections import OrderedDict
|
|
4
5
|
from functools import cached_property
|
|
5
6
|
from multiprocessing import Pool
|
|
6
7
|
from pathlib import Path
|
|
7
|
-
from typing import Dict, List, Optional, Set
|
|
8
8
|
|
|
9
9
|
import click
|
|
10
10
|
from botocore import xform_name
|
|
@@ -18,7 +18,6 @@ from botocore.model import (
|
|
|
18
18
|
StringShape,
|
|
19
19
|
StructureShape,
|
|
20
20
|
)
|
|
21
|
-
from typing_extensions import OrderedDict
|
|
22
21
|
|
|
23
22
|
from localstack.aws.spec import load_service
|
|
24
23
|
from localstack.utils.common import camel_to_snake_case, snake_to_camel_case
|
|
@@ -75,7 +74,7 @@ class ShapeNode:
|
|
|
75
74
|
self.shape = shape
|
|
76
75
|
|
|
77
76
|
@cached_property
|
|
78
|
-
def request_operation(self) ->
|
|
77
|
+
def request_operation(self) -> OperationModel | None:
|
|
79
78
|
for operation_name in self.service.operation_names:
|
|
80
79
|
operation = self.service.operation_model(operation_name)
|
|
81
80
|
if operation.input_shape is None:
|
|
@@ -89,7 +88,7 @@ class ShapeNode:
|
|
|
89
88
|
return None
|
|
90
89
|
|
|
91
90
|
@cached_property
|
|
92
|
-
def response_operation(self) ->
|
|
91
|
+
def response_operation(self) -> OperationModel | None:
|
|
93
92
|
for operation_name in self.service.operation_names:
|
|
94
93
|
operation = self.service.operation_model(operation_name)
|
|
95
94
|
if operation.output_shape is None:
|
|
@@ -128,7 +127,7 @@ class ShapeNode:
|
|
|
128
127
|
return isinstance(self.shape, StringShape) and self.shape.enum
|
|
129
128
|
|
|
130
129
|
@property
|
|
131
|
-
def dependencies(self) ->
|
|
130
|
+
def dependencies(self) -> list[str]:
|
|
132
131
|
shape = self.shape
|
|
133
132
|
|
|
134
133
|
if isinstance(shape, StructureShape):
|
|
@@ -222,7 +221,7 @@ class ShapeNode:
|
|
|
222
221
|
|
|
223
222
|
def _print_as_typed_dict(self, output, doc=True, quote_types=False):
|
|
224
223
|
name = to_valid_python_name(self.shape.name)
|
|
225
|
-
output.write('
|
|
224
|
+
output.write(f'{name} = TypedDict("{name}", {{\n')
|
|
226
225
|
for k, v in self.shape.members.items():
|
|
227
226
|
member_name = to_valid_python_name(v.name)
|
|
228
227
|
# check if the member name is the same as the type name (recursive types need to use forward references)
|
|
@@ -327,7 +326,7 @@ def generate_service_types(output, service: ServiceModel, doc=True):
|
|
|
327
326
|
output.write("\n")
|
|
328
327
|
|
|
329
328
|
# ==================================== print type declarations
|
|
330
|
-
nodes:
|
|
329
|
+
nodes: dict[str, ShapeNode] = {}
|
|
331
330
|
|
|
332
331
|
for shape_name in service.shape_names:
|
|
333
332
|
shape = service.shape_for(shape_name)
|
|
@@ -338,9 +337,9 @@ def generate_service_types(output, service: ServiceModel, doc=True):
|
|
|
338
337
|
# output.write(f' "{name}",\n')
|
|
339
338
|
# output.write("]\n")
|
|
340
339
|
|
|
341
|
-
printed:
|
|
342
|
-
visited:
|
|
343
|
-
stack:
|
|
340
|
+
printed: set[str] = set()
|
|
341
|
+
visited: set[str] = set()
|
|
342
|
+
stack: list[str] = list(nodes.keys())
|
|
344
343
|
|
|
345
344
|
stack = sorted(stack, key=lambda name: nodes[name].get_order())
|
|
346
345
|
stack.reverse()
|
localstack/aws/serving/edge.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import threading
|
|
3
|
-
from typing import List
|
|
4
3
|
|
|
5
4
|
from rolo.gateway.wsgi import WsgiGateway
|
|
6
5
|
|
|
@@ -15,7 +14,7 @@ LOG = logging.getLogger(__name__)
|
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
def serve_gateway(
|
|
18
|
-
listen: HostAndPort |
|
|
17
|
+
listen: HostAndPort | list[HostAndPort], use_ssl: bool, asynchronous: bool = False
|
|
19
18
|
):
|
|
20
19
|
"""
|
|
21
20
|
Implementation of the edge.do_start_edge_proxy interface to start a Hypercorn server instance serving the
|
|
@@ -37,7 +36,7 @@ def serve_gateway(
|
|
|
37
36
|
|
|
38
37
|
|
|
39
38
|
def _serve_werkzeug(
|
|
40
|
-
gateway: LocalstackAwsGateway, listen:
|
|
39
|
+
gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
|
|
41
40
|
):
|
|
42
41
|
from werkzeug.serving import ThreadedWSGIServer
|
|
43
42
|
|
|
@@ -57,7 +56,7 @@ def _serve_werkzeug(
|
|
|
57
56
|
params["ssl_context"] = (cert_file_name, key_file_name)
|
|
58
57
|
|
|
59
58
|
threads = []
|
|
60
|
-
servers:
|
|
59
|
+
servers: list[ThreadedWSGIServer] = []
|
|
61
60
|
|
|
62
61
|
for host_port in listen:
|
|
63
62
|
kwargs = dict(params)
|
|
@@ -90,7 +89,7 @@ def _serve_werkzeug(
|
|
|
90
89
|
|
|
91
90
|
|
|
92
91
|
def _serve_hypercorn(
|
|
93
|
-
gateway: LocalstackAwsGateway, listen:
|
|
92
|
+
gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
|
|
94
93
|
):
|
|
95
94
|
from localstack.http.hypercorn import GatewayServer
|
|
96
95
|
|
|
@@ -112,7 +111,7 @@ def _serve_hypercorn(
|
|
|
112
111
|
|
|
113
112
|
|
|
114
113
|
def _serve_twisted(
|
|
115
|
-
gateway: LocalstackAwsGateway, listen:
|
|
114
|
+
gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
|
|
116
115
|
):
|
|
117
116
|
from .twisted import serve_gateway
|
|
118
117
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
-
from typing import Any
|
|
2
|
+
from typing import Any
|
|
3
3
|
|
|
4
4
|
from hypercorn import Config
|
|
5
5
|
from hypercorn.asyncio import serve as serve_hypercorn
|
|
@@ -15,7 +15,7 @@ def serve(
|
|
|
15
15
|
host: str = "localhost",
|
|
16
16
|
port: int = constants.DEFAULT_PORT_EDGE,
|
|
17
17
|
use_reloader: bool = True,
|
|
18
|
-
ssl_creds:
|
|
18
|
+
ssl_creds: tuple[Any, Any] | None = None,
|
|
19
19
|
**kwargs,
|
|
20
20
|
) -> None:
|
|
21
21
|
"""
|
|
@@ -4,7 +4,6 @@ Bindings to serve LocalStack using twisted.
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import time
|
|
7
|
-
from typing import List
|
|
8
7
|
|
|
9
8
|
from rolo.gateway import Gateway
|
|
10
9
|
from rolo.serving.twisted import TwistedGateway
|
|
@@ -130,7 +129,7 @@ def stop_thread_pool(self: ThreadPool, stop, timeout: float = None):
|
|
|
130
129
|
|
|
131
130
|
|
|
132
131
|
def serve_gateway(
|
|
133
|
-
gateway: Gateway, listen:
|
|
132
|
+
gateway: Gateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool = False
|
|
134
133
|
):
|
|
135
134
|
"""
|
|
136
135
|
Serve a Gateway instance using twisted.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import ssl
|
|
2
|
-
from typing import TYPE_CHECKING, Any
|
|
2
|
+
from typing import TYPE_CHECKING, Any
|
|
3
3
|
|
|
4
4
|
from rolo.gateway import Gateway
|
|
5
5
|
from rolo.gateway.wsgi import WsgiGateway
|
|
@@ -17,7 +17,7 @@ def serve(
|
|
|
17
17
|
host: str = "localhost",
|
|
18
18
|
port: int = constants.DEFAULT_PORT_EDGE,
|
|
19
19
|
use_reloader: bool = True,
|
|
20
|
-
ssl_creds:
|
|
20
|
+
ssl_creds: tuple[Any, Any] | None = None,
|
|
21
21
|
**kwargs,
|
|
22
22
|
) -> None:
|
|
23
23
|
"""
|
localstack/aws/skeleton.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
import logging
|
|
3
|
-
from
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import Any, NamedTuple
|
|
4
5
|
|
|
5
6
|
from botocore import xform_name
|
|
6
7
|
from botocore.model import ServiceModel
|
|
@@ -20,10 +21,10 @@ from localstack.utils.coverage_docs import get_coverage_link_for_service
|
|
|
20
21
|
|
|
21
22
|
LOG = logging.getLogger(__name__)
|
|
22
23
|
|
|
23
|
-
DispatchTable =
|
|
24
|
+
DispatchTable = dict[str, ServiceRequestHandler]
|
|
24
25
|
|
|
25
26
|
|
|
26
|
-
def create_skeleton(service:
|
|
27
|
+
def create_skeleton(service: str | ServiceModel, delegate: Any):
|
|
27
28
|
if isinstance(service, str):
|
|
28
29
|
service = load_service(service)
|
|
29
30
|
|
|
@@ -49,10 +50,10 @@ def create_dispatch_table(delegate: object) -> DispatchTable:
|
|
|
49
50
|
# scan class tree for @handler wrapped functions (reverse class tree so that inherited functions overwrite parent
|
|
50
51
|
# functions)
|
|
51
52
|
cls_tree = inspect.getmro(delegate.__class__)
|
|
52
|
-
handlers:
|
|
53
|
+
handlers: dict[str, HandlerAttributes] = {}
|
|
53
54
|
cls_tree = reversed(list(cls_tree))
|
|
54
55
|
for cls in cls_tree:
|
|
55
|
-
if cls
|
|
56
|
+
if cls is object:
|
|
56
57
|
continue
|
|
57
58
|
|
|
58
59
|
for name, fn in inspect.getmembers(cls, inspect.isfunction):
|
|
@@ -98,9 +99,7 @@ class ServiceRequestDispatcher:
|
|
|
98
99
|
self.pass_context = pass_context
|
|
99
100
|
self.expand_parameters = expand_parameters
|
|
100
101
|
|
|
101
|
-
def __call__(
|
|
102
|
-
self, context: RequestContext, request: ServiceRequest
|
|
103
|
-
) -> Optional[ServiceResponse]:
|
|
102
|
+
def __call__(self, context: RequestContext, request: ServiceRequest) -> ServiceResponse | None:
|
|
104
103
|
args = []
|
|
105
104
|
kwargs = {}
|
|
106
105
|
|
|
@@ -122,7 +121,7 @@ class Skeleton:
|
|
|
122
121
|
service: ServiceModel
|
|
123
122
|
dispatch_table: DispatchTable
|
|
124
123
|
|
|
125
|
-
def __init__(self, service: ServiceModel, implementation:
|
|
124
|
+
def __init__(self, service: ServiceModel, implementation: Any | DispatchTable):
|
|
126
125
|
self.service = service
|
|
127
126
|
|
|
128
127
|
if isinstance(implementation, dict):
|
|
@@ -131,14 +130,16 @@ class Skeleton:
|
|
|
131
130
|
self.dispatch_table = create_dispatch_table(implementation)
|
|
132
131
|
|
|
133
132
|
def invoke(self, context: RequestContext) -> Response:
|
|
134
|
-
serializer = create_serializer(context.service)
|
|
133
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
135
134
|
|
|
136
135
|
if context.operation and context.service_request:
|
|
137
136
|
# if the parsed request is already set in the context, re-use them
|
|
138
137
|
operation, instance = context.operation, context.service_request
|
|
139
138
|
else:
|
|
140
139
|
# otherwise, parse the incoming HTTPRequest
|
|
141
|
-
operation, instance = create_parser(context.service).parse(
|
|
140
|
+
operation, instance = create_parser(context.service, context.protocol).parse(
|
|
141
|
+
context.request
|
|
142
|
+
)
|
|
142
143
|
context.operation = operation
|
|
143
144
|
|
|
144
145
|
try:
|