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
|
@@ -4,7 +4,7 @@ import random
|
|
|
4
4
|
import re
|
|
5
5
|
import time
|
|
6
6
|
from secrets import token_hex
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import TypedDict
|
|
8
8
|
|
|
9
9
|
from moto.apigateway.models import RestAPI as MotoRestAPI
|
|
10
10
|
|
|
@@ -115,7 +115,7 @@ def get_lambda_function_arn_from_invocation_uri(uri: str) -> str:
|
|
|
115
115
|
return uri.split("functions/")[1].removesuffix("/invocations")
|
|
116
116
|
|
|
117
117
|
|
|
118
|
-
def validate_sub_dict_of_typed_dict(typed_dict:
|
|
118
|
+
def validate_sub_dict_of_typed_dict(typed_dict: type[TypedDict], obj: dict) -> bool:
|
|
119
119
|
"""
|
|
120
120
|
Validate that the object is a subset off the keys of a given `TypedDict`.
|
|
121
121
|
:param typed_dict: the `TypedDict` blueprint
|
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
from functools import lru_cache
|
|
5
5
|
from http import HTTPMethod
|
|
6
|
-
from typing import Literal,
|
|
6
|
+
from typing import Literal, TypedDict
|
|
7
7
|
from urllib.parse import urlparse
|
|
8
8
|
|
|
9
9
|
import requests
|
|
@@ -51,11 +51,11 @@ NO_BODY_METHODS = {
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class LambdaProxyResponse(TypedDict, total=False):
|
|
54
|
-
body:
|
|
55
|
-
statusCode:
|
|
56
|
-
headers:
|
|
57
|
-
isBase64Encoded:
|
|
58
|
-
multiValueHeaders:
|
|
54
|
+
body: str | None
|
|
55
|
+
statusCode: int | str | None
|
|
56
|
+
headers: dict[str, str] | None
|
|
57
|
+
isBase64Encoded: bool | None
|
|
58
|
+
multiValueHeaders: dict[str, list[str]] | None
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
class LambdaInputEvent(TypedDict, total=False):
|
|
@@ -211,6 +211,9 @@ class RestApiAwsIntegration(RestApiIntegration):
|
|
|
211
211
|
action = parsed_uri["path"]
|
|
212
212
|
|
|
213
213
|
if target := self.get_action_service_target(service_name, action):
|
|
214
|
+
# TODO: properly implement the auto-`Content-Type` headers depending on the service protocol
|
|
215
|
+
# e.g. `x-amz-json-1.0` for DynamoDB
|
|
216
|
+
# this is needed to properly support multi-protocol
|
|
214
217
|
headers["X-Amz-Target"] = target
|
|
215
218
|
|
|
216
219
|
query_params["Action"] = action
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from http import HTTPMethod
|
|
3
|
-
from typing import
|
|
3
|
+
from typing import TypedDict
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
6
|
from werkzeug.datastructures import Headers
|
|
@@ -8,7 +8,7 @@ from werkzeug.datastructures import Headers
|
|
|
8
8
|
from localstack.aws.api.apigateway import Integration
|
|
9
9
|
|
|
10
10
|
from ..context import EndpointResponse, IntegrationRequest, RestApiInvocationContext
|
|
11
|
-
from ..gateway_response import ApiConfigurationError, IntegrationFailureError
|
|
11
|
+
from ..gateway_response import ApiConfigurationError, IntegrationFailureError, InternalServerError
|
|
12
12
|
from ..header_utils import build_multi_value_headers
|
|
13
13
|
from .core import RestApiIntegration
|
|
14
14
|
|
|
@@ -20,16 +20,16 @@ NO_BODY_METHODS = {HTTPMethod.OPTIONS, HTTPMethod.GET, HTTPMethod.HEAD}
|
|
|
20
20
|
class SimpleHttpRequest(TypedDict, total=False):
|
|
21
21
|
method: HTTPMethod | str
|
|
22
22
|
url: str
|
|
23
|
-
params:
|
|
23
|
+
params: dict[str, str | list[str]] | None
|
|
24
24
|
data: bytes
|
|
25
|
-
headers:
|
|
26
|
-
cookies:
|
|
27
|
-
timeout:
|
|
28
|
-
allow_redirects:
|
|
29
|
-
stream:
|
|
30
|
-
verify:
|
|
25
|
+
headers: dict[str, str] | None
|
|
26
|
+
cookies: dict[str, str] | None
|
|
27
|
+
timeout: int | None
|
|
28
|
+
allow_redirects: bool | None
|
|
29
|
+
stream: bool | None
|
|
30
|
+
verify: bool | None
|
|
31
31
|
# TODO: check if there was a situation where we'd pass certs?
|
|
32
|
-
cert:
|
|
32
|
+
cert: str | tuple[str, str] | None
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class BaseRestApiHttpIntegration(RestApiIntegration):
|
|
@@ -72,7 +72,7 @@ class RestApiHttpIntegration(BaseRestApiHttpIntegration):
|
|
|
72
72
|
except (requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema) as e:
|
|
73
73
|
LOG.warning("Execution failed due to configuration error: Invalid endpoint address")
|
|
74
74
|
LOG.debug("The URI specified for the HTTP/HTTP_PROXY integration is invalid: %s", uri)
|
|
75
|
-
raise
|
|
75
|
+
raise InternalServerError("Internal server error") from e
|
|
76
76
|
|
|
77
77
|
except (requests.exceptions.Timeout, requests.exceptions.SSLError) as e:
|
|
78
78
|
# TODO make the exception catching more fine grained
|
|
@@ -127,7 +127,7 @@ class RestApiHttpProxyIntegration(BaseRestApiHttpIntegration):
|
|
|
127
127
|
except (requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema) as e:
|
|
128
128
|
LOG.warning("Execution failed due to configuration error: Invalid endpoint address")
|
|
129
129
|
LOG.debug("The URI specified for the HTTP/HTTP_PROXY integration is invalid: %s", uri)
|
|
130
|
-
raise
|
|
130
|
+
raise InternalServerError("Internal server error") from e
|
|
131
131
|
|
|
132
132
|
except (requests.exceptions.Timeout, requests.exceptions.SSLError):
|
|
133
133
|
# TODO make the exception catching more fine grained
|
|
@@ -33,6 +33,7 @@ class RouteHostPathParameters(TypedDict, total=False):
|
|
|
33
33
|
server: str | None
|
|
34
34
|
stage: str | None
|
|
35
35
|
vpce_suffix: str | None
|
|
36
|
+
vpce_dns: str | None
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class ApiGatewayEndpoint:
|
|
@@ -144,6 +145,13 @@ class ApiGatewayEndpoint:
|
|
|
144
145
|
)
|
|
145
146
|
return not_found
|
|
146
147
|
|
|
148
|
+
def vpc_endpoint_handler(
|
|
149
|
+
self, request: Request, **kwargs: Unpack[RouteHostPathParameters]
|
|
150
|
+
) -> Response:
|
|
151
|
+
# TODO validate the vpc endpoint exists in the account/region before routing
|
|
152
|
+
kwargs["api_id"] = request.headers.get("x-apigw-api-id")
|
|
153
|
+
return self.__call__(request, **kwargs)
|
|
154
|
+
|
|
147
155
|
|
|
148
156
|
class ApiGatewayRouter:
|
|
149
157
|
router: Router[Handler]
|
|
@@ -158,6 +166,9 @@ class ApiGatewayRouter:
|
|
|
158
166
|
def register_routes(self) -> None:
|
|
159
167
|
LOG.debug("Registering API Gateway routes.")
|
|
160
168
|
host_pattern = "<regex('.+?'):api_id><regex('(-vpce-[^.]+)?'):vpce_suffix>.execute-api.<regex('.*'):server>"
|
|
169
|
+
vpce_host_pattern = (
|
|
170
|
+
"<regex('vpce-.+'):vpce_dns>.execute-api.<regex('.*'):region>vpce.<regex('.*'):server>"
|
|
171
|
+
)
|
|
161
172
|
deprecated_route_endpoint = deprecated_endpoint(
|
|
162
173
|
endpoint=self.handler,
|
|
163
174
|
previous_path="/restapis/<api_id>/<stage>/_user_request_",
|
|
@@ -214,6 +225,26 @@ class ApiGatewayRouter:
|
|
|
214
225
|
endpoint=self.handler,
|
|
215
226
|
strict_slashes=True,
|
|
216
227
|
),
|
|
228
|
+
self.router.add(
|
|
229
|
+
path="/",
|
|
230
|
+
host=vpce_host_pattern,
|
|
231
|
+
endpoint=self.handler.vpc_endpoint_handler,
|
|
232
|
+
defaults={"path": "", "stage": None},
|
|
233
|
+
strict_slashes=True,
|
|
234
|
+
),
|
|
235
|
+
self.router.add(
|
|
236
|
+
path="/<stage>/",
|
|
237
|
+
host=vpce_host_pattern,
|
|
238
|
+
endpoint=self.handler.vpc_endpoint_handler,
|
|
239
|
+
defaults={"path": ""},
|
|
240
|
+
strict_slashes=False,
|
|
241
|
+
),
|
|
242
|
+
self.router.add(
|
|
243
|
+
path="/<stage>/<greedy_path:path>",
|
|
244
|
+
host=vpce_host_pattern,
|
|
245
|
+
endpoint=self.handler.vpc_endpoint_handler,
|
|
246
|
+
strict_slashes=True,
|
|
247
|
+
),
|
|
217
248
|
]
|
|
218
249
|
for rule in rules:
|
|
219
250
|
self.registered_rules.append(rule)
|
|
@@ -109,7 +109,7 @@ class VTLJsonList(list):
|
|
|
109
109
|
"""
|
|
110
110
|
|
|
111
111
|
def __init__(self, *args):
|
|
112
|
-
super(
|
|
112
|
+
super().__init__(*args)
|
|
113
113
|
for idx, item in enumerate(self):
|
|
114
114
|
self[idx] = cast_to_vtl_json_object(item)
|
|
115
115
|
|
|
@@ -138,7 +138,7 @@ class AttributeDict(dict):
|
|
|
138
138
|
"""
|
|
139
139
|
|
|
140
140
|
def __init__(self, *args, **kwargs):
|
|
141
|
-
super(
|
|
141
|
+
super().__init__(*args, **kwargs)
|
|
142
142
|
for key, value in self.items():
|
|
143
143
|
if isinstance(value, dict):
|
|
144
144
|
self[key] = AttributeDict(value)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import datetime
|
|
2
|
+
import logging
|
|
2
3
|
from urllib.parse import parse_qs
|
|
3
4
|
|
|
4
5
|
from rolo import Request
|
|
@@ -22,6 +23,9 @@ from .variables import (
|
|
|
22
23
|
ContextVarsResponseOverride,
|
|
23
24
|
)
|
|
24
25
|
|
|
26
|
+
LOG = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
25
29
|
# TODO: we probably need to write and populate those logs as part of the handler chain itself
|
|
26
30
|
# and store it in the InvocationContext. That way, we could also retrieve in when calling TestInvoke
|
|
27
31
|
|
|
@@ -45,6 +49,30 @@ TEST_INVOKE_TEMPLATE = """Execution log for request {request_id}
|
|
|
45
49
|
{formatted_date} : Method completed with status: {method_response_status}
|
|
46
50
|
"""
|
|
47
51
|
|
|
52
|
+
TEST_INVOKE_TEMPLATE_MOCK = """Execution log for request {request_id}
|
|
53
|
+
{formatted_date} : Starting execution for request: {request_id}
|
|
54
|
+
{formatted_date} : HTTP Method: {request_method}, Resource Path: {resource_path}
|
|
55
|
+
{formatted_date} : Method request path: {method_request_path_parameters}
|
|
56
|
+
{formatted_date} : Method request query string: {method_request_query_string}
|
|
57
|
+
{formatted_date} : Method request headers: {method_request_headers}
|
|
58
|
+
{formatted_date} : Method request body before transformations: {method_request_body}
|
|
59
|
+
{formatted_date} : Method response body after transformations: {method_response_body}
|
|
60
|
+
{formatted_date} : Method response headers: {method_response_headers}
|
|
61
|
+
{formatted_date} : Successfully completed execution
|
|
62
|
+
{formatted_date} : Method completed with status: {method_response_status}
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
TEST_INVOKE_TEMPLATE_FAILED = """Execution log for request {request_id}
|
|
66
|
+
{formatted_date} : Starting execution for request: {request_id}
|
|
67
|
+
{formatted_date} : HTTP Method: {request_method}, Resource Path: {resource_path}
|
|
68
|
+
{formatted_date} : Method request path: {method_request_path_parameters}
|
|
69
|
+
{formatted_date} : Method request query string: {method_request_query_string}
|
|
70
|
+
{formatted_date} : Method request headers: {method_request_headers}
|
|
71
|
+
{formatted_date} : Method request body before transformations: {method_request_body}
|
|
72
|
+
{formatted_date} : Execution failed due to {error_type}: {error_message}
|
|
73
|
+
{formatted_date} : Method completed with status: {method_response_status}
|
|
74
|
+
"""
|
|
75
|
+
|
|
48
76
|
|
|
49
77
|
def _dump_headers(headers: Headers) -> str:
|
|
50
78
|
if not headers:
|
|
@@ -63,9 +91,9 @@ def log_template(invocation_context: RestApiInvocationContext, response_headers:
|
|
|
63
91
|
formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
|
|
64
92
|
request = invocation_context.invocation_request
|
|
65
93
|
context_var = invocation_context.context_variables
|
|
66
|
-
integration_req = invocation_context.integration_request
|
|
67
|
-
endpoint_resp = invocation_context.endpoint_response
|
|
68
|
-
method_resp = invocation_context.invocation_response
|
|
94
|
+
integration_req = invocation_context.integration_request or {}
|
|
95
|
+
endpoint_resp = invocation_context.endpoint_response or {}
|
|
96
|
+
method_resp = invocation_context.invocation_response or {}
|
|
69
97
|
# TODO: if endpoint_uri is an ARN, it means it's an AWS_PROXY integration
|
|
70
98
|
# this should be transformed to the true URL of a lambda invoke call
|
|
71
99
|
endpoint_uri = integration_req.get("uri", "")
|
|
@@ -93,6 +121,52 @@ def log_template(invocation_context: RestApiInvocationContext, response_headers:
|
|
|
93
121
|
)
|
|
94
122
|
|
|
95
123
|
|
|
124
|
+
def log_mock_template(
|
|
125
|
+
invocation_context: RestApiInvocationContext, response_headers: Headers
|
|
126
|
+
) -> str:
|
|
127
|
+
formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
|
|
128
|
+
request = invocation_context.invocation_request
|
|
129
|
+
context_var = invocation_context.context_variables
|
|
130
|
+
method_resp = invocation_context.invocation_response or {}
|
|
131
|
+
|
|
132
|
+
return TEST_INVOKE_TEMPLATE_MOCK.format(
|
|
133
|
+
formatted_date=formatted_date,
|
|
134
|
+
request_id=context_var["requestId"],
|
|
135
|
+
resource_path=request["path"],
|
|
136
|
+
request_method=request["http_method"],
|
|
137
|
+
method_request_path_parameters=dict_to_string(request["path_parameters"]),
|
|
138
|
+
method_request_query_string=dict_to_string(request["query_string_parameters"]),
|
|
139
|
+
method_request_headers=_dump_headers(request.get("headers")),
|
|
140
|
+
method_request_body=to_str(request.get("body", "")),
|
|
141
|
+
method_response_status=method_resp.get("status_code"),
|
|
142
|
+
method_response_body=to_str(method_resp.get("body", "")),
|
|
143
|
+
method_response_headers=_dump_headers(response_headers),
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def log_failed_template(
|
|
148
|
+
invocation_context: RestApiInvocationContext, response_status_code: int
|
|
149
|
+
) -> str:
|
|
150
|
+
formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
|
|
151
|
+
request = invocation_context.invocation_request
|
|
152
|
+
context_var = invocation_context.context_variables
|
|
153
|
+
|
|
154
|
+
return TEST_INVOKE_TEMPLATE_FAILED.format(
|
|
155
|
+
formatted_date=formatted_date,
|
|
156
|
+
request_id=context_var["requestId"],
|
|
157
|
+
resource_path=request["path"],
|
|
158
|
+
request_method=request["http_method"],
|
|
159
|
+
method_request_path_parameters=dict_to_string(request["path_parameters"]),
|
|
160
|
+
method_request_query_string=dict_to_string(request["query_string_parameters"]),
|
|
161
|
+
method_request_headers=_dump_headers(request.get("headers")),
|
|
162
|
+
method_request_body=to_str(request.get("body", "")),
|
|
163
|
+
method_response_status=response_status_code,
|
|
164
|
+
# TODO: fix the error message
|
|
165
|
+
error_type="",
|
|
166
|
+
error_message="",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
|
|
96
170
|
def create_test_chain() -> HandlerChain[RestApiInvocationContext]:
|
|
97
171
|
return HandlerChain(
|
|
98
172
|
request_handlers=[
|
|
@@ -114,13 +188,16 @@ def create_test_invocation_context(
|
|
|
114
188
|
) -> RestApiInvocationContext:
|
|
115
189
|
parse_handler = handlers.parse_request
|
|
116
190
|
http_method = test_request["httpMethod"]
|
|
191
|
+
resource = deployment.rest_api.resources[test_request["resourceId"]]
|
|
192
|
+
resource_path = resource["path"]
|
|
117
193
|
|
|
118
194
|
# we do not need a true HTTP request for the context, as we are skipping all the parsing steps and using the
|
|
119
195
|
# provider data
|
|
120
196
|
invocation_context = RestApiInvocationContext(
|
|
121
197
|
request=Request(method=http_method),
|
|
122
198
|
)
|
|
123
|
-
|
|
199
|
+
test_request_path = test_request.get("pathWithQueryString") or resource_path
|
|
200
|
+
path_query = test_request_path.split("?")
|
|
124
201
|
path = path_query[0]
|
|
125
202
|
multi_query_args: dict[str, list[str]] = {}
|
|
126
203
|
|
|
@@ -140,9 +217,22 @@ def create_test_invocation_context(
|
|
|
140
217
|
# TODO: handle multiValueHeaders
|
|
141
218
|
body=to_bytes(test_request.get("body") or ""),
|
|
142
219
|
)
|
|
220
|
+
|
|
143
221
|
invocation_context.invocation_request = invocation_request
|
|
222
|
+
try:
|
|
223
|
+
# this is AWS behavior, it will accept any value for the `pathWithQueryString`, even if it doesn't match
|
|
224
|
+
# the expected format. It will just fall back to no value if it cannot parse the path parameters out of it
|
|
225
|
+
_, path_parameters = RestAPIResourceRouter(deployment).match(invocation_context)
|
|
226
|
+
except Exception as e:
|
|
227
|
+
LOG.warning(
|
|
228
|
+
"Error while trying to extract path parameters from user-provided 'pathWithQueryString=%s' "
|
|
229
|
+
"for the following resource path: '%s'. Error: '%s'",
|
|
230
|
+
path,
|
|
231
|
+
resource_path,
|
|
232
|
+
e,
|
|
233
|
+
)
|
|
234
|
+
path_parameters = {}
|
|
144
235
|
|
|
145
|
-
_, path_parameters = RestAPIResourceRouter(deployment).match(invocation_context)
|
|
146
236
|
invocation_request["path_parameters"] = path_parameters
|
|
147
237
|
|
|
148
238
|
invocation_context.deployment = deployment
|
|
@@ -160,8 +250,9 @@ def create_test_invocation_context(
|
|
|
160
250
|
responseOverride=ContextVarsResponseOverride(header={}, status=0),
|
|
161
251
|
)
|
|
162
252
|
invocation_context.trace_id = parse_handler.populate_trace_id({})
|
|
163
|
-
|
|
164
|
-
|
|
253
|
+
resource_method = (
|
|
254
|
+
resource["resourceMethods"].get(http_method) or resource["resourceMethods"]["ANY"]
|
|
255
|
+
)
|
|
165
256
|
invocation_context.resource = resource
|
|
166
257
|
invocation_context.resource_method = resource_method
|
|
167
258
|
invocation_context.integration = resource_method["methodIntegration"]
|
|
@@ -179,8 +270,10 @@ def run_test_invocation(
|
|
|
179
270
|
invocation_context = create_test_invocation_context(test_request, deployment)
|
|
180
271
|
|
|
181
272
|
test_chain = create_test_chain()
|
|
273
|
+
is_mock_integration = invocation_context.integration["type"] == "MOCK"
|
|
274
|
+
|
|
182
275
|
# header order is important
|
|
183
|
-
if
|
|
276
|
+
if is_mock_integration:
|
|
184
277
|
base_headers = {"Content-Type": APPLICATION_JSON}
|
|
185
278
|
else:
|
|
186
279
|
# we manually add the trace-id, as it is normally added by handlers.response_enricher which adds to much data
|
|
@@ -199,7 +292,19 @@ def run_test_invocation(
|
|
|
199
292
|
# AWS does not return the Content-Length for TestInvokeMethod
|
|
200
293
|
response_headers.remove("Content-Length")
|
|
201
294
|
|
|
202
|
-
|
|
295
|
+
if not invocation_context.invocation_response:
|
|
296
|
+
# TODO: this is an heuristic to guess if we encounter an exception in the call
|
|
297
|
+
# in the future, we should attach the exception to the context so we could act on it and properly
|
|
298
|
+
# log as we go through the invocation, so that if we have an error we stop logging at the right moment
|
|
299
|
+
for header in ("Content-Type", "X-Amzn-Trace-Id"):
|
|
300
|
+
response_headers.remove(header)
|
|
301
|
+
log = log_failed_template(invocation_context, test_response.status_code)
|
|
302
|
+
|
|
303
|
+
elif is_mock_integration:
|
|
304
|
+
# TODO: revisit how we're building the logs
|
|
305
|
+
log = log_mock_template(invocation_context, response_headers)
|
|
306
|
+
else:
|
|
307
|
+
log = log_template(invocation_context, response_headers)
|
|
203
308
|
|
|
204
309
|
headers = dict(response_headers)
|
|
205
310
|
multi_value_headers = build_multi_value_headers(response_headers)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import
|
|
1
|
+
from typing import TypedDict
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class ContextVarsAuthorizer(TypedDict, total=False):
|
|
@@ -6,9 +6,9 @@ class ContextVarsAuthorizer(TypedDict, total=False):
|
|
|
6
6
|
# format
|
|
7
7
|
|
|
8
8
|
# https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
|
|
9
|
-
claims:
|
|
9
|
+
claims: dict[str, str] | None
|
|
10
10
|
"""Claims returned from the Amazon Cognito user pool after the method caller is successfully authenticated"""
|
|
11
|
-
principalId:
|
|
11
|
+
principalId: str | None
|
|
12
12
|
"""The principal user identification associated with the token sent by the client and returned from an API Gateway Lambda authorizer"""
|
|
13
13
|
|
|
14
14
|
|
|
@@ -29,38 +29,38 @@ class ContextVarsIdentityClientCert(TypedDict, total=False):
|
|
|
29
29
|
|
|
30
30
|
class ContextVarsIdentity(TypedDict, total=False):
|
|
31
31
|
# https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
|
|
32
|
-
accountId:
|
|
32
|
+
accountId: str | None
|
|
33
33
|
"""The AWS account ID associated with the request."""
|
|
34
|
-
accessKey:
|
|
34
|
+
accessKey: str | None
|
|
35
35
|
"""The AWS access key associated with the request."""
|
|
36
|
-
apiKey:
|
|
36
|
+
apiKey: str | None
|
|
37
37
|
"""For API methods that require an API key, this variable is the API key associated with the method request."""
|
|
38
|
-
apiKeyId:
|
|
38
|
+
apiKeyId: str | None
|
|
39
39
|
"""The API key ID associated with an API request that requires an API key."""
|
|
40
|
-
caller:
|
|
40
|
+
caller: str | None
|
|
41
41
|
"""The principal identifier of the caller that signed the request. Supported for resources that use IAM authorization."""
|
|
42
|
-
cognitoAuthenticationProvider:
|
|
42
|
+
cognitoAuthenticationProvider: str | None
|
|
43
43
|
"""A comma-separated list of the Amazon Cognito authentication providers used by the caller making the request"""
|
|
44
|
-
cognitoAuthenticationType:
|
|
44
|
+
cognitoAuthenticationType: str | None
|
|
45
45
|
"""The Amazon Cognito authentication type of the caller making the request"""
|
|
46
|
-
cognitoIdentityId:
|
|
46
|
+
cognitoIdentityId: str | None
|
|
47
47
|
"""The Amazon Cognito identity ID of the caller making the request"""
|
|
48
|
-
cognitoIdentityPoolId:
|
|
48
|
+
cognitoIdentityPoolId: str | None
|
|
49
49
|
"""The Amazon Cognito identity pool ID of the caller making the request"""
|
|
50
|
-
principalOrgId:
|
|
50
|
+
principalOrgId: str | None
|
|
51
51
|
"""The AWS organization ID."""
|
|
52
|
-
sourceIp:
|
|
52
|
+
sourceIp: str | None
|
|
53
53
|
"""The source IP address of the immediate TCP connection making the request to the API Gateway endpoint"""
|
|
54
54
|
clientCert: ContextVarsIdentityClientCert
|
|
55
|
-
vpcId:
|
|
55
|
+
vpcId: str | None
|
|
56
56
|
"""The VPC ID of the VPC making the request to the API Gateway endpoint."""
|
|
57
|
-
vpceId:
|
|
57
|
+
vpceId: str | None
|
|
58
58
|
"""The VPC endpoint ID of the VPC endpoint making the request to the API Gateway endpoint."""
|
|
59
|
-
user:
|
|
59
|
+
user: str | None
|
|
60
60
|
"""The principal identifier of the user that will be authorized against resource access for resources that use IAM authorization."""
|
|
61
|
-
userAgent:
|
|
61
|
+
userAgent: str | None
|
|
62
62
|
"""The User-Agent header of the API caller."""
|
|
63
|
-
userArn:
|
|
63
|
+
userArn: str | None
|
|
64
64
|
"""The Amazon Resource Name (ARN) of the effective user identified after authentication."""
|
|
65
65
|
|
|
66
66
|
|
|
@@ -95,9 +95,9 @@ class ContextVariables(TypedDict, total=False):
|
|
|
95
95
|
"""The API owner's AWS account ID."""
|
|
96
96
|
apiId: str
|
|
97
97
|
"""The identifier API Gateway assigns to your API."""
|
|
98
|
-
authorizer:
|
|
98
|
+
authorizer: ContextVarsAuthorizer | None
|
|
99
99
|
"""The principal user identification associated with the token."""
|
|
100
|
-
awsEndpointRequestId:
|
|
100
|
+
awsEndpointRequestId: str | None
|
|
101
101
|
"""The AWS endpoint's request ID."""
|
|
102
102
|
deploymentId: str
|
|
103
103
|
"""The ID of the API deployment."""
|
|
@@ -111,8 +111,8 @@ class ContextVariables(TypedDict, total=False):
|
|
|
111
111
|
"""The extended ID that API Gateway generates and assigns to the API request. """
|
|
112
112
|
httpMethod: str
|
|
113
113
|
"""The HTTP method used"""
|
|
114
|
-
identity:
|
|
115
|
-
isCanaryRequest:
|
|
114
|
+
identity: ContextVarsIdentity | None
|
|
115
|
+
isCanaryRequest: bool | None
|
|
116
116
|
"""Indicates if the request was directed to the canary"""
|
|
117
117
|
path: str
|
|
118
118
|
"""The request path."""
|
|
@@ -120,76 +120,76 @@ class ContextVariables(TypedDict, total=False):
|
|
|
120
120
|
"""The request protocol"""
|
|
121
121
|
requestId: str
|
|
122
122
|
"""An ID for the request. Clients can override this request ID. """
|
|
123
|
-
requestOverride:
|
|
123
|
+
requestOverride: ContextVarsRequestOverride | None
|
|
124
124
|
"""Request override. Only exists for request mapping template"""
|
|
125
125
|
requestTime: str
|
|
126
126
|
"""The CLF-formatted request time (dd/MMM/yyyy:HH:mm:ss +-hhmm)."""
|
|
127
127
|
requestTimeEpoch: int
|
|
128
128
|
"""The Epoch-formatted request time, in milliseconds."""
|
|
129
|
-
resourceId:
|
|
129
|
+
resourceId: str | None
|
|
130
130
|
"""The identifier that API Gateway assigns to your resource."""
|
|
131
|
-
resourcePath:
|
|
131
|
+
resourcePath: str | None
|
|
132
132
|
"""The path to your resource"""
|
|
133
|
-
responseOverride:
|
|
133
|
+
responseOverride: ContextVarsResponseOverride | None
|
|
134
134
|
"""Response override. Only exists for response mapping template"""
|
|
135
135
|
stage: str
|
|
136
136
|
"""The deployment stage of the API request """
|
|
137
|
-
wafResponseCode:
|
|
137
|
+
wafResponseCode: str | None
|
|
138
138
|
"""The response received from AWS WAF: WAF_ALLOW or WAF_BLOCK. Will not be set if the stage is not associated with a web ACL"""
|
|
139
|
-
webaclArn:
|
|
139
|
+
webaclArn: str | None
|
|
140
140
|
"""The complete ARN of the web ACL that is used to decide whether to allow or block the request. Will not be set if the stage is not associated with a web ACL."""
|
|
141
141
|
|
|
142
142
|
|
|
143
143
|
class LoggingContextVarsAuthorize(TypedDict, total=False):
|
|
144
|
-
error:
|
|
145
|
-
latency:
|
|
146
|
-
status:
|
|
144
|
+
error: str | None
|
|
145
|
+
latency: str | None
|
|
146
|
+
status: str | None
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
class LoggingContextVarsAuthorizer(TypedDict, total=False):
|
|
150
|
-
error:
|
|
151
|
-
integrationLatency:
|
|
152
|
-
integrationStatus:
|
|
153
|
-
latency:
|
|
154
|
-
requestId:
|
|
155
|
-
status:
|
|
150
|
+
error: str | None
|
|
151
|
+
integrationLatency: str | None
|
|
152
|
+
integrationStatus: str | None
|
|
153
|
+
latency: str | None
|
|
154
|
+
requestId: str | None
|
|
155
|
+
status: str | None
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
class LoggingContextVarsAuthenticate(TypedDict, total=False):
|
|
159
|
-
error:
|
|
160
|
-
latency:
|
|
161
|
-
status:
|
|
159
|
+
error: str | None
|
|
160
|
+
latency: str | None
|
|
161
|
+
status: str | None
|
|
162
162
|
|
|
163
163
|
|
|
164
164
|
class LoggingContextVarsCustomDomain(TypedDict, total=False):
|
|
165
|
-
basePathMatched:
|
|
165
|
+
basePathMatched: str | None
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
class LoggingContextVarsIntegration(TypedDict, total=False):
|
|
169
|
-
error:
|
|
170
|
-
integrationStatus:
|
|
171
|
-
latency:
|
|
172
|
-
requestId:
|
|
173
|
-
status:
|
|
169
|
+
error: str | None
|
|
170
|
+
integrationStatus: str | None
|
|
171
|
+
latency: str | None
|
|
172
|
+
requestId: str | None
|
|
173
|
+
status: str | None
|
|
174
174
|
|
|
175
175
|
|
|
176
176
|
class LoggingContextVarsWaf(TypedDict, total=False):
|
|
177
|
-
error:
|
|
178
|
-
latency:
|
|
179
|
-
status:
|
|
177
|
+
error: str | None
|
|
178
|
+
latency: str | None
|
|
179
|
+
status: str | None
|
|
180
180
|
|
|
181
181
|
|
|
182
182
|
class LoggingContextVariables(TypedDict, total=False):
|
|
183
|
-
authorize:
|
|
184
|
-
authorizer:
|
|
185
|
-
authenticate:
|
|
186
|
-
customDomain:
|
|
187
|
-
endpointType:
|
|
188
|
-
integration:
|
|
189
|
-
integrationLatency:
|
|
190
|
-
integrationStatus:
|
|
191
|
-
responseLatency:
|
|
192
|
-
responseLength:
|
|
193
|
-
status:
|
|
194
|
-
waf:
|
|
195
|
-
xrayTraceId:
|
|
183
|
+
authorize: LoggingContextVarsAuthorize | None
|
|
184
|
+
authorizer: LoggingContextVarsAuthorizer | None
|
|
185
|
+
authenticate: LoggingContextVarsAuthenticate | None
|
|
186
|
+
customDomain: LoggingContextVarsCustomDomain | None
|
|
187
|
+
endpointType: str | None
|
|
188
|
+
integration: LoggingContextVarsIntegration | None
|
|
189
|
+
integrationLatency: str | None
|
|
190
|
+
integrationStatus: str | None
|
|
191
|
+
responseLatency: str | None
|
|
192
|
+
responseLength: str | None
|
|
193
|
+
status: str | None
|
|
194
|
+
waf: LoggingContextVarsWaf | None
|
|
195
|
+
xrayTraceId: str | None
|
|
@@ -429,6 +429,11 @@ class ApigatewayNextGenProvider(ApigatewayProvider):
|
|
|
429
429
|
if not resource:
|
|
430
430
|
raise NotFoundException("Invalid Resource identifier specified")
|
|
431
431
|
|
|
432
|
+
resource_methods = resource.resource_methods
|
|
433
|
+
|
|
434
|
+
if request["httpMethod"] not in resource_methods and "ANY" not in resource_methods:
|
|
435
|
+
raise NotFoundException("Invalid Method identifier specified")
|
|
436
|
+
|
|
432
437
|
# test httpMethod
|
|
433
438
|
|
|
434
439
|
rest_api_container = get_rest_api_container(context, rest_api_id=rest_api_id)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import TypedDict
|
|
6
6
|
|
|
7
7
|
import localstack.services.cloudformation.provider_utils as util
|
|
8
8
|
from localstack.services.cloudformation.resource_provider import (
|
|
@@ -14,8 +14,8 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class ApiGatewayAccountProperties(TypedDict):
|
|
17
|
-
CloudWatchRoleArn:
|
|
18
|
-
Id:
|
|
17
|
+
CloudWatchRoleArn: str | None
|
|
18
|
+
Id: str | None
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
REPEATED_INVOCATION = "repeated_invocation"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional, Type
|
|
2
|
-
|
|
3
1
|
from localstack.services.cloudformation.resource_provider import (
|
|
4
2
|
CloudFormationResourceProviderPlugin,
|
|
5
3
|
ResourceProvider,
|
|
@@ -10,7 +8,7 @@ class ApiGatewayAccountProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::ApiGateway::Account"
|
|
11
9
|
|
|
12
10
|
def __init__(self):
|
|
13
|
-
self.factory:
|
|
11
|
+
self.factory: type[ResourceProvider] | None = None
|
|
14
12
|
|
|
15
13
|
def load(self):
|
|
16
14
|
from localstack.services.apigateway.resource_providers.aws_apigateway_account import (
|