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
localstack/utils/archives.py
CHANGED
|
@@ -8,7 +8,7 @@ import tempfile
|
|
|
8
8
|
import time
|
|
9
9
|
import zipfile
|
|
10
10
|
from subprocess import Popen
|
|
11
|
-
from typing import IO, Literal
|
|
11
|
+
from typing import IO, Literal
|
|
12
12
|
|
|
13
13
|
from localstack.constants import MAVEN_REPO_URL
|
|
14
14
|
from localstack.utils.files import load_file, mkdir, new_tmp_file, rm_rf, save_file
|
|
@@ -22,7 +22,7 @@ from .strings import truncate
|
|
|
22
22
|
LOG = logging.getLogger(__name__)
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
StrPath =
|
|
25
|
+
StrPath = str | os.PathLike
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def is_zip_file(content):
|
|
@@ -30,13 +30,13 @@ def is_zip_file(content):
|
|
|
30
30
|
return zipfile.is_zipfile(stream)
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
def get_unzipped_size(zip_file:
|
|
33
|
+
def get_unzipped_size(zip_file: str | IO[bytes]):
|
|
34
34
|
"""Returns the size of the unzipped file."""
|
|
35
35
|
with zipfile.ZipFile(zip_file, "r") as zip_ref:
|
|
36
36
|
return sum(f.file_size for f in zip_ref.infolist())
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
def unzip(path: str, target_dir: str, overwrite: bool = True) ->
|
|
39
|
+
def unzip(path: str, target_dir: str, overwrite: bool = True) -> str | Popen | None:
|
|
40
40
|
from localstack.utils.platform import is_debian
|
|
41
41
|
|
|
42
42
|
use_native_cmd = is_debian() or is_command_available("unzip")
|
|
@@ -99,7 +99,7 @@ def create_zip_file_python(
|
|
|
99
99
|
base_dir: StrPath,
|
|
100
100
|
zip_file: StrPath,
|
|
101
101
|
mode: Literal["r", "w", "x", "a"] = "w",
|
|
102
|
-
content_root:
|
|
102
|
+
content_root: str | None = None,
|
|
103
103
|
):
|
|
104
104
|
with zipfile.ZipFile(zip_file, mode) as zip_file:
|
|
105
105
|
for root, dirs, files in os.walk(base_dir):
|
|
@@ -122,7 +122,7 @@ def add_file_to_jar(class_file, class_url, target_jar, base_dir=None):
|
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
def update_jar_manifest(
|
|
125
|
-
jar_file_name: str, parent_dir: str, search:
|
|
125
|
+
jar_file_name: str, parent_dir: str, search: str | re.Pattern, replace: str
|
|
126
126
|
):
|
|
127
127
|
manifest_file_path = "META-INF/MANIFEST.MF"
|
|
128
128
|
jar_path = os.path.join(parent_dir, jar_file_name)
|
|
@@ -174,10 +174,10 @@ def upgrade_jar_file(base_dir: str, file_glob: str, maven_asset: str):
|
|
|
174
174
|
def download_and_extract(
|
|
175
175
|
archive_url: str,
|
|
176
176
|
target_dir: str,
|
|
177
|
-
retries:
|
|
178
|
-
sleep:
|
|
179
|
-
tmp_archive:
|
|
180
|
-
checksum_url:
|
|
177
|
+
retries: int | None = 0,
|
|
178
|
+
sleep: int | None = 3,
|
|
179
|
+
tmp_archive: str | None = None,
|
|
180
|
+
checksum_url: str | None = None,
|
|
181
181
|
) -> None:
|
|
182
182
|
"""
|
|
183
183
|
Download and extract an archive to a target directory with optional checksum verification.
|
|
@@ -233,7 +233,7 @@ def download_and_extract(
|
|
|
233
233
|
rm_rf(tmp_archive)
|
|
234
234
|
raise e
|
|
235
235
|
|
|
236
|
-
if ext
|
|
236
|
+
if ext in (".zip", ".whl"):
|
|
237
237
|
unzip(tmp_archive, target_dir)
|
|
238
238
|
elif ext in (
|
|
239
239
|
".bz2",
|
|
@@ -250,7 +250,7 @@ def download_and_extract_with_retry(
|
|
|
250
250
|
archive_url,
|
|
251
251
|
tmp_archive,
|
|
252
252
|
target_dir,
|
|
253
|
-
checksum_url:
|
|
253
|
+
checksum_url: str | None = None,
|
|
254
254
|
):
|
|
255
255
|
try:
|
|
256
256
|
download_and_extract(
|
localstack/utils/asyncio.py
CHANGED
|
@@ -40,12 +40,12 @@ class AdaptiveThreadPool(DaemonAwareThreadPool):
|
|
|
40
40
|
|
|
41
41
|
def __init__(self, core_size=None):
|
|
42
42
|
self.core_size = core_size or self.DEFAULT_CORE_POOL_SIZE
|
|
43
|
-
super(
|
|
43
|
+
super().__init__(max_workers=self.core_size)
|
|
44
44
|
|
|
45
45
|
def submit(self, fn, *args, **kwargs):
|
|
46
46
|
# if idle threads are available, don't spin new threads
|
|
47
47
|
if self.has_idle_threads():
|
|
48
|
-
return super(
|
|
48
|
+
return super().submit(fn, *args, **kwargs)
|
|
49
49
|
|
|
50
50
|
def _run(*tmpargs):
|
|
51
51
|
return fn(*args, **kwargs)
|
localstack/utils/aws/arns.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import re
|
|
3
3
|
from functools import cache
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import TypedDict
|
|
5
5
|
|
|
6
6
|
from botocore.utils import ArnParser, InvalidArnException
|
|
7
7
|
|
|
@@ -27,7 +27,7 @@ PARTITION_NAMES = list(REGION_PREFIX_TO_PARTITION.values()) + [DEFAULT_PARTITION
|
|
|
27
27
|
ARN_PARTITION_REGEX = r"^arn:(" + "|".join(sorted(PARTITION_NAMES)) + ")"
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def get_partition(region:
|
|
30
|
+
def get_partition(region: str | None) -> str:
|
|
31
31
|
if not region:
|
|
32
32
|
return DEFAULT_PARTITION
|
|
33
33
|
if region in PARTITION_NAMES:
|
|
@@ -65,28 +65,28 @@ def parse_arn(arn: str) -> ArnData:
|
|
|
65
65
|
return _arn_parser.parse_arn(arn)
|
|
66
66
|
|
|
67
67
|
|
|
68
|
-
def extract_account_id_from_arn(arn: str) ->
|
|
68
|
+
def extract_account_id_from_arn(arn: str) -> str | None:
|
|
69
69
|
try:
|
|
70
70
|
return parse_arn(arn).get("account")
|
|
71
71
|
except InvalidArnException:
|
|
72
72
|
return None
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
def extract_region_from_arn(arn: str) ->
|
|
75
|
+
def extract_region_from_arn(arn: str) -> str | None:
|
|
76
76
|
try:
|
|
77
77
|
return parse_arn(arn).get("region")
|
|
78
78
|
except InvalidArnException:
|
|
79
79
|
return None
|
|
80
80
|
|
|
81
81
|
|
|
82
|
-
def extract_service_from_arn(arn: str) ->
|
|
82
|
+
def extract_service_from_arn(arn: str) -> str | None:
|
|
83
83
|
try:
|
|
84
84
|
return parse_arn(arn).get("service")
|
|
85
85
|
except InvalidArnException:
|
|
86
86
|
return None
|
|
87
87
|
|
|
88
88
|
|
|
89
|
-
def extract_resource_from_arn(arn: str) ->
|
|
89
|
+
def extract_resource_from_arn(arn: str) -> str | None:
|
|
90
90
|
try:
|
|
91
91
|
return parse_arn(arn).get("resource")
|
|
92
92
|
except InvalidArnException:
|
|
@@ -98,8 +98,10 @@ def extract_resource_from_arn(arn: str) -> Optional[str]:
|
|
|
98
98
|
#
|
|
99
99
|
|
|
100
100
|
|
|
101
|
-
def _resource_arn(
|
|
102
|
-
|
|
101
|
+
def _resource_arn(
|
|
102
|
+
name: str, pattern: str, account_id: str, region_name: str, allow_colons=False
|
|
103
|
+
) -> str:
|
|
104
|
+
if ":" in name and not allow_colons:
|
|
103
105
|
return name
|
|
104
106
|
if len(pattern.split("%s")) == 4:
|
|
105
107
|
return pattern % (get_partition(region_name), account_id, name)
|
|
@@ -120,7 +122,7 @@ def iam_role_arn(role_name: str, account_id: str, region_name: str) -> str:
|
|
|
120
122
|
return role_name
|
|
121
123
|
if re.match(f"{ARN_PARTITION_REGEX}:iam::", role_name):
|
|
122
124
|
return role_name
|
|
123
|
-
return "arn
|
|
125
|
+
return f"arn:{get_partition(region_name)}:iam::{account_id}:role/{role_name}"
|
|
124
126
|
|
|
125
127
|
|
|
126
128
|
def iam_resource_arn(resource: str, account_id: str, role: str = None) -> str:
|
|
@@ -155,14 +157,14 @@ def secretsmanager_secret_arn(
|
|
|
155
157
|
def cloudformation_stack_arn(
|
|
156
158
|
stack_name: str, stack_id: str, account_id: str, region_name: str
|
|
157
159
|
) -> str:
|
|
158
|
-
pattern = "arn:%s:cloudformation:%s:%s:stack/%s/{stack_id}"
|
|
160
|
+
pattern = f"arn:%s:cloudformation:%s:%s:stack/%s/{stack_id}"
|
|
159
161
|
return _resource_arn(stack_name, pattern, account_id=account_id, region_name=region_name)
|
|
160
162
|
|
|
161
163
|
|
|
162
164
|
def cloudformation_change_set_arn(
|
|
163
165
|
change_set_name: str, change_set_id: str, account_id: str, region_name: str
|
|
164
166
|
) -> str:
|
|
165
|
-
pattern = "arn:%s:cloudformation:%s:%s:changeSet/%s/{
|
|
167
|
+
pattern = f"arn:%s:cloudformation:%s:%s:changeSet/%s/{change_set_id}"
|
|
166
168
|
return _resource_arn(change_set_name, pattern, account_id=account_id, region_name=region_name)
|
|
167
169
|
|
|
168
170
|
|
|
@@ -180,13 +182,7 @@ def dynamodb_table_arn(table_name: str, account_id: str, region_name: str) -> st
|
|
|
180
182
|
def dynamodb_stream_arn(
|
|
181
183
|
table_name: str, latest_stream_label: str, account_id: str, region_name: str
|
|
182
184
|
) -> str:
|
|
183
|
-
return "arn
|
|
184
|
-
get_partition(region_name),
|
|
185
|
-
region_name,
|
|
186
|
-
account_id,
|
|
187
|
-
table_name,
|
|
188
|
-
latest_stream_label,
|
|
189
|
-
)
|
|
185
|
+
return f"arn:{get_partition(region_name)}:dynamodb:{region_name}:{account_id}:table/{table_name}/stream/{latest_stream_label}"
|
|
190
186
|
|
|
191
187
|
|
|
192
188
|
#
|
|
@@ -291,7 +287,7 @@ def lambda_event_source_mapping_arn(uuid: str, account_id: str, region_name: str
|
|
|
291
287
|
def lambda_function_or_layer_arn(
|
|
292
288
|
type: str,
|
|
293
289
|
entity_name: str,
|
|
294
|
-
version:
|
|
290
|
+
version: str | None,
|
|
295
291
|
account_id: str,
|
|
296
292
|
region_name: str,
|
|
297
293
|
) -> str:
|
|
@@ -453,7 +449,7 @@ def s3_bucket_arn(bucket_name_or_arn: str, region="us-east-1") -> str:
|
|
|
453
449
|
|
|
454
450
|
def sqs_queue_arn(queue_name: str, account_id: str, region_name: str) -> str:
|
|
455
451
|
queue_name = queue_name.split("/")[-1]
|
|
456
|
-
return "arn
|
|
452
|
+
return f"arn:{get_partition(region_name)}:sqs:{region_name}:{account_id}:{queue_name}"
|
|
457
453
|
|
|
458
454
|
|
|
459
455
|
#
|
|
@@ -462,20 +458,13 @@ def sqs_queue_arn(queue_name: str, account_id: str, region_name: str) -> str:
|
|
|
462
458
|
|
|
463
459
|
|
|
464
460
|
def apigateway_restapi_arn(api_id: str, account_id: str, region_name: str) -> str:
|
|
465
|
-
return
|
|
466
|
-
get_partition(region_name)
|
|
467
|
-
region_name,
|
|
468
|
-
account_id,
|
|
469
|
-
api_id,
|
|
461
|
+
return (
|
|
462
|
+
f"arn:{get_partition(region_name)}:apigateway:{region_name}:{account_id}:/restapis/{api_id}"
|
|
470
463
|
)
|
|
471
464
|
|
|
472
465
|
|
|
473
466
|
def apigateway_invocations_arn(lambda_uri: str, region_name: str) -> str:
|
|
474
|
-
return "arn
|
|
475
|
-
get_partition(region_name),
|
|
476
|
-
region_name,
|
|
477
|
-
lambda_uri,
|
|
478
|
-
)
|
|
467
|
+
return f"arn:{get_partition(region_name)}:apigateway:{region_name}:lambda:path/2015-03-31/functions/{lambda_uri}/invocations"
|
|
479
468
|
|
|
480
469
|
|
|
481
470
|
#
|
|
@@ -487,6 +476,12 @@ def sns_topic_arn(topic_name: str, account_id: str, region_name: str) -> str:
|
|
|
487
476
|
return f"arn:{get_partition(region_name)}:sns:{region_name}:{account_id}:{topic_name}"
|
|
488
477
|
|
|
489
478
|
|
|
479
|
+
def sns_platform_application_arn(
|
|
480
|
+
platform_application_name: str, platform: str, account_id: str, region_name: str
|
|
481
|
+
) -> str:
|
|
482
|
+
return f"arn:{get_partition(region_name)}:sns:{region_name}:{account_id}:app/{platform}/{platform_application_name}"
|
|
483
|
+
|
|
484
|
+
|
|
490
485
|
#
|
|
491
486
|
# ECR
|
|
492
487
|
#
|
|
@@ -555,7 +550,7 @@ def lambda_function_name(name_or_arn: str) -> str:
|
|
|
555
550
|
if ":" in name_or_arn:
|
|
556
551
|
arn = parse_arn(name_or_arn)
|
|
557
552
|
if arn["service"] != "lambda":
|
|
558
|
-
raise ValueError("arn is not a lambda arn
|
|
553
|
+
raise ValueError(f"arn is not a lambda arn {name_or_arn}")
|
|
559
554
|
|
|
560
555
|
return parse_arn(name_or_arn)["resource"].split(":")[1]
|
|
561
556
|
else:
|
|
@@ -3,7 +3,7 @@ import datetime
|
|
|
3
3
|
import json
|
|
4
4
|
import re
|
|
5
5
|
from binascii import crc32
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
from urllib.parse import parse_qs
|
|
8
8
|
|
|
9
9
|
import xmltodict
|
|
@@ -36,21 +36,19 @@ def requests_error_response_json(message, code=500, error_type="InternalFailure"
|
|
|
36
36
|
|
|
37
37
|
def requests_error_response_xml(
|
|
38
38
|
message: str,
|
|
39
|
-
code:
|
|
40
|
-
code_string:
|
|
41
|
-
service:
|
|
42
|
-
xmlns:
|
|
39
|
+
code: int | None = 400,
|
|
40
|
+
code_string: str | None = "InvalidParameter",
|
|
41
|
+
service: str | None = None,
|
|
42
|
+
xmlns: str | None = None,
|
|
43
43
|
):
|
|
44
44
|
response = RequestsResponse()
|
|
45
|
-
xmlns = xmlns or "http
|
|
46
|
-
response._content = """<ErrorResponse xmlns="{xmlns}"><Error>
|
|
45
|
+
xmlns = xmlns or f"http://{service}.amazonaws.com/doc/2010-03-31/"
|
|
46
|
+
response._content = f"""<ErrorResponse xmlns="{xmlns}"><Error>
|
|
47
47
|
<Type>Sender</Type>
|
|
48
48
|
<Code>{code_string}</Code>
|
|
49
49
|
<Message>{message}</Message>
|
|
50
|
-
</Error><RequestId>{
|
|
51
|
-
</ErrorResponse>"""
|
|
52
|
-
xmlns=xmlns, message=message, code_string=code_string, req_id=short_uid()
|
|
53
|
-
)
|
|
50
|
+
</Error><RequestId>{short_uid()}</RequestId>
|
|
51
|
+
</ErrorResponse>"""
|
|
54
52
|
response.status_code = code
|
|
55
53
|
return response
|
|
56
54
|
|
|
@@ -65,18 +63,13 @@ def requests_error_response_xml_signature_calculation(
|
|
|
65
63
|
aws_access_token="temp",
|
|
66
64
|
):
|
|
67
65
|
response = RequestsResponse()
|
|
68
|
-
response_template = """<?xml version="1.0" encoding="UTF-8"?>
|
|
66
|
+
response_template = f"""<?xml version="1.0" encoding="UTF-8"?>
|
|
69
67
|
<Error>
|
|
70
68
|
<Code>{code_string}</Code>
|
|
71
69
|
<Message>{message}</Message>
|
|
72
|
-
<RequestId>{
|
|
73
|
-
<HostId>{
|
|
74
|
-
</Error>"""
|
|
75
|
-
message=message,
|
|
76
|
-
code_string=code_string,
|
|
77
|
-
req_id=short_uid(),
|
|
78
|
-
host_id=short_uid(),
|
|
79
|
-
)
|
|
70
|
+
<RequestId>{short_uid()}</RequestId>
|
|
71
|
+
<HostId>{short_uid()}</HostId>
|
|
72
|
+
</Error>"""
|
|
80
73
|
|
|
81
74
|
parsed_response = xmltodict.parse(response_template)
|
|
82
75
|
response.status_code = code
|
|
@@ -94,8 +87,8 @@ def requests_error_response_xml_signature_calculation(
|
|
|
94
87
|
server_time = datetime.datetime.utcnow().isoformat()[:-4]
|
|
95
88
|
expires_isoformat = datetime.datetime.fromtimestamp(int(expires)).isoformat()[:-4]
|
|
96
89
|
parsed_response["Error"]["Code"] = code_string
|
|
97
|
-
parsed_response["Error"]["Expires"] = "{}Z"
|
|
98
|
-
parsed_response["Error"]["ServerTime"] = "{}Z"
|
|
90
|
+
parsed_response["Error"]["Expires"] = f"{expires_isoformat}Z"
|
|
91
|
+
parsed_response["Error"]["ServerTime"] = f"{server_time}Z"
|
|
99
92
|
set_response_content(response, xmltodict.unparse(parsed_response))
|
|
100
93
|
|
|
101
94
|
if not signature and not expires and code_string == "AccessDenied":
|
|
@@ -106,8 +99,8 @@ def requests_error_response_xml_signature_calculation(
|
|
|
106
99
|
|
|
107
100
|
|
|
108
101
|
def requests_error_response(
|
|
109
|
-
req_headers:
|
|
110
|
-
message:
|
|
102
|
+
req_headers: dict,
|
|
103
|
+
message: str | bytes,
|
|
111
104
|
code: int = 500,
|
|
112
105
|
error_type: str = "InternalFailure",
|
|
113
106
|
service: str = None,
|
|
@@ -121,7 +114,7 @@ def requests_error_response(
|
|
|
121
114
|
)
|
|
122
115
|
|
|
123
116
|
|
|
124
|
-
def is_json_request(req_headers:
|
|
117
|
+
def is_json_request(req_headers: dict) -> bool:
|
|
125
118
|
ctype = req_headers.get("Content-Type", "")
|
|
126
119
|
accept = req_headers.get("Accept", "")
|
|
127
120
|
return "json" in ctype or "json" in accept
|
|
@@ -186,7 +179,7 @@ def set_response_content(response, content, headers=None):
|
|
|
186
179
|
response.headers["Content-Length"] = str(len(response._content))
|
|
187
180
|
|
|
188
181
|
|
|
189
|
-
def create_sqs_system_attributes(headers:
|
|
182
|
+
def create_sqs_system_attributes(headers: dict[str, str]) -> dict[str, Any]:
|
|
190
183
|
system_attributes = {}
|
|
191
184
|
if "X-Amzn-Trace-Id" in headers:
|
|
192
185
|
system_attributes["AWSTraceHeader"] = {
|
|
@@ -196,7 +189,7 @@ def create_sqs_system_attributes(headers: Dict[str, str]) -> Dict[str, Any]:
|
|
|
196
189
|
return system_attributes
|
|
197
190
|
|
|
198
191
|
|
|
199
|
-
def parse_query_string(url_or_qs: str, multi_values=False) ->
|
|
192
|
+
def parse_query_string(url_or_qs: str, multi_values=False) -> dict[str, str]:
|
|
200
193
|
url_or_qs = str(url_or_qs or "").strip()
|
|
201
194
|
# we match if the `url_or_qs` passed is maybe a URL
|
|
202
195
|
if regex_url_start.match(url_or_qs) and "?" not in url_or_qs:
|
|
@@ -208,7 +201,7 @@ def parse_query_string(url_or_qs: str, multi_values=False) -> Dict[str, str]:
|
|
|
208
201
|
return result
|
|
209
202
|
|
|
210
203
|
|
|
211
|
-
def calculate_crc32(content:
|
|
204
|
+
def calculate_crc32(content: str | bytes) -> int:
|
|
212
205
|
return crc32(to_bytes(content)) & 0xFFFFFFFF
|
|
213
206
|
|
|
214
207
|
|
|
@@ -2,7 +2,6 @@ import logging
|
|
|
2
2
|
import re
|
|
3
3
|
import socket
|
|
4
4
|
from functools import lru_cache
|
|
5
|
-
from typing import List, Union
|
|
6
5
|
|
|
7
6
|
import boto3
|
|
8
7
|
|
|
@@ -20,7 +19,7 @@ LOG = logging.getLogger(__name__)
|
|
|
20
19
|
CACHE_S3_HOSTNAME_DNS_STATUS = None
|
|
21
20
|
|
|
22
21
|
|
|
23
|
-
@lru_cache
|
|
22
|
+
@lru_cache
|
|
24
23
|
def get_valid_regions():
|
|
25
24
|
session = boto3.Session()
|
|
26
25
|
valid_regions = set()
|
|
@@ -32,7 +31,7 @@ def get_valid_regions():
|
|
|
32
31
|
|
|
33
32
|
# FIXME: AWS recommends use of SSM parameter store to determine per region availability
|
|
34
33
|
# https://github.com/aws/aws-sdk/issues/206#issuecomment-1471354853
|
|
35
|
-
@lru_cache
|
|
34
|
+
@lru_cache
|
|
36
35
|
def get_valid_regions_for_service(service_name):
|
|
37
36
|
session = boto3.Session()
|
|
38
37
|
regions = list(session.get_available_regions(service_name))
|
|
@@ -46,7 +45,7 @@ def get_boto3_region() -> str:
|
|
|
46
45
|
return boto3.session.Session().region_name
|
|
47
46
|
|
|
48
47
|
|
|
49
|
-
def get_local_service_url(service_name_or_port:
|
|
48
|
+
def get_local_service_url(service_name_or_port: str | int) -> str:
|
|
50
49
|
"""Return the local service URL for the given service name or port."""
|
|
51
50
|
# TODO(srw): we don't need to differentiate on service name any more, so remove the argument
|
|
52
51
|
if isinstance(service_name_or_port, int):
|
|
@@ -60,7 +59,7 @@ def get_s3_hostname():
|
|
|
60
59
|
try:
|
|
61
60
|
assert socket.gethostbyname(S3_VIRTUAL_HOSTNAME)
|
|
62
61
|
CACHE_S3_HOSTNAME_DNS_STATUS = True
|
|
63
|
-
except
|
|
62
|
+
except OSError:
|
|
64
63
|
CACHE_S3_HOSTNAME_DNS_STATUS = False
|
|
65
64
|
if CACHE_S3_HOSTNAME_DNS_STATUS:
|
|
66
65
|
return S3_VIRTUAL_HOSTNAME
|
|
@@ -68,7 +67,7 @@ def get_s3_hostname():
|
|
|
68
67
|
|
|
69
68
|
|
|
70
69
|
def fix_account_id_in_arns(
|
|
71
|
-
response, replacement: str, colon_delimiter: str = ":", existing:
|
|
70
|
+
response, replacement: str, colon_delimiter: str = ":", existing: str | list[str] = None
|
|
72
71
|
):
|
|
73
72
|
"""Fix the account ID in the ARNs returned in the given Flask response or string"""
|
|
74
73
|
from moto.core import DEFAULT_ACCOUNT_ID
|
|
@@ -78,13 +77,9 @@ def fix_account_id_in_arns(
|
|
|
78
77
|
is_str_obj = is_string_or_bytes(response)
|
|
79
78
|
content = to_str(response if is_str_obj else response._content)
|
|
80
79
|
|
|
81
|
-
replacement =
|
|
82
|
-
col=colon_delimiter, acc=replacement
|
|
83
|
-
)
|
|
80
|
+
replacement = rf"arn{colon_delimiter}aws{colon_delimiter}\1{colon_delimiter}\2{colon_delimiter}{replacement}{colon_delimiter}"
|
|
84
81
|
for acc_id in existing:
|
|
85
|
-
regex =
|
|
86
|
-
col=colon_delimiter, acc=acc_id
|
|
87
|
-
)
|
|
82
|
+
regex = rf"arn{colon_delimiter}aws{colon_delimiter}([^:%]+){colon_delimiter}([^:%]*){colon_delimiter}{acc_id}{colon_delimiter}"
|
|
88
83
|
content = re.sub(regex, replacement, content)
|
|
89
84
|
|
|
90
85
|
if not is_str_obj:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import uuid
|
|
4
|
-
from typing import Dict, List
|
|
5
4
|
|
|
6
5
|
from localstack.aws.connect import connect_to
|
|
7
6
|
from localstack.utils.aws import arns
|
|
@@ -34,7 +33,7 @@ def sns_error_to_dead_letter_queue(
|
|
|
34
33
|
return _send_to_dead_letter_queue(sns_subscriber["SubscriptionArn"], target_arn, event, error)
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event:
|
|
36
|
+
def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: dict, error, role: str = None):
|
|
38
37
|
if not dlq_arn:
|
|
39
38
|
return
|
|
40
39
|
LOG.info("Sending failed execution %s to dead letter queue %s", source_arn, dlq_arn)
|
|
@@ -60,11 +59,7 @@ def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: Dict, error
|
|
|
60
59
|
except Exception as e:
|
|
61
60
|
error = e
|
|
62
61
|
if error or not result_code or result_code >= 400:
|
|
63
|
-
msg = "Unable to send message to dead letter queue
|
|
64
|
-
queue_url,
|
|
65
|
-
result_code,
|
|
66
|
-
error,
|
|
67
|
-
)
|
|
62
|
+
msg = f"Unable to send message to dead letter queue {queue_url} (code {result_code}): {error}"
|
|
68
63
|
if "InvalidMessageContents" in str(error):
|
|
69
64
|
msg += f" - messages: {messages}"
|
|
70
65
|
LOG.info(msg)
|
|
@@ -84,7 +79,7 @@ def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: Dict, error
|
|
|
84
79
|
return dlq_arn
|
|
85
80
|
|
|
86
81
|
|
|
87
|
-
def _prepare_messages_to_dlq(source_arn: str, event:
|
|
82
|
+
def _prepare_messages_to_dlq(source_arn: str, event: dict, error) -> list[dict]:
|
|
88
83
|
messages = []
|
|
89
84
|
custom_attrs = {
|
|
90
85
|
"RequestID": {"DataType": "String", "StringValue": str(uuid.uuid4())},
|
|
@@ -136,7 +131,7 @@ def _prepare_messages_to_dlq(source_arn: str, event: Dict, error) -> List[Dict]:
|
|
|
136
131
|
return messages
|
|
137
132
|
|
|
138
133
|
|
|
139
|
-
def message_attributes_to_upper(message_attrs:
|
|
134
|
+
def message_attributes_to_upper(message_attrs: dict) -> dict:
|
|
140
135
|
"""Convert message attribute details (first characters) to upper case (e.g., StringValue, DataType)."""
|
|
141
136
|
message_attrs = message_attrs or {}
|
|
142
137
|
for _, attr in message_attrs.items():
|
|
@@ -3,7 +3,6 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
import re
|
|
5
5
|
import uuid
|
|
6
|
-
from typing import Dict, Optional
|
|
7
6
|
|
|
8
7
|
from moto.events.models import events_backends
|
|
9
8
|
|
|
@@ -31,10 +30,10 @@ AUTH_OAUTH = "OAUTH_CLIENT_CREDENTIALS"
|
|
|
31
30
|
# TODO: refactor/split this. too much here is service specific
|
|
32
31
|
def send_event_to_target(
|
|
33
32
|
target_arn: str,
|
|
34
|
-
event:
|
|
35
|
-
target_attributes:
|
|
33
|
+
event: dict,
|
|
34
|
+
target_attributes: dict = None,
|
|
36
35
|
asynchronous: bool = True,
|
|
37
|
-
target:
|
|
36
|
+
target: dict = None,
|
|
38
37
|
role: str = None,
|
|
39
38
|
source_arn: str = None,
|
|
40
39
|
source_service: str = None,
|
|
@@ -155,7 +154,7 @@ def send_event_to_target(
|
|
|
155
154
|
LOG.warning('Unsupported Events rule target ARN: "%s"', target_arn)
|
|
156
155
|
|
|
157
156
|
|
|
158
|
-
def auth_keys_from_connection(connection:
|
|
157
|
+
def auth_keys_from_connection(connection: dict):
|
|
159
158
|
headers = {}
|
|
160
159
|
|
|
161
160
|
auth_type = connection.get("AuthorizationType").upper()
|
|
@@ -164,9 +163,7 @@ def auth_keys_from_connection(connection: Dict):
|
|
|
164
163
|
basic_auth_parameters = auth_parameters.get("BasicAuthParameters", {})
|
|
165
164
|
username = basic_auth_parameters.get("Username", "")
|
|
166
165
|
password = basic_auth_parameters.get("Password", "")
|
|
167
|
-
auth = "Basic " + to_str(
|
|
168
|
-
base64.b64encode("{}:{}".format(username, password).encode("ascii"))
|
|
169
|
-
)
|
|
166
|
+
auth = "Basic " + to_str(base64.b64encode(f"{username}:{password}".encode("ascii")))
|
|
170
167
|
headers.update({"authorization": auth})
|
|
171
168
|
|
|
172
169
|
if auth_type == AUTH_API_KEY:
|
|
@@ -206,7 +203,7 @@ def auth_keys_from_connection(connection: Dict):
|
|
|
206
203
|
|
|
207
204
|
token_type = oauth_data.get("token_type", "")
|
|
208
205
|
access_token = oauth_data.get("access_token", "")
|
|
209
|
-
auth_header = "{} {}"
|
|
206
|
+
auth_header = f"{token_type} {access_token}"
|
|
210
207
|
headers.update({"authorization": auth_header})
|
|
211
208
|
|
|
212
209
|
return headers
|
|
@@ -216,7 +213,7 @@ def list_of_parameters_to_object(items):
|
|
|
216
213
|
return {item.get("Key"): item.get("Value") for item in items}
|
|
217
214
|
|
|
218
215
|
|
|
219
|
-
def send_event_to_api_destination(target_arn, event, http_parameters:
|
|
216
|
+
def send_event_to_api_destination(target_arn, event, http_parameters: dict | None = None):
|
|
220
217
|
"""Send an event to an EventBridge API destination
|
|
221
218
|
See https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-api-destinations.html"""
|
|
222
219
|
|
|
@@ -291,7 +288,7 @@ def add_api_destination_authorization(destination, headers, event):
|
|
|
291
288
|
return endpoint
|
|
292
289
|
|
|
293
290
|
|
|
294
|
-
def add_target_http_parameters(http_parameters:
|
|
291
|
+
def add_target_http_parameters(http_parameters: dict, endpoint: str, headers: dict, body):
|
|
295
292
|
endpoint = add_path_parameters_to_url(endpoint, http_parameters.get("PathParameterValues", []))
|
|
296
293
|
|
|
297
294
|
# The request should prioritze connection header/query parameters over target params if there is an overlap
|
|
@@ -4,7 +4,6 @@ This module has utilities relating to creating/parsing AWS requests.
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
|
-
from typing import Dict, Optional
|
|
8
7
|
|
|
9
8
|
from rolo import Request as RoloRequest
|
|
10
9
|
|
|
@@ -30,7 +29,7 @@ def get_account_id_from_request(request: RoloRequest) -> str:
|
|
|
30
29
|
return get_account_id_from_access_key_id(access_key_id)
|
|
31
30
|
|
|
32
31
|
|
|
33
|
-
def extract_region_from_auth_header(headers) ->
|
|
32
|
+
def extract_region_from_auth_header(headers) -> str | None:
|
|
34
33
|
auth = headers.get("Authorization") or ""
|
|
35
34
|
region = re.sub(r".*Credential=[^/]+/[^/]+/([^/]+)/.*", r"\1", auth)
|
|
36
35
|
if region == auth:
|
|
@@ -38,12 +37,12 @@ def extract_region_from_auth_header(headers) -> Optional[str]:
|
|
|
38
37
|
return region
|
|
39
38
|
|
|
40
39
|
|
|
41
|
-
def extract_account_id_from_auth_header(headers) ->
|
|
40
|
+
def extract_account_id_from_auth_header(headers) -> str | None:
|
|
42
41
|
if access_key_id := extract_access_key_id_from_auth_header(headers):
|
|
43
42
|
return get_account_id_from_access_key_id(access_key_id)
|
|
44
43
|
|
|
45
44
|
|
|
46
|
-
def extract_access_key_id_from_auth_header(headers:
|
|
45
|
+
def extract_access_key_id_from_auth_header(headers: dict[str, str]) -> str | None:
|
|
47
46
|
auth = headers.get("Authorization") or ""
|
|
48
47
|
|
|
49
48
|
if auth.startswith("AWS4-"):
|
|
@@ -67,7 +66,7 @@ def extract_region_from_headers(headers) -> str:
|
|
|
67
66
|
return extract_region_from_auth_header(headers) or AWS_REGION_US_EAST_1
|
|
68
67
|
|
|
69
68
|
|
|
70
|
-
def extract_service_name_from_auth_header(headers:
|
|
69
|
+
def extract_service_name_from_auth_header(headers: dict) -> str | None:
|
|
71
70
|
try:
|
|
72
71
|
auth_header = headers.get("authorization", "")
|
|
73
72
|
credential_scope = auth_header.split(",")[0].split()[1]
|
|
@@ -79,7 +78,7 @@ def extract_service_name_from_auth_header(headers: Dict) -> Optional[str]:
|
|
|
79
78
|
|
|
80
79
|
def mock_aws_request_headers(
|
|
81
80
|
service: str, aws_access_key_id: str, region_name: str, internal: bool = False
|
|
82
|
-
) ->
|
|
81
|
+
) -> dict[str, str]:
|
|
83
82
|
"""
|
|
84
83
|
Returns a mock set of headers that resemble SigV4 signing method.
|
|
85
84
|
"""
|
|
@@ -86,7 +86,7 @@ def create_api_gateway(
|
|
|
86
86
|
resources = resources or []
|
|
87
87
|
stage_name = stage_name or "testing"
|
|
88
88
|
usage_plan_name = usage_plan_name or "Basic Usage"
|
|
89
|
-
description = description or 'Test description for API "
|
|
89
|
+
description = description or f'Test description for API "{name}"'
|
|
90
90
|
|
|
91
91
|
LOG.info('Creating API resources under API Gateway "%s".', name)
|
|
92
92
|
api = client.create_rest_api(name=name, description=description)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import re
|
|
3
|
-
from typing import Any
|
|
3
|
+
from typing import Any
|
|
4
4
|
|
|
5
5
|
import airspeed
|
|
6
6
|
|
|
@@ -44,7 +44,7 @@ class VelocityUtil:
|
|
|
44
44
|
class VtlTemplate:
|
|
45
45
|
"""Utility class for rendering Velocity templates"""
|
|
46
46
|
|
|
47
|
-
def render_vtl(self, template: str, variables:
|
|
47
|
+
def render_vtl(self, template: str, variables: dict, as_json=False) -> str | dict:
|
|
48
48
|
"""
|
|
49
49
|
Render the given VTL template against the dict of variables. Note that this is a
|
|
50
50
|
potentially mutating operation which may change the values of `variables` in-place.
|
|
@@ -66,7 +66,7 @@ class VtlTemplate:
|
|
|
66
66
|
empty_placeholder = " __pLaCe-HoLdEr__ "
|
|
67
67
|
template = re.sub(
|
|
68
68
|
r"([^\s]+)#\$({)?(.*)",
|
|
69
|
-
|
|
69
|
+
rf"\1#{empty_placeholder}$\2\3",
|
|
70
70
|
template,
|
|
71
71
|
count=re.MULTILINE,
|
|
72
72
|
)
|
|
@@ -125,7 +125,7 @@ class VtlTemplate:
|
|
|
125
125
|
rendered_template = json.loads(rendered_template)
|
|
126
126
|
return rendered_template
|
|
127
127
|
|
|
128
|
-
def prepare_namespace(self, variables:
|
|
128
|
+
def prepare_namespace(self, variables: dict[str, Any], source: str = "") -> dict:
|
|
129
129
|
namespace = dict(variables or {})
|
|
130
130
|
namespace.setdefault("context", {})
|
|
131
131
|
if not namespace.get("util"):
|