localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- localstack/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/cloudformation/__init__.py +18 -4
- localstack/aws/api/cloudwatch/__init__.py +41 -1
- localstack/aws/api/config/__init__.py +4 -0
- localstack/aws/api/core.py +8 -5
- localstack/aws/api/dynamodb/__init__.py +30 -0
- localstack/aws/api/ec2/__init__.py +1545 -66
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/iam/__init__.py +7 -0
- localstack/aws/api/kinesis/__init__.py +19 -0
- localstack/aws/api/kms/__init__.py +6 -0
- localstack/aws/api/lambda_/__init__.py +36 -23
- localstack/aws/api/logs/__init__.py +20 -8
- localstack/aws/api/opensearch/__init__.py +16 -0
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/redshift/__init__.py +9 -3
- localstack/aws/api/route53/__init__.py +5 -0
- localstack/aws/api/s3/__init__.py +12 -0
- localstack/aws/api/s3control/__init__.py +56 -0
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/ssm/__init__.py +2 -0
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/api/transcribe/__init__.py +17 -0
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +14 -11
- localstack/aws/connect.py +42 -41
- localstack/aws/forwarder.py +57 -9
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +2 -3
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/internal_requests.py +6 -1
- localstack/aws/handlers/logging.py +13 -4
- localstack/aws/handlers/metric_handler.py +44 -5
- localstack/aws/handlers/service.py +48 -28
- localstack/aws/mocking.py +18 -27
- localstack/aws/patches.py +2 -2
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +475 -49
- localstack/aws/protocol/serializer.py +723 -106
- localstack/aws/protocol/service_router.py +133 -33
- localstack/aws/protocol/validate.py +6 -6
- localstack/aws/scaffold.py +9 -10
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +12 -11
- localstack/aws/spec-patches.json +58 -0
- localstack/aws/spec.py +66 -46
- localstack/cli/exceptions.py +1 -1
- localstack/cli/localstack.py +11 -11
- localstack/cli/lpm.py +4 -5
- localstack/cli/plugins.py +1 -1
- localstack/cli/profiles.py +1 -2
- localstack/config.py +44 -30
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +130 -7
- localstack/dev/run/__main__.py +5 -5
- localstack/dev/run/configurators.py +1 -4
- localstack/dev/run/paths.py +6 -6
- localstack/dns/models.py +2 -1
- localstack/dns/plugins.py +5 -1
- localstack/dns/server.py +16 -6
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +6 -6
- localstack/packages/api.py +13 -12
- localstack/packages/core.py +4 -4
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +38 -12
- localstack/packages/plugins.py +0 -8
- localstack/runtime/analytics.py +3 -0
- localstack/runtime/hooks.py +1 -1
- localstack/runtime/init.py +8 -9
- localstack/runtime/main.py +5 -5
- localstack/runtime/patches.py +2 -2
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +7 -10
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +27 -28
- localstack/services/apigateway/legacy/integration.py +11 -10
- localstack/services/apigateway/legacy/invocations.py +6 -5
- localstack/services/apigateway/legacy/provider.py +148 -68
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +6 -6
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
- localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
- localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/next_gen/provider.py +5 -0
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/api_utils.py +4 -8
- localstack/services/cloudformation/cfn_utils.py +2 -2
- localstack/services/cloudformation/deployment_utils.py +14 -12
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +27 -17
- localstack/services/cloudformation/engine/parameters.py +4 -4
- localstack/services/cloudformation/engine/template_deployer.py +15 -14
- localstack/services/cloudformation/engine/template_utils.py +34 -12
- localstack/services/cloudformation/engine/transformers.py +11 -8
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
- localstack/services/cloudformation/engine/v2/resolving.py +102 -0
- localstack/services/cloudformation/engine/yaml_parser.py +9 -2
- localstack/services/cloudformation/provider.py +11 -6
- localstack/services/cloudformation/provider_utils.py +34 -4
- localstack/services/cloudformation/resource_provider.py +31 -21
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/resources.py +24149 -0
- localstack/services/cloudformation/scaffolding/__main__.py +13 -12
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/service_models.py +2 -2
- localstack/services/cloudformation/stores.py +33 -22
- localstack/services/cloudformation/v2/entities.py +103 -88
- localstack/services/cloudformation/v2/provider.py +872 -131
- localstack/services/cloudformation/v2/types.py +38 -0
- localstack/services/cloudformation/v2/utils.py +4 -1
- localstack/services/cloudwatch/alarm_scheduler.py +11 -8
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +30 -25
- localstack/services/cloudwatch/provider_v2.py +27 -32
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +3 -3
- localstack/services/dynamodb/provider.py +159 -18
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/server.py +2 -2
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +157 -18
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +26 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +6 -6
- localstack/services/es/provider.py +21 -21
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/event_rule_engine.py +31 -13
- localstack/services/events/models.py +29 -30
- localstack/services/events/provider.py +29 -26
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +21 -13
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +15 -15
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +25 -16
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +14 -119
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/iam/resources/policy_simulator.py +133 -0
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +17 -5
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/provider.py +86 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +21 -18
- localstack/services/kms/provider.py +62 -26
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +4 -3
- localstack/services/lambda_/api_utils.py +19 -16
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
- localstack/services/lambda_/invocation/event_manager.py +1 -1
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
- localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
- localstack/services/lambda_/invocation/lambda_models.py +33 -30
- localstack/services/lambda_/invocation/lambda_service.py +12 -5
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/invocation/version_manager.py +31 -8
- localstack/services/lambda_/ldm.py +14 -0
- localstack/services/lambda_/packages.py +3 -4
- localstack/services/lambda_/provider.py +9 -26
- localstack/services/lambda_/provider_utils.py +1 -1
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/lambda_/urlrouter.py +14 -1
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +39 -22
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +5 -4
- localstack/services/opensearch/cluster.py +28 -20
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +27 -9
- localstack/services/opensearch/provider.py +15 -10
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +57 -10
- localstack/services/plugins.py +37 -32
- localstack/services/providers.py +10 -2
- localstack/services/redshift/provider.py +0 -21
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/constants.py +5 -2
- localstack/services/s3/cors.py +8 -8
- localstack/services/s3/models.py +73 -73
- localstack/services/s3/notifications.py +74 -58
- localstack/services/s3/presigned_url.py +41 -59
- localstack/services/s3/provider.py +86 -29
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +51 -31
- localstack/services/s3/validation.py +47 -33
- localstack/services/s3/website_hosting.py +9 -7
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +10 -12
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/models.py +8 -1
- localstack/services/ses/provider.py +128 -55
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/constants.py +7 -1
- localstack/services/sns/executor.py +9 -2
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +9 -7
- localstack/services/sns/publisher.py +37 -23
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sns/v2/models.py +167 -0
- localstack/services/sns/v2/provider.py +867 -0
- localstack/services/sns/v2/utils.py +130 -0
- localstack/services/sqs/constants.py +2 -2
- localstack/services/sqs/developer_api.py +205 -0
- localstack/services/sqs/models.py +71 -36
- localstack/services/sqs/provider.py +56 -332
- localstack/services/sqs/query_api.py +8 -5
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +123 -4
- localstack/services/ssm/provider.py +3 -4
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +9 -9
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
- localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +22 -24
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +12 -12
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
- localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +8 -8
- localstack/services/stepfunctions/backend/execution.py +29 -30
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +28 -28
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +9 -9
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/packages.py +14 -5
- localstack/services/stepfunctions/provider.py +34 -44
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +8 -8
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +8 -3
- localstack/state/codecs.py +61 -0
- localstack/state/core.py +11 -5
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +36 -23
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/cloudformation_utils.py +1 -1
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +68 -18
- localstack/testing/pytest/container.py +5 -5
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +188 -49
- localstack/testing/pytest/in_memory_localstack.py +1 -3
- localstack/testing/pytest/marking.py +42 -15
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +11 -10
- localstack/testing/pytest/util.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -4
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +8 -3
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metadata.py +6 -4
- localstack/utils/analytics/metrics/counter.py +11 -18
- localstack/utils/analytics/metrics/registry.py +2 -2
- localstack/utils/analytics/publisher.py +4 -5
- localstack/utils/analytics/service_providers.py +19 -0
- localstack/utils/analytics/service_request_aggregator.py +4 -4
- localstack/utils/archives.py +12 -12
- localstack/utils/asyncio.py +2 -2
- localstack/utils/aws/arns.py +26 -31
- localstack/utils/aws/aws_responses.py +21 -28
- localstack/utils/aws/aws_stack.py +7 -12
- localstack/utils/aws/dead_letter_queue.py +4 -9
- localstack/utils/aws/message_forwarding.py +8 -11
- localstack/utils/aws/request_context.py +5 -6
- localstack/utils/aws/resources.py +1 -1
- localstack/utils/aws/templating.py +4 -4
- localstack/utils/batch_policy.py +4 -4
- localstack/utils/bootstrap.py +37 -30
- localstack/utils/catalog/catalog.py +139 -0
- localstack/utils/catalog/catalog_loader.py +119 -0
- localstack/utils/catalog/common.py +58 -0
- localstack/utils/catalog/plugins.py +28 -0
- localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
- localstack/utils/collections.py +33 -27
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +5 -6
- localstack/utils/container_utils/container_client.py +156 -160
- localstack/utils/container_utils/docker_cmd_client.py +97 -81
- localstack/utils/container_utils/docker_sdk_client.py +75 -72
- localstack/utils/crypto.py +12 -13
- localstack/utils/diagnose.py +11 -12
- localstack/utils/docker_utils.py +11 -7
- localstack/utils/files.py +34 -15
- localstack/utils/functions.py +5 -4
- localstack/utils/http.py +14 -14
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +21 -7
- localstack/utils/kinesis/kinesis_connector.py +2 -1
- localstack/utils/net.py +25 -17
- localstack/utils/no_exit_argument_parser.py +2 -2
- localstack/utils/numbers.py +9 -2
- localstack/utils/objects.py +15 -14
- localstack/utils/patch.py +14 -7
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +15 -14
- localstack/utils/scheduler.py +13 -12
- localstack/utils/server/tcp_proxy.py +2 -2
- localstack/utils/serving.py +3 -4
- localstack/utils/strings.py +15 -16
- localstack/utils/sync.py +126 -1
- localstack/utils/tagging.py +10 -8
- localstack/utils/testutil.py +17 -17
- localstack/utils/threads.py +3 -3
- localstack/utils/time.py +12 -4
- localstack/utils/urls.py +1 -3
- localstack/utils/xml.py +1 -1
- localstack/utils/xray/traceid.py +1 -1
- localstack/version.py +16 -3
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
- localstack/packages/terraform.py +0 -47
- localstack/services/cloudformation/deploy.html +0 -144
- localstack/services/cloudformation/deploy_ui.py +0 -47
- localstack/services/cloudformation/plugins.py +0 -12
- localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
- localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
- /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
|
@@ -5,7 +5,7 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
7
|
import time
|
|
8
|
-
from typing import Any, Final
|
|
8
|
+
from typing import Any, Final
|
|
9
9
|
|
|
10
10
|
import moto.secretsmanager.exceptions as moto_exception
|
|
11
11
|
from botocore.utils import InvalidArnException
|
|
@@ -135,7 +135,7 @@ class SecretsmanagerProvider(SecretsmanagerApi):
|
|
|
135
135
|
return bool(re.match(r"^[A-Za-z0-9/_+=.@-]+\Z", secret_id))
|
|
136
136
|
|
|
137
137
|
@staticmethod
|
|
138
|
-
def _raise_if_invalid_secret_id(secret_id:
|
|
138
|
+
def _raise_if_invalid_secret_id(secret_id: SecretIdType | NameType):
|
|
139
139
|
# Patches moto's implementation for which secret_ids are not validated, by raising a ValidationException.
|
|
140
140
|
# Skips this check if the secret_id provided appears to be an arn (starting with 'arn:').
|
|
141
141
|
if not re.match(
|
|
@@ -149,12 +149,10 @@ class SecretsmanagerProvider(SecretsmanagerApi):
|
|
|
149
149
|
|
|
150
150
|
@staticmethod
|
|
151
151
|
def _raise_if_missing_client_req_token(
|
|
152
|
-
request:
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
UpdateSecretRequest,
|
|
157
|
-
],
|
|
152
|
+
request: CreateSecretRequest
|
|
153
|
+
| PutSecretValueRequest
|
|
154
|
+
| RotateSecretRequest
|
|
155
|
+
| UpdateSecretRequest,
|
|
158
156
|
):
|
|
159
157
|
if "ClientRequestToken" not in request:
|
|
160
158
|
raise InvalidRequestException(
|
|
@@ -201,8 +199,8 @@ class SecretsmanagerProvider(SecretsmanagerApi):
|
|
|
201
199
|
) -> DeleteSecretResponse:
|
|
202
200
|
secret_id: str = request["SecretId"]
|
|
203
201
|
self._raise_if_invalid_secret_id(secret_id)
|
|
204
|
-
recovery_window_in_days:
|
|
205
|
-
force_delete_without_recovery:
|
|
202
|
+
recovery_window_in_days: int | None = request.get("RecoveryWindowInDays")
|
|
203
|
+
force_delete_without_recovery: bool | None = request.get("ForceDeleteWithoutRecovery")
|
|
206
204
|
|
|
207
205
|
backend = SecretsmanagerProvider.get_moto_backend_for_resource(secret_id, context)
|
|
208
206
|
try:
|
|
@@ -495,7 +493,7 @@ def moto_smb_get_secret_value(fn, self, secret_id, version_id, version_stage):
|
|
|
495
493
|
def moto_smb_create_secret(fn, self, name, *args, **kwargs):
|
|
496
494
|
# Creating a secret with a SecretId equal to one that is scheduled for
|
|
497
495
|
# deletion should raise an 'InvalidRequestException'.
|
|
498
|
-
secret:
|
|
496
|
+
secret: FakeSecret | None = self.secrets.get(name)
|
|
499
497
|
if secret is not None and secret.deleted_date is not None:
|
|
500
498
|
raise InvalidRequestException(AWS_INVALID_REQUEST_MESSAGE_CREATE_WITH_SCHEDULED_DELETION)
|
|
501
499
|
|
|
@@ -523,7 +521,7 @@ def moto_smb_list_secret_version_ids(
|
|
|
523
521
|
secret = self.secrets[secret_id]
|
|
524
522
|
|
|
525
523
|
# Patch: output format, report exact createdate instead of current time.
|
|
526
|
-
versions: list[SecretVersionsListEntry] =
|
|
524
|
+
versions: list[SecretVersionsListEntry] = []
|
|
527
525
|
for version_id, version in secret.versions.items():
|
|
528
526
|
version_stages = version["version_stages"]
|
|
529
527
|
# Patch: include deprecated versions if include_deprecated is True.
|
|
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
|
|
4
4
|
import json
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import TypedDict
|
|
7
7
|
|
|
8
8
|
import localstack.services.cloudformation.provider_utils as util
|
|
9
9
|
from localstack.services.cloudformation.resource_provider import (
|
|
@@ -15,10 +15,10 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class SecretsManagerResourcePolicyProperties(TypedDict):
|
|
18
|
-
ResourcePolicy:
|
|
19
|
-
SecretId:
|
|
20
|
-
BlockPublicPolicy:
|
|
21
|
-
Id:
|
|
18
|
+
ResourcePolicy: dict | None
|
|
19
|
+
SecretId: str | None
|
|
20
|
+
BlockPublicPolicy: bool | None
|
|
21
|
+
Id: str | None
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
REPEATED_INVOCATION = "repeated_invocation"
|
localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py
CHANGED
|
@@ -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 SecretsManagerResourcePolicyProviderPlugin(CloudFormationResourceProviderP
|
|
|
10
8
|
name = "AWS::SecretsManager::ResourcePolicy"
|
|
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.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy import (
|
localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py
CHANGED
|
@@ -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,32 +14,32 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class SecretsManagerRotationScheduleProperties(TypedDict):
|
|
17
|
-
SecretId:
|
|
18
|
-
HostedRotationLambda:
|
|
19
|
-
Id:
|
|
20
|
-
RotateImmediatelyOnUpdate:
|
|
21
|
-
RotationLambdaARN:
|
|
22
|
-
RotationRules:
|
|
17
|
+
SecretId: str | None
|
|
18
|
+
HostedRotationLambda: HostedRotationLambda | None
|
|
19
|
+
Id: str | None
|
|
20
|
+
RotateImmediatelyOnUpdate: bool | None
|
|
21
|
+
RotationLambdaARN: str | None
|
|
22
|
+
RotationRules: RotationRules | None
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
class RotationRules(TypedDict):
|
|
26
|
-
AutomaticallyAfterDays:
|
|
27
|
-
Duration:
|
|
28
|
-
ScheduleExpression:
|
|
26
|
+
AutomaticallyAfterDays: int | None
|
|
27
|
+
Duration: str | None
|
|
28
|
+
ScheduleExpression: str | None
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class HostedRotationLambda(TypedDict):
|
|
32
|
-
RotationType:
|
|
33
|
-
ExcludeCharacters:
|
|
34
|
-
KmsKeyArn:
|
|
35
|
-
MasterSecretArn:
|
|
36
|
-
MasterSecretKmsKeyArn:
|
|
37
|
-
RotationLambdaName:
|
|
38
|
-
Runtime:
|
|
39
|
-
SuperuserSecretArn:
|
|
40
|
-
SuperuserSecretKmsKeyArn:
|
|
41
|
-
VpcSecurityGroupIds:
|
|
42
|
-
VpcSubnetIds:
|
|
32
|
+
RotationType: str | None
|
|
33
|
+
ExcludeCharacters: str | None
|
|
34
|
+
KmsKeyArn: str | None
|
|
35
|
+
MasterSecretArn: str | None
|
|
36
|
+
MasterSecretKmsKeyArn: str | None
|
|
37
|
+
RotationLambdaName: str | None
|
|
38
|
+
Runtime: str | None
|
|
39
|
+
SuperuserSecretArn: str | None
|
|
40
|
+
SuperuserSecretKmsKeyArn: str | None
|
|
41
|
+
VpcSecurityGroupIds: str | None
|
|
42
|
+
VpcSubnetIds: str | None
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
REPEATED_INVOCATION = "repeated_invocation"
|
localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py
CHANGED
|
@@ -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 SecretsManagerRotationScheduleProviderPlugin(CloudFormationResourceProvide
|
|
|
10
8
|
name = "AWS::SecretsManager::RotationSchedule"
|
|
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.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule import (
|
|
@@ -6,7 +6,7 @@ import logging
|
|
|
6
6
|
import random
|
|
7
7
|
import string
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import
|
|
9
|
+
from typing import TypedDict
|
|
10
10
|
|
|
11
11
|
import localstack.services.cloudformation.provider_utils as util
|
|
12
12
|
from localstack.services.cloudformation.resource_provider import (
|
|
@@ -20,37 +20,37 @@ LOG = logging.getLogger(__name__)
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class SecretsManagerSecretProperties(TypedDict):
|
|
23
|
-
Description:
|
|
24
|
-
GenerateSecretString:
|
|
25
|
-
Id:
|
|
26
|
-
KmsKeyId:
|
|
27
|
-
Name:
|
|
28
|
-
ReplicaRegions:
|
|
29
|
-
SecretString:
|
|
30
|
-
Tags:
|
|
23
|
+
Description: str | None
|
|
24
|
+
GenerateSecretString: GenerateSecretString | None
|
|
25
|
+
Id: str | None
|
|
26
|
+
KmsKeyId: str | None
|
|
27
|
+
Name: str | None
|
|
28
|
+
ReplicaRegions: list[ReplicaRegion] | None
|
|
29
|
+
SecretString: str | None
|
|
30
|
+
Tags: list[Tag] | None
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class GenerateSecretString(TypedDict):
|
|
34
|
-
ExcludeCharacters:
|
|
35
|
-
ExcludeLowercase:
|
|
36
|
-
ExcludeNumbers:
|
|
37
|
-
ExcludePunctuation:
|
|
38
|
-
ExcludeUppercase:
|
|
39
|
-
GenerateStringKey:
|
|
40
|
-
IncludeSpace:
|
|
41
|
-
PasswordLength:
|
|
42
|
-
RequireEachIncludedType:
|
|
43
|
-
SecretStringTemplate:
|
|
34
|
+
ExcludeCharacters: str | None
|
|
35
|
+
ExcludeLowercase: bool | None
|
|
36
|
+
ExcludeNumbers: bool | None
|
|
37
|
+
ExcludePunctuation: bool | None
|
|
38
|
+
ExcludeUppercase: bool | None
|
|
39
|
+
GenerateStringKey: str | None
|
|
40
|
+
IncludeSpace: bool | None
|
|
41
|
+
PasswordLength: int | None
|
|
42
|
+
RequireEachIncludedType: bool | None
|
|
43
|
+
SecretStringTemplate: str | None
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
class ReplicaRegion(TypedDict):
|
|
47
|
-
Region:
|
|
48
|
-
KmsKeyId:
|
|
47
|
+
Region: str | None
|
|
48
|
+
KmsKeyId: str | None
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
class Tag(TypedDict):
|
|
52
|
-
Key:
|
|
53
|
-
Value:
|
|
52
|
+
Key: str | None
|
|
53
|
+
Value: str | None
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
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 SecretsManagerSecretProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::SecretsManager::Secret"
|
|
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.secretsmanager.resource_providers.aws_secretsmanager_secret import (
|
localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py
CHANGED
|
@@ -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,10 +14,10 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class SecretsManagerSecretTargetAttachmentProperties(TypedDict):
|
|
17
|
-
SecretId:
|
|
18
|
-
TargetId:
|
|
19
|
-
TargetType:
|
|
20
|
-
Id:
|
|
17
|
+
SecretId: str | None
|
|
18
|
+
TargetId: str | None
|
|
19
|
+
TargetType: str | None
|
|
20
|
+
Id: str | None
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
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 SecretsManagerSecretTargetAttachmentProviderPlugin(CloudFormationResourceP
|
|
|
10
8
|
name = "AWS::SecretsManager::SecretTargetAttachment"
|
|
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.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment import (
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
1
2
|
from typing import TypedDict
|
|
2
3
|
|
|
3
4
|
from localstack.aws.api.ses import Address, Destination, Subject, TemplateData, TemplateName
|
|
@@ -8,7 +9,7 @@ class SentEmailBody(TypedDict):
|
|
|
8
9
|
text_part: str
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
class SentEmail(TypedDict):
|
|
12
|
+
class SentEmail(TypedDict, total=False):
|
|
12
13
|
Id: str
|
|
13
14
|
Region: str
|
|
14
15
|
Timestamp: str
|
|
@@ -19,3 +20,9 @@ class SentEmail(TypedDict):
|
|
|
19
20
|
Template: TemplateName
|
|
20
21
|
TemplateData: TemplateData
|
|
21
22
|
Body: SentEmailBody
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class EmailType(StrEnum):
|
|
26
|
+
TEMPLATED = "templated"
|
|
27
|
+
RAW = "raw"
|
|
28
|
+
EMAIL = "email"
|
|
@@ -4,8 +4,8 @@ import logging
|
|
|
4
4
|
import os
|
|
5
5
|
import re
|
|
6
6
|
from collections import defaultdict
|
|
7
|
-
from datetime import date, datetime, time
|
|
8
|
-
from typing import TYPE_CHECKING, Any
|
|
7
|
+
from datetime import UTC, date, datetime, time
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
9
|
|
|
10
10
|
from botocore.exceptions import ClientError
|
|
11
11
|
from moto.ses import ses_backends
|
|
@@ -26,10 +26,13 @@ from localstack.aws.api.ses import (
|
|
|
26
26
|
DeleteConfigurationSetResponse,
|
|
27
27
|
DeleteTemplateResponse,
|
|
28
28
|
Destination,
|
|
29
|
+
Enabled,
|
|
29
30
|
EventDestination,
|
|
30
31
|
EventDestinationDoesNotExistException,
|
|
31
32
|
EventDestinationName,
|
|
33
|
+
EventType,
|
|
32
34
|
GetIdentityVerificationAttributesResponse,
|
|
35
|
+
Identity,
|
|
33
36
|
IdentityList,
|
|
34
37
|
IdentityVerificationAttributes,
|
|
35
38
|
InvalidSNSDestinationException,
|
|
@@ -40,12 +43,14 @@ from localstack.aws.api.ses import (
|
|
|
40
43
|
MessageRejected,
|
|
41
44
|
MessageTagList,
|
|
42
45
|
NextToken,
|
|
46
|
+
NotificationType,
|
|
43
47
|
RawMessage,
|
|
44
48
|
ReceiptRuleSetName,
|
|
45
49
|
SendEmailResponse,
|
|
46
50
|
SendRawEmailResponse,
|
|
47
51
|
SendTemplatedEmailResponse,
|
|
48
52
|
SesApi,
|
|
53
|
+
SetIdentityHeadersInNotificationsEnabledResponse,
|
|
49
54
|
TemplateData,
|
|
50
55
|
TemplateName,
|
|
51
56
|
VerificationAttributes,
|
|
@@ -56,7 +61,7 @@ from localstack.constants import INTERNAL_AWS_SECRET_ACCESS_KEY
|
|
|
56
61
|
from localstack.http import Resource, Response
|
|
57
62
|
from localstack.services.moto import call_moto
|
|
58
63
|
from localstack.services.plugins import ServiceLifecycleHook
|
|
59
|
-
from localstack.services.ses.models import SentEmail, SentEmailBody
|
|
64
|
+
from localstack.services.ses.models import EmailType, SentEmail, SentEmailBody
|
|
60
65
|
from localstack.utils.aws import arns
|
|
61
66
|
from localstack.utils.files import mkdir
|
|
62
67
|
from localstack.utils.strings import long_uid, to_str
|
|
@@ -69,7 +74,7 @@ LOGGER = logging.getLogger(__name__)
|
|
|
69
74
|
|
|
70
75
|
# Keep record of all sent emails
|
|
71
76
|
# These can be retrieved via a service endpoint
|
|
72
|
-
EMAILS:
|
|
77
|
+
EMAILS: dict[MessageId, dict[str, Any]] = {}
|
|
73
78
|
|
|
74
79
|
# Endpoint to access all the sent emails
|
|
75
80
|
# (relative to LocalStack internal HTTP resources base endpoint)
|
|
@@ -112,7 +117,7 @@ def save_for_retrospection(sent_email: SentEmail):
|
|
|
112
117
|
LOGGER.debug("Email saved at: %s", path)
|
|
113
118
|
|
|
114
119
|
|
|
115
|
-
def recipients_from_destination(destination: Destination) ->
|
|
120
|
+
def recipients_from_destination(destination: Destination) -> list[str]:
|
|
116
121
|
"""Get list of recipient email addresses from a Destination object."""
|
|
117
122
|
return (
|
|
118
123
|
destination.get("ToAddresses", [])
|
|
@@ -177,6 +182,8 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
177
182
|
#
|
|
178
183
|
|
|
179
184
|
def on_after_init(self):
|
|
185
|
+
self._apply_patches()
|
|
186
|
+
|
|
180
187
|
# Allow sent emails to be retrieved from the SES emails endpoint
|
|
181
188
|
register_ses_api_resource()
|
|
182
189
|
|
|
@@ -184,7 +191,7 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
184
191
|
# Helpers
|
|
185
192
|
#
|
|
186
193
|
|
|
187
|
-
def get_source_from_raw(self, raw_data: str) ->
|
|
194
|
+
def get_source_from_raw(self, raw_data: str) -> str | None:
|
|
188
195
|
"""Given a raw representation of email, return the source/from field."""
|
|
189
196
|
entities = raw_data.split("\n")
|
|
190
197
|
for entity in entities:
|
|
@@ -192,6 +199,12 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
192
199
|
return entity.replace("From:", "").strip()
|
|
193
200
|
return None
|
|
194
201
|
|
|
202
|
+
def _apply_patches(self) -> None:
|
|
203
|
+
# Suppress Moto's validation of receipt rule actions. These validations use Moto's implementation of S3, Lambda
|
|
204
|
+
# and SQS, which fail because these services have been internalised in LocalStack.
|
|
205
|
+
# Besides, AWS does not run the same validations as evidenced by our AWS-validated tests.
|
|
206
|
+
SESBackend._validate_receipt_rule_actions = lambda *_: None
|
|
207
|
+
|
|
195
208
|
#
|
|
196
209
|
# Implementations for SES operations
|
|
197
210
|
#
|
|
@@ -210,7 +223,9 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
210
223
|
emitter = SNSEmitter(context)
|
|
211
224
|
emitter.emit_create_configuration_set_event_destination_test_message(sns_topic_arn)
|
|
212
225
|
|
|
213
|
-
#
|
|
226
|
+
# FIXME: Moto stores the Event Destinations as a single value when it should be a list
|
|
227
|
+
# it only considers the last Event Destination created, when AWS is able to store multiple configurations
|
|
228
|
+
# only register the event destination if emitting the message worked
|
|
214
229
|
try:
|
|
215
230
|
result = call_moto(context)
|
|
216
231
|
except CommonServiceException as e:
|
|
@@ -269,6 +284,9 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
269
284
|
# FIXME: inconsistent state
|
|
270
285
|
LOGGER.warning("inconsistent state encountered in ses backend")
|
|
271
286
|
|
|
287
|
+
# FIXME: Moto stores the Event Destinations as a single value when it should be a list
|
|
288
|
+
# it only considers the last Event Destination created, when AWS is able to store multiple configurations
|
|
289
|
+
# don't pop the whole value which should be a list but is currently a dict
|
|
272
290
|
backend.config_set_event_destination.pop(configuration_set_name)
|
|
273
291
|
|
|
274
292
|
return DeleteConfigurationSetEventDestinationResponse()
|
|
@@ -358,25 +376,21 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
358
376
|
response = call_moto(context)
|
|
359
377
|
|
|
360
378
|
backend = get_ses_backend(context)
|
|
361
|
-
emitter = SNSEmitter(context)
|
|
362
|
-
recipients = recipients_from_destination(destination)
|
|
363
|
-
|
|
364
|
-
for event_destination in backend.config_set_event_destination.values():
|
|
365
|
-
if not event_destination["Enabled"]:
|
|
366
|
-
continue
|
|
367
|
-
|
|
368
|
-
sns_destination_arn = event_destination.get("SNSDestination")
|
|
369
|
-
if not sns_destination_arn:
|
|
370
|
-
continue
|
|
371
379
|
|
|
372
|
-
|
|
380
|
+
if event_destinations := backend.config_set_event_destination.get(configuration_set_name):
|
|
381
|
+
recipients = recipients_from_destination(destination)
|
|
382
|
+
payload = EventDestinationPayload(
|
|
373
383
|
message_id=response["MessageId"],
|
|
374
384
|
sender_email=source,
|
|
375
385
|
destination_addresses=recipients,
|
|
376
386
|
tags=tags,
|
|
377
387
|
)
|
|
378
|
-
|
|
379
|
-
|
|
388
|
+
notify_event_destinations(
|
|
389
|
+
context=context,
|
|
390
|
+
event_destinations=event_destinations,
|
|
391
|
+
payload=payload,
|
|
392
|
+
email_type=EmailType.EMAIL,
|
|
393
|
+
)
|
|
380
394
|
|
|
381
395
|
text_part = message["Body"].get("Text", {}).get("Data")
|
|
382
396
|
html_part = message["Body"].get("Html", {}).get("Data")
|
|
@@ -414,25 +428,21 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
414
428
|
response = call_moto(context)
|
|
415
429
|
|
|
416
430
|
backend = get_ses_backend(context)
|
|
417
|
-
emitter = SNSEmitter(context)
|
|
418
|
-
recipients = recipients_from_destination(destination)
|
|
419
|
-
|
|
420
|
-
for event_destination in backend.config_set_event_destination.values():
|
|
421
|
-
if not event_destination["Enabled"]:
|
|
422
|
-
continue
|
|
423
|
-
|
|
424
|
-
sns_destination_arn = event_destination.get("SNSDestination")
|
|
425
|
-
if not sns_destination_arn:
|
|
426
|
-
continue
|
|
427
431
|
|
|
428
|
-
|
|
432
|
+
if event_destinations := backend.config_set_event_destination.get(configuration_set_name):
|
|
433
|
+
recipients = recipients_from_destination(destination)
|
|
434
|
+
payload = EventDestinationPayload(
|
|
429
435
|
message_id=response["MessageId"],
|
|
430
436
|
sender_email=source,
|
|
431
437
|
destination_addresses=recipients,
|
|
432
438
|
tags=tags,
|
|
433
439
|
)
|
|
434
|
-
|
|
435
|
-
|
|
440
|
+
notify_event_destinations(
|
|
441
|
+
context=context,
|
|
442
|
+
event_destinations=event_destinations,
|
|
443
|
+
payload=payload,
|
|
444
|
+
email_type=EmailType.TEMPLATED,
|
|
445
|
+
)
|
|
436
446
|
|
|
437
447
|
save_for_retrospection(
|
|
438
448
|
SentEmail(
|
|
@@ -477,23 +487,19 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
477
487
|
backend = get_ses_backend(context)
|
|
478
488
|
message = backend.send_raw_email(source, destinations, raw_data)
|
|
479
489
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
if not event_destination["Enabled"]:
|
|
483
|
-
continue
|
|
484
|
-
|
|
485
|
-
sns_destination_arn = event_destination.get("SNSDestination")
|
|
486
|
-
if not sns_destination_arn:
|
|
487
|
-
continue
|
|
488
|
-
|
|
489
|
-
payload = SNSPayload(
|
|
490
|
+
if event_destinations := backend.config_set_event_destination.get(configuration_set_name):
|
|
491
|
+
payload = EventDestinationPayload(
|
|
490
492
|
message_id=message.id,
|
|
491
493
|
sender_email=source,
|
|
492
494
|
destination_addresses=destinations,
|
|
493
495
|
tags=tags,
|
|
494
496
|
)
|
|
495
|
-
|
|
496
|
-
|
|
497
|
+
notify_event_destinations(
|
|
498
|
+
context=context,
|
|
499
|
+
event_destinations=event_destinations,
|
|
500
|
+
payload=payload,
|
|
501
|
+
email_type=EmailType.RAW,
|
|
502
|
+
)
|
|
497
503
|
|
|
498
504
|
save_for_retrospection(
|
|
499
505
|
SentEmail(
|
|
@@ -519,18 +525,56 @@ class SesProvider(SesApi, ServiceLifecycleHook):
|
|
|
519
525
|
backend.create_receipt_rule_set(rule_set_name)
|
|
520
526
|
original_rule_set = backend.describe_receipt_rule_set(original_rule_set_name)
|
|
521
527
|
|
|
522
|
-
|
|
523
|
-
|
|
528
|
+
after = None
|
|
529
|
+
for rule in original_rule_set.rules:
|
|
530
|
+
backend.create_receipt_rule(rule_set_name, rule, after)
|
|
531
|
+
after = rule["Name"]
|
|
524
532
|
|
|
525
533
|
return CloneReceiptRuleSetResponse()
|
|
526
534
|
|
|
535
|
+
@handler("SetIdentityHeadersInNotificationsEnabled")
|
|
536
|
+
def set_identity_headers_in_notifications_enabled(
|
|
537
|
+
self,
|
|
538
|
+
context: RequestContext,
|
|
539
|
+
identity: Identity,
|
|
540
|
+
notification_type: NotificationType,
|
|
541
|
+
enabled: Enabled,
|
|
542
|
+
**kwargs,
|
|
543
|
+
) -> SetIdentityHeadersInNotificationsEnabledResponse:
|
|
544
|
+
"""
|
|
545
|
+
Sets whether Amazon SES includes the original email headers in the Amazon SNS notifications
|
|
546
|
+
for a specified identity and notification type.
|
|
547
|
+
"""
|
|
548
|
+
# Validate notification_type
|
|
549
|
+
if notification_type not in (
|
|
550
|
+
NotificationType.Bounce,
|
|
551
|
+
NotificationType.Complaint,
|
|
552
|
+
NotificationType.Delivery,
|
|
553
|
+
):
|
|
554
|
+
raise InvalidParameterValue(
|
|
555
|
+
f"Invalid notification type: {notification_type}. "
|
|
556
|
+
"Valid values are: Bounce, Complaint, Delivery."
|
|
557
|
+
)
|
|
558
|
+
|
|
559
|
+
backend = get_ses_backend(context)
|
|
560
|
+
if identity not in backend.email_identities:
|
|
561
|
+
raise MessageRejected(f"Identity {identity} is not verified or does not exist.")
|
|
562
|
+
|
|
563
|
+
# Store the setting in the backend
|
|
564
|
+
if not hasattr(backend, "identity_headers_in_notifications_enabled"):
|
|
565
|
+
backend.identity_headers_in_notifications_enabled = {}
|
|
566
|
+
backend.identity_headers_in_notifications_enabled.setdefault(identity, {})[
|
|
567
|
+
notification_type
|
|
568
|
+
] = enabled
|
|
569
|
+
return SetIdentityHeadersInNotificationsEnabledResponse()
|
|
570
|
+
|
|
527
571
|
|
|
528
572
|
@dataclasses.dataclass(frozen=True)
|
|
529
|
-
class
|
|
573
|
+
class EventDestinationPayload:
|
|
530
574
|
message_id: str
|
|
531
575
|
sender_email: Address
|
|
532
576
|
destination_addresses: AddressList
|
|
533
|
-
tags:
|
|
577
|
+
tags: MessageTagList | None
|
|
534
578
|
|
|
535
579
|
|
|
536
580
|
class SNSEmitter:
|
|
@@ -558,9 +602,9 @@ class SNSEmitter:
|
|
|
558
602
|
)
|
|
559
603
|
|
|
560
604
|
def emit_send_event(
|
|
561
|
-
self, payload:
|
|
605
|
+
self, payload: EventDestinationPayload, sns_topic_arn: str, emit_source_arn: bool = True
|
|
562
606
|
):
|
|
563
|
-
now = datetime.now(tz=
|
|
607
|
+
now = datetime.now(tz=UTC)
|
|
564
608
|
|
|
565
609
|
tags = defaultdict(list)
|
|
566
610
|
for every in payload.tags or []:
|
|
@@ -592,10 +636,10 @@ class SNSEmitter:
|
|
|
592
636
|
Subject="Amazon SES Email Event Notification",
|
|
593
637
|
)
|
|
594
638
|
except ClientError:
|
|
595
|
-
LOGGER.
|
|
639
|
+
LOGGER.error("sending SNS message", exc_info=LOGGER.isEnabledFor(logging.DEBUG))
|
|
596
640
|
|
|
597
|
-
def emit_delivery_event(self, payload:
|
|
598
|
-
now = datetime.now(tz=
|
|
641
|
+
def emit_delivery_event(self, payload: EventDestinationPayload, sns_topic_arn: str):
|
|
642
|
+
now = datetime.now(tz=UTC)
|
|
599
643
|
|
|
600
644
|
tags = defaultdict(list)
|
|
601
645
|
for every in payload.tags or []:
|
|
@@ -625,7 +669,7 @@ class SNSEmitter:
|
|
|
625
669
|
Subject="Amazon SES Email Event Notification",
|
|
626
670
|
)
|
|
627
671
|
except ClientError:
|
|
628
|
-
LOGGER.
|
|
672
|
+
LOGGER.error("sending SNS message", exc_info=LOGGER.isEnabledFor(logging.DEBUG))
|
|
629
673
|
|
|
630
674
|
@staticmethod
|
|
631
675
|
def _client_for_topic(topic_arn: str) -> "SNSClient":
|
|
@@ -640,6 +684,35 @@ class SNSEmitter:
|
|
|
640
684
|
).sns
|
|
641
685
|
|
|
642
686
|
|
|
687
|
+
def notify_event_destinations(
|
|
688
|
+
context: RequestContext,
|
|
689
|
+
# FIXME: Moto stores the Event Destinations as a single value when it should be a list
|
|
690
|
+
event_destinations: EventDestination | list[EventDestination],
|
|
691
|
+
payload: EventDestinationPayload,
|
|
692
|
+
email_type: EmailType,
|
|
693
|
+
):
|
|
694
|
+
emitter = SNSEmitter(context)
|
|
695
|
+
|
|
696
|
+
if not isinstance(event_destinations, list):
|
|
697
|
+
event_destinations = [event_destinations]
|
|
698
|
+
|
|
699
|
+
for event_destination in event_destinations:
|
|
700
|
+
if not event_destination["Enabled"]:
|
|
701
|
+
continue
|
|
702
|
+
|
|
703
|
+
sns_destination_arn = event_destination.get("SNSDestination", {}).get("TopicARN")
|
|
704
|
+
if not sns_destination_arn:
|
|
705
|
+
continue
|
|
706
|
+
|
|
707
|
+
matching_event_types = event_destination.get("MatchingEventTypes") or []
|
|
708
|
+
if EventType.send in matching_event_types:
|
|
709
|
+
emitter.emit_send_event(
|
|
710
|
+
payload, sns_destination_arn, emit_source_arn=email_type != EmailType.TEMPLATED
|
|
711
|
+
)
|
|
712
|
+
if EventType.delivery in matching_event_types:
|
|
713
|
+
emitter.emit_delivery_event(payload, sns_destination_arn)
|
|
714
|
+
|
|
715
|
+
|
|
643
716
|
class InvalidParameterValue(CommonServiceException):
|
|
644
717
|
def __init__(self, message=None):
|
|
645
718
|
super().__init__(
|