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/aws/connect.py
CHANGED
|
@@ -10,10 +10,11 @@ import logging
|
|
|
10
10
|
import re
|
|
11
11
|
import threading
|
|
12
12
|
from abc import ABC, abstractmethod
|
|
13
|
+
from collections.abc import Callable
|
|
13
14
|
from functools import lru_cache, partial
|
|
14
15
|
from random import choice
|
|
15
16
|
from socket import socket
|
|
16
|
-
from typing import Any,
|
|
17
|
+
from typing import Any, Generic, TypedDict, TypeVar
|
|
17
18
|
|
|
18
19
|
import dns.message
|
|
19
20
|
import dns.query
|
|
@@ -88,8 +89,8 @@ def make_hash(o):
|
|
|
88
89
|
return hash(frozenset(sorted(new_o.items())))
|
|
89
90
|
|
|
90
91
|
|
|
91
|
-
def config_equality_patch(self, other: object):
|
|
92
|
-
return type(self)
|
|
92
|
+
def config_equality_patch(self, other: object) -> bool:
|
|
93
|
+
return type(self) is type(other) and self._user_provided_options == other._user_provided_options
|
|
93
94
|
|
|
94
95
|
|
|
95
96
|
def config_hash_patch(self):
|
|
@@ -277,10 +278,10 @@ class ClientFactory(ABC):
|
|
|
277
278
|
def __call__(
|
|
278
279
|
self,
|
|
279
280
|
*,
|
|
280
|
-
region_name:
|
|
281
|
-
aws_access_key_id:
|
|
282
|
-
aws_secret_access_key:
|
|
283
|
-
aws_session_token:
|
|
281
|
+
region_name: str | None = None,
|
|
282
|
+
aws_access_key_id: str | None = None,
|
|
283
|
+
aws_secret_access_key: str | None = None,
|
|
284
|
+
aws_session_token: str | None = None,
|
|
284
285
|
endpoint_url: str = None,
|
|
285
286
|
config: Config = None,
|
|
286
287
|
) -> ServiceLevelClientFactory:
|
|
@@ -318,11 +319,11 @@ class ClientFactory(ABC):
|
|
|
318
319
|
self,
|
|
319
320
|
*,
|
|
320
321
|
role_arn: str,
|
|
321
|
-
service_principal:
|
|
322
|
-
session_name:
|
|
323
|
-
region_name:
|
|
324
|
-
endpoint_url:
|
|
325
|
-
config:
|
|
322
|
+
service_principal: ServicePrincipal | None = None,
|
|
323
|
+
session_name: str | None = None,
|
|
324
|
+
region_name: str | None = None,
|
|
325
|
+
endpoint_url: str | None = None,
|
|
326
|
+
config: Config | None = None,
|
|
326
327
|
) -> ServiceLevelClientFactory:
|
|
327
328
|
"""
|
|
328
329
|
Create a service level client factory with credentials from assuming the given role ARN.
|
|
@@ -362,12 +363,12 @@ class ClientFactory(ABC):
|
|
|
362
363
|
def get_client(
|
|
363
364
|
self,
|
|
364
365
|
service_name: str,
|
|
365
|
-
region_name:
|
|
366
|
-
aws_access_key_id:
|
|
367
|
-
aws_secret_access_key:
|
|
368
|
-
aws_session_token:
|
|
369
|
-
endpoint_url:
|
|
370
|
-
config:
|
|
366
|
+
region_name: str | None = None,
|
|
367
|
+
aws_access_key_id: str | None = None,
|
|
368
|
+
aws_secret_access_key: str | None = None,
|
|
369
|
+
aws_session_token: str | None = None,
|
|
370
|
+
endpoint_url: str | None = None,
|
|
371
|
+
config: Config | None = None,
|
|
371
372
|
):
|
|
372
373
|
raise NotImplementedError()
|
|
373
374
|
|
|
@@ -389,11 +390,11 @@ class ClientFactory(ABC):
|
|
|
389
390
|
service_name: str,
|
|
390
391
|
region_name: str,
|
|
391
392
|
use_ssl: bool,
|
|
392
|
-
verify:
|
|
393
|
-
endpoint_url:
|
|
394
|
-
aws_access_key_id:
|
|
395
|
-
aws_secret_access_key:
|
|
396
|
-
aws_session_token:
|
|
393
|
+
verify: bool | None,
|
|
394
|
+
endpoint_url: str | None,
|
|
395
|
+
aws_access_key_id: str | None,
|
|
396
|
+
aws_secret_access_key: str | None,
|
|
397
|
+
aws_session_token: str | None,
|
|
397
398
|
config: Config,
|
|
398
399
|
) -> BaseClient:
|
|
399
400
|
"""
|
|
@@ -480,12 +481,12 @@ class InternalClientFactory(ClientFactory):
|
|
|
480
481
|
def get_client(
|
|
481
482
|
self,
|
|
482
483
|
service_name: str,
|
|
483
|
-
region_name:
|
|
484
|
-
aws_access_key_id:
|
|
485
|
-
aws_secret_access_key:
|
|
486
|
-
aws_session_token:
|
|
487
|
-
endpoint_url:
|
|
488
|
-
config:
|
|
484
|
+
region_name: str | None = None,
|
|
485
|
+
aws_access_key_id: str | None = None,
|
|
486
|
+
aws_secret_access_key: str | None = None,
|
|
487
|
+
aws_session_token: str | None = None,
|
|
488
|
+
endpoint_url: str | None = None,
|
|
489
|
+
config: Config | None = None,
|
|
489
490
|
) -> BaseClient:
|
|
490
491
|
"""
|
|
491
492
|
Build and return client for connections originating within LocalStack.
|
|
@@ -535,12 +536,12 @@ class ExternalClientFactory(ClientFactory):
|
|
|
535
536
|
def get_client(
|
|
536
537
|
self,
|
|
537
538
|
service_name: str,
|
|
538
|
-
region_name:
|
|
539
|
-
aws_access_key_id:
|
|
540
|
-
aws_secret_access_key:
|
|
541
|
-
aws_session_token:
|
|
542
|
-
endpoint_url:
|
|
543
|
-
config:
|
|
539
|
+
region_name: str | None = None,
|
|
540
|
+
aws_access_key_id: str | None = None,
|
|
541
|
+
aws_secret_access_key: str | None = None,
|
|
542
|
+
aws_session_token: str | None = None,
|
|
543
|
+
endpoint_url: str | None = None,
|
|
544
|
+
config: Config | None = None,
|
|
544
545
|
) -> BaseClient:
|
|
545
546
|
"""
|
|
546
547
|
Build and return client for connections originating outside LocalStack and targeting Localstack.
|
|
@@ -604,12 +605,12 @@ class ExternalAwsClientFactory(ClientFactory):
|
|
|
604
605
|
def get_client(
|
|
605
606
|
self,
|
|
606
607
|
service_name: str,
|
|
607
|
-
region_name:
|
|
608
|
-
aws_access_key_id:
|
|
609
|
-
aws_secret_access_key:
|
|
610
|
-
aws_session_token:
|
|
611
|
-
endpoint_url:
|
|
612
|
-
config:
|
|
608
|
+
region_name: str | None = None,
|
|
609
|
+
aws_access_key_id: str | None = None,
|
|
610
|
+
aws_secret_access_key: str | None = None,
|
|
611
|
+
aws_session_token: str | None = None,
|
|
612
|
+
endpoint_url: str | None = None,
|
|
613
|
+
config: Config | None = None,
|
|
613
614
|
) -> BaseClient:
|
|
614
615
|
"""
|
|
615
616
|
Build and return client for connections originating outside LocalStack and targeting AWS.
|
localstack/aws/forwarder.py
CHANGED
|
@@ -3,10 +3,13 @@ This module contains utilities to call a backend (e.g., an external service proc
|
|
|
3
3
|
DynamoDBLocal) from a service provider.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Callable, Mapping
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
from botocore.awsrequest import AWSPreparedRequest, prepare_request_dict
|
|
9
10
|
from botocore.config import Config as BotoConfig
|
|
11
|
+
from botocore.model import OperationModel
|
|
12
|
+
from botocore.serialize import create_serializer
|
|
10
13
|
from werkzeug.datastructures import Headers
|
|
11
14
|
|
|
12
15
|
from localstack.aws.api.core import (
|
|
@@ -18,7 +21,7 @@ from localstack.aws.api.core import (
|
|
|
18
21
|
from localstack.aws.client import create_http_request, parse_response, raise_service_exception
|
|
19
22
|
from localstack.aws.connect import connect_to
|
|
20
23
|
from localstack.aws.skeleton import DispatchTable, create_dispatch_table
|
|
21
|
-
from localstack.aws.spec import load_service
|
|
24
|
+
from localstack.aws.spec import ProtocolName, load_service
|
|
22
25
|
from localstack.constants import AWS_REGION_US_EAST_1
|
|
23
26
|
from localstack.http import Response
|
|
24
27
|
from localstack.http.proxy import Proxy
|
|
@@ -54,7 +57,7 @@ class AwsRequestProxy:
|
|
|
54
57
|
self,
|
|
55
58
|
context: RequestContext,
|
|
56
59
|
service_request: ServiceRequest = None,
|
|
57
|
-
) ->
|
|
60
|
+
) -> ServiceResponse | Response | None:
|
|
58
61
|
"""Method to satisfy the ``ServiceRequestHandler`` protocol."""
|
|
59
62
|
return self.forward(context, service_request)
|
|
60
63
|
|
|
@@ -62,7 +65,7 @@ class AwsRequestProxy:
|
|
|
62
65
|
self,
|
|
63
66
|
context: RequestContext,
|
|
64
67
|
service_request: ServiceRequest = None,
|
|
65
|
-
) ->
|
|
68
|
+
) -> ServiceResponse | Response | None:
|
|
66
69
|
"""
|
|
67
70
|
Forwards the given request to the backend configured by ``endpoint_url``.
|
|
68
71
|
|
|
@@ -78,7 +81,7 @@ class AwsRequestProxy:
|
|
|
78
81
|
if not self.parse_response:
|
|
79
82
|
return http_response
|
|
80
83
|
parsed_response = parse_response(
|
|
81
|
-
context.operation, http_response, self.include_response_metadata
|
|
84
|
+
context.operation, context.protocol, http_response, self.include_response_metadata
|
|
82
85
|
)
|
|
83
86
|
raise_service_exception(http_response, parsed_response)
|
|
84
87
|
return parsed_response
|
|
@@ -89,6 +92,7 @@ class AwsRequestProxy:
|
|
|
89
92
|
action=original.operation.name,
|
|
90
93
|
parameters=service_request,
|
|
91
94
|
region=original.region,
|
|
95
|
+
protocol=original.protocol,
|
|
92
96
|
)
|
|
93
97
|
# update the newly created context with non-payload specific request headers (the payload can differ from
|
|
94
98
|
# the original request, f.e. it could be JSON encoded now while the initial request was CBOR encoded)
|
|
@@ -183,7 +187,9 @@ def dispatch_to_backend(
|
|
|
183
187
|
:raises ServiceException: if the dispatcher returned an error response
|
|
184
188
|
"""
|
|
185
189
|
http_response = http_request_dispatcher(context)
|
|
186
|
-
parsed_response = parse_response(
|
|
190
|
+
parsed_response = parse_response(
|
|
191
|
+
context.operation, context.protocol, http_response, include_response_metadata
|
|
192
|
+
)
|
|
187
193
|
raise_service_exception(http_response, parsed_response)
|
|
188
194
|
return parsed_response
|
|
189
195
|
|
|
@@ -195,9 +201,10 @@ _non_validating_boto_config = BotoConfig(parameter_validation=False)
|
|
|
195
201
|
def create_aws_request_context(
|
|
196
202
|
service_name: str,
|
|
197
203
|
action: str,
|
|
204
|
+
protocol: ProtocolName = None,
|
|
198
205
|
parameters: Mapping[str, Any] = None,
|
|
199
206
|
region: str = None,
|
|
200
|
-
endpoint_url:
|
|
207
|
+
endpoint_url: str | None = None,
|
|
201
208
|
) -> RequestContext:
|
|
202
209
|
"""
|
|
203
210
|
This is a stripped-down version of what the botocore client does to perform an HTTP request from a client call. A
|
|
@@ -209,6 +216,7 @@ def create_aws_request_context(
|
|
|
209
216
|
|
|
210
217
|
:param service_name: the AWS service
|
|
211
218
|
:param action: the action to invoke
|
|
219
|
+
:param protocol: the protocol to use
|
|
212
220
|
:param parameters: the invocation parameters
|
|
213
221
|
:param region: the region name (default is us-east-1)
|
|
214
222
|
:param endpoint_url: the endpoint to call (defaults to localstack)
|
|
@@ -221,6 +229,8 @@ def create_aws_request_context(
|
|
|
221
229
|
|
|
222
230
|
service = load_service(service_name)
|
|
223
231
|
operation = service.operation_model(action)
|
|
232
|
+
# TODO: remove this once every usage upstream has been removed
|
|
233
|
+
protocol = protocol or service.resolved_protocol
|
|
224
234
|
|
|
225
235
|
# we re-use botocore internals here to serialize the HTTP request,
|
|
226
236
|
# but deactivate validation (validation errors should be handled by the backend)
|
|
@@ -242,8 +252,14 @@ def create_aws_request_context(
|
|
|
242
252
|
endpoint_url = "http://localhost.localstack.cloud"
|
|
243
253
|
# pre-process the request args (some params are modified using botocore event handlers)
|
|
244
254
|
parameters = client._emit_api_params(parameters, operation, request_context)
|
|
245
|
-
|
|
246
|
-
|
|
255
|
+
|
|
256
|
+
request_dict = _convert_to_request_dict_with_protocol(
|
|
257
|
+
client=client,
|
|
258
|
+
protocol=protocol,
|
|
259
|
+
api_params=parameters,
|
|
260
|
+
operation_model=operation,
|
|
261
|
+
endpoint_url=endpoint_url,
|
|
262
|
+
context=request_context,
|
|
247
263
|
)
|
|
248
264
|
|
|
249
265
|
if auth_path := request_dict.get("auth_path"):
|
|
@@ -265,7 +281,39 @@ def create_aws_request_context(
|
|
|
265
281
|
context = RequestContext(request=create_http_request(aws_request))
|
|
266
282
|
context.service = service
|
|
267
283
|
context.operation = operation
|
|
284
|
+
context.protocol = protocol
|
|
268
285
|
context.region = region
|
|
269
286
|
context.service_request = parameters
|
|
270
287
|
|
|
271
288
|
return context
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def _convert_to_request_dict_with_protocol(
|
|
292
|
+
client,
|
|
293
|
+
protocol: ProtocolName,
|
|
294
|
+
api_params: dict,
|
|
295
|
+
operation_model: OperationModel,
|
|
296
|
+
endpoint_url: str,
|
|
297
|
+
context: dict,
|
|
298
|
+
set_user_agent_header: bool = True,
|
|
299
|
+
) -> dict:
|
|
300
|
+
"""
|
|
301
|
+
This function is taken from botocore Client._convert_to_request_dict, but we are overriding the serializer
|
|
302
|
+
Botocore does not expose a way to create a client with a specific protocol, but we need this functionality
|
|
303
|
+
to support multi-protocols.
|
|
304
|
+
"""
|
|
305
|
+
serializer = create_serializer(protocol, include_validation=False)
|
|
306
|
+
request_dict = serializer.serialize_to_request(api_params, operation_model)
|
|
307
|
+
if not client._client_config.inject_host_prefix:
|
|
308
|
+
request_dict.pop("host_prefix", None)
|
|
309
|
+
if set_user_agent_header:
|
|
310
|
+
user_agent = client._user_agent_creator.to_string()
|
|
311
|
+
else:
|
|
312
|
+
user_agent = None
|
|
313
|
+
prepare_request_dict(
|
|
314
|
+
request_dict,
|
|
315
|
+
endpoint_url=endpoint_url,
|
|
316
|
+
user_agent=user_agent,
|
|
317
|
+
context=context,
|
|
318
|
+
)
|
|
319
|
+
return request_dict
|
localstack/aws/gateway.py
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import typing as t
|
|
2
|
-
|
|
3
1
|
from rolo.gateway import Gateway as RoloGateway
|
|
4
2
|
from rolo.response import Response
|
|
5
3
|
|
|
@@ -17,7 +15,7 @@ class Gateway(RoloGateway):
|
|
|
17
15
|
response_handlers: list[Handler] = None,
|
|
18
16
|
finalizers: list[Handler] = None,
|
|
19
17
|
exception_handlers: list[ExceptionHandler] = None,
|
|
20
|
-
context_class:
|
|
18
|
+
context_class: type[RequestContext] = None,
|
|
21
19
|
) -> None:
|
|
22
20
|
super().__init__(
|
|
23
21
|
request_handlers,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import threading
|
|
3
|
-
from typing import Optional
|
|
4
3
|
|
|
5
4
|
from localstack import config
|
|
6
5
|
from localstack.aws.api import RequestContext
|
|
@@ -52,7 +51,7 @@ class ServiceRequestCounter:
|
|
|
52
51
|
)
|
|
53
52
|
)
|
|
54
53
|
|
|
55
|
-
def _get_err_type(self, context: RequestContext, response: Response) ->
|
|
54
|
+
def _get_err_type(self, context: RequestContext, response: Response) -> str | None:
|
|
56
55
|
"""
|
|
57
56
|
Attempts to re-use the existing service_response, or parse and return the error type from the response body,
|
|
58
57
|
e.g. ``ResourceInUseException``.
|
|
@@ -61,7 +60,7 @@ class ServiceRequestCounter:
|
|
|
61
60
|
if context.service_exception:
|
|
62
61
|
return context.service_exception.code
|
|
63
62
|
|
|
64
|
-
response = parse_response(context.operation, response)
|
|
63
|
+
response = parse_response(context.operation, context.protocol, response)
|
|
65
64
|
return response["Error"]["Code"]
|
|
66
65
|
except Exception:
|
|
67
66
|
if config.DEBUG_ANALYTICS:
|
localstack/aws/handlers/cors.py
CHANGED
|
@@ -4,7 +4,6 @@ A set of handlers which handle Cross Origin Resource Sharing (CORS).
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
import re
|
|
7
|
-
from typing import List, Set
|
|
8
7
|
from urllib.parse import urlparse
|
|
9
8
|
|
|
10
9
|
from werkzeug.datastructures import Headers
|
|
@@ -83,7 +82,7 @@ ALLOWED_CORS_RESPONSE_HEADERS = [
|
|
|
83
82
|
]
|
|
84
83
|
|
|
85
84
|
|
|
86
|
-
def _get_allowed_cors_internal_domains() ->
|
|
85
|
+
def _get_allowed_cors_internal_domains() -> set[str]:
|
|
87
86
|
"""
|
|
88
87
|
Construct the list of allowed internal domains for CORS enforcement purposes
|
|
89
88
|
Defined as function to allow easier testing with monkeypatch of config values
|
|
@@ -94,7 +93,7 @@ def _get_allowed_cors_internal_domains() -> Set[str]:
|
|
|
94
93
|
_ALLOWED_INTERNAL_DOMAINS = _get_allowed_cors_internal_domains()
|
|
95
94
|
|
|
96
95
|
|
|
97
|
-
def _get_allowed_cors_ports() ->
|
|
96
|
+
def _get_allowed_cors_ports() -> set[int]:
|
|
98
97
|
"""
|
|
99
98
|
Construct the list of allowed ports for CORS enforcement purposes
|
|
100
99
|
Defined as function to allow easier testing with monkeypatch of config values
|
|
@@ -105,7 +104,7 @@ def _get_allowed_cors_ports() -> Set[int]:
|
|
|
105
104
|
_ALLOWED_INTERNAL_PORTS = _get_allowed_cors_ports()
|
|
106
105
|
|
|
107
106
|
|
|
108
|
-
def _get_allowed_cors_origins() ->
|
|
107
|
+
def _get_allowed_cors_origins() -> list[str]:
|
|
109
108
|
"""Construct the list of allowed origins for CORS enforcement purposes"""
|
|
110
109
|
result = [
|
|
111
110
|
# allow access from Web app and localhost domains
|
|
@@ -210,7 +209,7 @@ class CorsEnforcer(Handler):
|
|
|
210
209
|
return True
|
|
211
210
|
|
|
212
211
|
@staticmethod
|
|
213
|
-
def _is_in_allowed_origins(allowed_origins:
|
|
212
|
+
def _is_in_allowed_origins(allowed_origins: list[str], origin: str) -> bool:
|
|
214
213
|
"""Returns true if the `origin` is in the `allowed_origins`."""
|
|
215
214
|
for allowed_origin in allowed_origins:
|
|
216
215
|
if allowed_origin == "*" or origin == allowed_origin:
|
|
@@ -20,7 +20,12 @@ class InternalRequestParamsEnricher(Handler):
|
|
|
20
20
|
try:
|
|
21
21
|
dto = MappingProxyType(load_dto(header))
|
|
22
22
|
except Exception as e:
|
|
23
|
-
LOG.
|
|
23
|
+
LOG.error(
|
|
24
|
+
"Error loading request parameters '%s', Error: %s",
|
|
25
|
+
header,
|
|
26
|
+
e,
|
|
27
|
+
exc_info=LOG.isEnabledFor(logging.DEBUG),
|
|
28
|
+
)
|
|
24
29
|
return
|
|
25
30
|
|
|
26
31
|
context.internal_request_params = dto
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"""Handlers for logging."""
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
|
+
import types
|
|
4
5
|
from functools import cached_property
|
|
5
|
-
from typing import Type
|
|
6
6
|
|
|
7
7
|
from localstack.aws.api import RequestContext, ServiceException
|
|
8
8
|
from localstack.aws.chain import ExceptionHandler, HandlerChain
|
|
@@ -22,6 +22,14 @@ class ExceptionLogger(ExceptionHandler):
|
|
|
22
22
|
def __init__(self, logger=None):
|
|
23
23
|
self.logger = logger or LOG
|
|
24
24
|
|
|
25
|
+
try:
|
|
26
|
+
import moto.core.exceptions
|
|
27
|
+
|
|
28
|
+
self._moto_service_exception = moto.core.exceptions.ServiceException
|
|
29
|
+
except (ModuleNotFoundError, AttributeError):
|
|
30
|
+
# Moto may not be available in stripped-down versions of LocalStack, like LocalStack S3 image.
|
|
31
|
+
self._moto_service_exception = types.EllipsisType
|
|
32
|
+
|
|
25
33
|
def __call__(
|
|
26
34
|
self,
|
|
27
35
|
chain: HandlerChain,
|
|
@@ -29,9 +37,10 @@ class ExceptionLogger(ExceptionHandler):
|
|
|
29
37
|
context: RequestContext,
|
|
30
38
|
response: Response,
|
|
31
39
|
):
|
|
32
|
-
if isinstance(exception, ServiceException):
|
|
40
|
+
if isinstance(exception, (ServiceException, self._moto_service_exception)):
|
|
33
41
|
# We do not want to log an error/stacktrace if the handler is working as expected, but chooses to throw
|
|
34
|
-
# a service exception
|
|
42
|
+
# a service exception. It may also throw a Moto ServiceException, which should not be logged either
|
|
43
|
+
# because ServiceExceptionHandler understands it.
|
|
35
44
|
return
|
|
36
45
|
if self.logger.isEnabledFor(level=logging.DEBUG):
|
|
37
46
|
self.logger.exception("exception during call chain", exc_info=exception)
|
|
@@ -71,7 +80,7 @@ class ResponseLogger:
|
|
|
71
80
|
)
|
|
72
81
|
|
|
73
82
|
# make sure loggers are loaded after logging config is loaded
|
|
74
|
-
def _prepare_logger(self, logger: logging.Logger, formatter:
|
|
83
|
+
def _prepare_logger(self, logger: logging.Logger, formatter: type):
|
|
75
84
|
if logger.isEnabledFor(logging.DEBUG):
|
|
76
85
|
logger.propagate = False
|
|
77
86
|
handler = create_default_handler(logger.level)
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import csv
|
|
1
2
|
import logging
|
|
2
|
-
|
|
3
|
+
import os
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from pathlib import Path
|
|
3
6
|
|
|
4
7
|
from localstack import config
|
|
5
8
|
from localstack.aws.api import RequestContext
|
|
6
9
|
from localstack.aws.chain import HandlerChain
|
|
10
|
+
from localstack.constants import ENV_INTERNAL_TEST_STORE_METRICS_PATH
|
|
7
11
|
from localstack.http import Response
|
|
12
|
+
from localstack.utils.strings import short_uid
|
|
8
13
|
|
|
9
14
|
LOG = logging.getLogger(__name__)
|
|
10
15
|
|
|
@@ -16,7 +21,7 @@ class MetricHandlerItem:
|
|
|
16
21
|
|
|
17
22
|
request_id: str
|
|
18
23
|
request_context: RequestContext
|
|
19
|
-
parameters_after_parse:
|
|
24
|
+
parameters_after_parse: list[str] | None
|
|
20
25
|
|
|
21
26
|
def __init__(self, request_contex: RequestContext) -> None:
|
|
22
27
|
super().__init__()
|
|
@@ -35,7 +40,7 @@ class Metric:
|
|
|
35
40
|
headers: str
|
|
36
41
|
parameters: str
|
|
37
42
|
status_code: int
|
|
38
|
-
response_code:
|
|
43
|
+
response_code: str | None
|
|
39
44
|
exception: str
|
|
40
45
|
origin: str
|
|
41
46
|
xfail: bool
|
|
@@ -134,10 +139,36 @@ class Metric:
|
|
|
134
139
|
|
|
135
140
|
|
|
136
141
|
class MetricHandler:
|
|
137
|
-
metric_data:
|
|
142
|
+
metric_data: list[Metric] = []
|
|
138
143
|
|
|
139
144
|
def __init__(self) -> None:
|
|
140
145
|
self.metrics_handler_items = {}
|
|
146
|
+
self.local_filename = None
|
|
147
|
+
|
|
148
|
+
if self.should_store_metric_locally():
|
|
149
|
+
self.local_filename = self.create_local_file()
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def should_store_metric_locally() -> bool:
|
|
153
|
+
return config.is_collect_metrics_mode() and config.store_test_metrics_in_local_filesystem()
|
|
154
|
+
|
|
155
|
+
@staticmethod
|
|
156
|
+
def create_local_file():
|
|
157
|
+
folder = Path(
|
|
158
|
+
os.environ.get(ENV_INTERNAL_TEST_STORE_METRICS_PATH, "/tmp/localstack-metrics")
|
|
159
|
+
)
|
|
160
|
+
if not folder.exists():
|
|
161
|
+
folder.mkdir(parents=True, exist_ok=True)
|
|
162
|
+
LOG.debug("Metric reports will be stored in %s", folder)
|
|
163
|
+
filename = (
|
|
164
|
+
folder
|
|
165
|
+
/ f"metric-report-raw-data-{datetime.utcnow().strftime('%Y-%m-%d__%H_%M_%S')}-{short_uid()}.csv"
|
|
166
|
+
)
|
|
167
|
+
with open(filename, "w") as fd:
|
|
168
|
+
LOG.debug("Creating new metric data file %s", filename)
|
|
169
|
+
writer = csv.writer(fd)
|
|
170
|
+
writer.writerow(Metric.RAW_DATA_HEADER)
|
|
171
|
+
return filename
|
|
141
172
|
|
|
142
173
|
def create_metric_handler_item(
|
|
143
174
|
self, chain: HandlerChain, context: RequestContext, response: Response
|
|
@@ -195,7 +226,15 @@ class MetricHandler:
|
|
|
195
226
|
)
|
|
196
227
|
# refrain from adding duplicates
|
|
197
228
|
if metric not in MetricHandler.metric_data:
|
|
198
|
-
|
|
229
|
+
self.append_metric(metric)
|
|
199
230
|
|
|
200
231
|
# cleanup
|
|
201
232
|
del self.metrics_handler_items[context]
|
|
233
|
+
|
|
234
|
+
def append_metric(self, metric: Metric):
|
|
235
|
+
if self.should_store_metric_locally():
|
|
236
|
+
with open(self.local_filename, "a") as fd:
|
|
237
|
+
writer = csv.writer(fd)
|
|
238
|
+
writer.writerow(metric)
|
|
239
|
+
else:
|
|
240
|
+
MetricHandler.metric_data.append(metric)
|