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
|
@@ -6,7 +6,8 @@ import os
|
|
|
6
6
|
import re
|
|
7
7
|
import textwrap
|
|
8
8
|
import time
|
|
9
|
-
from
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Unpack
|
|
10
11
|
|
|
11
12
|
import botocore.auth
|
|
12
13
|
import botocore.config
|
|
@@ -21,7 +22,8 @@ from pytest_httpserver import HTTPServer
|
|
|
21
22
|
from werkzeug import Request, Response
|
|
22
23
|
|
|
23
24
|
from localstack import config
|
|
24
|
-
from localstack.aws.api.
|
|
25
|
+
from localstack.aws.api.cloudformation import CreateChangeSetInput, Parameter
|
|
26
|
+
from localstack.aws.api.ec2 import CreateSecurityGroupRequest, CreateVpcEndpointRequest, VpcEndpoint
|
|
25
27
|
from localstack.aws.connect import ServiceLevelClientFactory
|
|
26
28
|
from localstack.services.stores import (
|
|
27
29
|
AccountRegionBundle,
|
|
@@ -231,7 +233,7 @@ def s3_create_bucket(s3_empty_bucket, aws_client):
|
|
|
231
233
|
|
|
232
234
|
def factory(**kwargs) -> str:
|
|
233
235
|
if "Bucket" not in kwargs:
|
|
234
|
-
kwargs["Bucket"] = "test-bucket
|
|
236
|
+
kwargs["Bucket"] = f"test-bucket-{short_uid()}"
|
|
235
237
|
|
|
236
238
|
if (
|
|
237
239
|
"CreateBucketConfiguration" not in kwargs
|
|
@@ -334,7 +336,7 @@ def sqs_create_queue(aws_client):
|
|
|
334
336
|
|
|
335
337
|
def factory(**kwargs):
|
|
336
338
|
if "QueueName" not in kwargs:
|
|
337
|
-
kwargs["QueueName"] = "test-queue
|
|
339
|
+
kwargs["QueueName"] = f"test-queue-{short_uid()}"
|
|
338
340
|
|
|
339
341
|
response = aws_client.sqs.create_queue(**kwargs)
|
|
340
342
|
url = response["QueueUrl"]
|
|
@@ -356,8 +358,8 @@ def sqs_create_queue(aws_client):
|
|
|
356
358
|
def sqs_receive_messages_delete(aws_client):
|
|
357
359
|
def factory(
|
|
358
360
|
queue_url: str,
|
|
359
|
-
expected_messages:
|
|
360
|
-
wait_time:
|
|
361
|
+
expected_messages: int | None = None,
|
|
362
|
+
wait_time: int | None = 5,
|
|
361
363
|
):
|
|
362
364
|
response = aws_client.sqs.receive_message(
|
|
363
365
|
QueueUrl=queue_url,
|
|
@@ -502,7 +504,7 @@ def sns_create_topic(aws_client):
|
|
|
502
504
|
|
|
503
505
|
def _create_topic(**kwargs):
|
|
504
506
|
if "Name" not in kwargs:
|
|
505
|
-
kwargs["Name"] = "test-topic
|
|
507
|
+
kwargs["Name"] = f"test-topic-{short_uid()}"
|
|
506
508
|
response = aws_client.sns.create_topic(**kwargs)
|
|
507
509
|
topic_arns.append(response["TopicArn"])
|
|
508
510
|
return response
|
|
@@ -593,7 +595,7 @@ def sns_allow_topic_sqs_queue(aws_client):
|
|
|
593
595
|
def sns_create_sqs_subscription(sns_allow_topic_sqs_queue, sqs_get_queue_arn, aws_client):
|
|
594
596
|
subscriptions = []
|
|
595
597
|
|
|
596
|
-
def _factory(topic_arn: str, queue_url: str, **kwargs) ->
|
|
598
|
+
def _factory(topic_arn: str, queue_url: str, **kwargs) -> dict[str, str]:
|
|
597
599
|
queue_arn = sqs_get_queue_arn(queue_url)
|
|
598
600
|
|
|
599
601
|
# connect sns topic to sqs
|
|
@@ -630,7 +632,7 @@ def sns_create_http_endpoint(sns_create_topic, sns_subscription, aws_client):
|
|
|
630
632
|
|
|
631
633
|
def _create_http_endpoint(
|
|
632
634
|
raw_message_delivery: bool = False,
|
|
633
|
-
) ->
|
|
635
|
+
) -> tuple[str, str, str, HTTPServer]:
|
|
634
636
|
server = HTTPServer()
|
|
635
637
|
server.start()
|
|
636
638
|
http_servers.append(server)
|
|
@@ -705,7 +707,7 @@ def route53_hosted_zone(aws_client):
|
|
|
705
707
|
def transcribe_create_job(s3_bucket, aws_client):
|
|
706
708
|
job_names = []
|
|
707
709
|
|
|
708
|
-
def _create_job(audio_file: str, params:
|
|
710
|
+
def _create_job(audio_file: str, params: dict[str, Any] | None = None) -> str:
|
|
709
711
|
s3_key = "test-clip.wav"
|
|
710
712
|
|
|
711
713
|
if not params:
|
|
@@ -1004,7 +1006,7 @@ def opensearch_document_path(opensearch_endpoint, aws_client):
|
|
|
1004
1006
|
# Cleanup fixtures
|
|
1005
1007
|
@pytest.fixture
|
|
1006
1008
|
def cleanup_stacks(aws_client):
|
|
1007
|
-
def _cleanup_stacks(stacks:
|
|
1009
|
+
def _cleanup_stacks(stacks: list[str]) -> None:
|
|
1008
1010
|
stacks = ensure_list(stacks)
|
|
1009
1011
|
for stack in stacks:
|
|
1010
1012
|
try:
|
|
@@ -1018,7 +1020,7 @@ def cleanup_stacks(aws_client):
|
|
|
1018
1020
|
|
|
1019
1021
|
@pytest.fixture
|
|
1020
1022
|
def cleanup_changesets(aws_client):
|
|
1021
|
-
def _cleanup_changesets(changesets:
|
|
1023
|
+
def _cleanup_changesets(changesets: list[str]) -> None:
|
|
1022
1024
|
changesets = ensure_list(changesets)
|
|
1023
1025
|
for cs in changesets:
|
|
1024
1026
|
try:
|
|
@@ -1039,7 +1041,7 @@ class DeployResult:
|
|
|
1039
1041
|
stack_id: str
|
|
1040
1042
|
stack_name: str
|
|
1041
1043
|
change_set_name: str
|
|
1042
|
-
outputs:
|
|
1044
|
+
outputs: dict[str, str]
|
|
1043
1045
|
|
|
1044
1046
|
destroy: Callable[[], None]
|
|
1045
1047
|
|
|
@@ -1084,17 +1086,18 @@ def deploy_cfn_template(
|
|
|
1084
1086
|
|
|
1085
1087
|
def _deploy(
|
|
1086
1088
|
*,
|
|
1087
|
-
is_update:
|
|
1088
|
-
stack_name:
|
|
1089
|
-
change_set_name:
|
|
1090
|
-
template:
|
|
1091
|
-
template_path:
|
|
1092
|
-
template_mapping:
|
|
1093
|
-
parameters:
|
|
1094
|
-
role_arn:
|
|
1095
|
-
max_wait:
|
|
1096
|
-
delay_between_polls:
|
|
1097
|
-
custom_aws_client:
|
|
1089
|
+
is_update: bool | None = False,
|
|
1090
|
+
stack_name: str | None = None,
|
|
1091
|
+
change_set_name: str | None = None,
|
|
1092
|
+
template: str | None = None,
|
|
1093
|
+
template_path: str | os.PathLike | None = None,
|
|
1094
|
+
template_mapping: dict[str, Any] | None = None,
|
|
1095
|
+
parameters: dict[str, str] | None = None,
|
|
1096
|
+
role_arn: str | None = None,
|
|
1097
|
+
max_wait: int | None = None,
|
|
1098
|
+
delay_between_polls: int | None = 2,
|
|
1099
|
+
custom_aws_client: ServiceLevelClientFactory | None = None,
|
|
1100
|
+
raw_parameters: list[Parameter] | None = None,
|
|
1098
1101
|
) -> DeployResult:
|
|
1099
1102
|
if is_update:
|
|
1100
1103
|
assert stack_name
|
|
@@ -1110,20 +1113,21 @@ def deploy_cfn_template(
|
|
|
1110
1113
|
raise RuntimeError(f"Could not find file {os.path.realpath(template_path)}")
|
|
1111
1114
|
template_rendered = render_template(template, **(template_mapping or {}))
|
|
1112
1115
|
|
|
1113
|
-
kwargs =
|
|
1116
|
+
kwargs = CreateChangeSetInput(
|
|
1114
1117
|
StackName=stack_name,
|
|
1115
1118
|
ChangeSetName=change_set_name,
|
|
1116
1119
|
TemplateBody=template_rendered,
|
|
1117
1120
|
Capabilities=["CAPABILITY_AUTO_EXPAND", "CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"],
|
|
1118
1121
|
ChangeSetType=("UPDATE" if is_update else "CREATE"),
|
|
1119
|
-
Parameters=[
|
|
1120
|
-
{
|
|
1121
|
-
"ParameterKey": k,
|
|
1122
|
-
"ParameterValue": v,
|
|
1123
|
-
}
|
|
1124
|
-
for (k, v) in (parameters or {}).items()
|
|
1125
|
-
],
|
|
1126
1122
|
)
|
|
1123
|
+
kwargs["Parameters"] = []
|
|
1124
|
+
if parameters:
|
|
1125
|
+
kwargs["Parameters"] = [
|
|
1126
|
+
Parameter(ParameterKey=k, ParameterValue=v) for (k, v) in parameters.items()
|
|
1127
|
+
]
|
|
1128
|
+
elif raw_parameters:
|
|
1129
|
+
kwargs["Parameters"] = raw_parameters
|
|
1130
|
+
|
|
1127
1131
|
if role_arn is not None:
|
|
1128
1132
|
kwargs["RoleARN"] = role_arn
|
|
1129
1133
|
|
|
@@ -1134,9 +1138,16 @@ def deploy_cfn_template(
|
|
|
1134
1138
|
change_set_id = response["Id"]
|
|
1135
1139
|
stack_id = response["StackId"]
|
|
1136
1140
|
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1141
|
+
try:
|
|
1142
|
+
cfn_aws_client.cloudformation.get_waiter(WAITER_CHANGE_SET_CREATE_COMPLETE).wait(
|
|
1143
|
+
ChangeSetName=change_set_id
|
|
1144
|
+
)
|
|
1145
|
+
except botocore.exceptions.WaiterError as e:
|
|
1146
|
+
change_set = cfn_aws_client.cloudformation.describe_change_set(
|
|
1147
|
+
ChangeSetName=change_set_id
|
|
1148
|
+
)
|
|
1149
|
+
raise Exception(f"{change_set['Status']}: {change_set.get('StatusReason')}") from e
|
|
1150
|
+
|
|
1140
1151
|
cfn_aws_client.cloudformation.execute_change_set(ChangeSetName=change_set_id)
|
|
1141
1152
|
stack_waiter = cfn_aws_client.cloudformation.get_waiter(
|
|
1142
1153
|
WAITER_STACK_UPDATE_COMPLETE if is_update else WAITER_STACK_CREATE_COMPLETE
|
|
@@ -1238,7 +1249,7 @@ def is_stack_deleted(aws_client):
|
|
|
1238
1249
|
return _has_stack_status(aws_client.cloudformation, ["DELETE_COMPLETE"])
|
|
1239
1250
|
|
|
1240
1251
|
|
|
1241
|
-
def _has_stack_status(cfn_client, statuses:
|
|
1252
|
+
def _has_stack_status(cfn_client, statuses: list[str]):
|
|
1242
1253
|
def _has_status(stack_id: str):
|
|
1243
1254
|
def _inner():
|
|
1244
1255
|
resp = cfn_client.describe_stacks(StackName=stack_id)
|
|
@@ -1252,7 +1263,7 @@ def _has_stack_status(cfn_client, statuses: List[str]):
|
|
|
1252
1263
|
|
|
1253
1264
|
@pytest.fixture
|
|
1254
1265
|
def is_change_set_finished(aws_client):
|
|
1255
|
-
def _is_change_set_finished(change_set_id: str, stack_name:
|
|
1266
|
+
def _is_change_set_finished(change_set_id: str, stack_name: str | None = None):
|
|
1256
1267
|
def _inner():
|
|
1257
1268
|
kwargs = {"ChangeSetName": change_set_id}
|
|
1258
1269
|
if stack_name:
|
|
@@ -1514,7 +1525,7 @@ def create_event_source_mapping(aws_client):
|
|
|
1514
1525
|
|
|
1515
1526
|
@pytest.fixture
|
|
1516
1527
|
def check_lambda_logs(aws_client):
|
|
1517
|
-
def _check_logs(func_name: str, expected_lines:
|
|
1528
|
+
def _check_logs(func_name: str, expected_lines: list[str] = None) -> list[str]:
|
|
1518
1529
|
if not expected_lines:
|
|
1519
1530
|
expected_lines = []
|
|
1520
1531
|
log_events = get_lambda_logs(func_name, logs_client=aws_client.logs)
|
|
@@ -1983,7 +1994,7 @@ def setup_sender_email_address(ses_verify_identity):
|
|
|
1983
1994
|
email address and verify them.
|
|
1984
1995
|
"""
|
|
1985
1996
|
|
|
1986
|
-
def inner(sender_email_address:
|
|
1997
|
+
def inner(sender_email_address: str | None = None) -> str:
|
|
1987
1998
|
if is_aws_cloud():
|
|
1988
1999
|
if sender_email_address is None:
|
|
1989
2000
|
raise ValueError(
|
|
@@ -2046,6 +2057,45 @@ def ec2_create_security_group(aws_client):
|
|
|
2046
2057
|
LOG.debug("Error cleaning up EC2 security group: %s, %s", sg_group_id, e)
|
|
2047
2058
|
|
|
2048
2059
|
|
|
2060
|
+
@pytest.fixture
|
|
2061
|
+
def ec2_create_vpc_endpoint(aws_client):
|
|
2062
|
+
vpc_endpoints = []
|
|
2063
|
+
|
|
2064
|
+
def _create(**kwargs: Unpack[CreateVpcEndpointRequest]) -> VpcEndpoint:
|
|
2065
|
+
endpoint = aws_client.ec2.create_vpc_endpoint(**kwargs)
|
|
2066
|
+
endpoint_id = endpoint["VpcEndpoint"]["VpcEndpointId"]
|
|
2067
|
+
vpc_endpoints.append(endpoint_id)
|
|
2068
|
+
|
|
2069
|
+
def _check_available() -> VpcEndpoint:
|
|
2070
|
+
result = aws_client.ec2.describe_vpc_endpoints(VpcEndpointIds=[endpoint_id])
|
|
2071
|
+
_endpoint_details = result["VpcEndpoints"][0]
|
|
2072
|
+
assert _endpoint_details["State"] == "available"
|
|
2073
|
+
|
|
2074
|
+
return _endpoint_details
|
|
2075
|
+
|
|
2076
|
+
return retry(_check_available, retries=30, sleep=5 if is_aws_cloud() else 1)
|
|
2077
|
+
|
|
2078
|
+
yield _create
|
|
2079
|
+
|
|
2080
|
+
try:
|
|
2081
|
+
aws_client.ec2.delete_vpc_endpoints(VpcEndpointIds=vpc_endpoints)
|
|
2082
|
+
except Exception as e:
|
|
2083
|
+
LOG.error("Error cleaning up VPC endpoint: %s, %s", vpc_endpoints, e)
|
|
2084
|
+
|
|
2085
|
+
def wait_for_endpoint_deleted():
|
|
2086
|
+
try:
|
|
2087
|
+
endpoints = aws_client.ec2.describe_vpc_endpoints(VpcEndpointIds=vpc_endpoints)
|
|
2088
|
+
assert len(endpoints["VpcEndpoints"]) == 0 or all(
|
|
2089
|
+
endpoint["State"] == "Deleted" for endpoint in endpoints["VpcEndpoints"]
|
|
2090
|
+
)
|
|
2091
|
+
except botocore.exceptions.ClientError:
|
|
2092
|
+
pass
|
|
2093
|
+
|
|
2094
|
+
# the vpc can't be deleted if an endpoint exists
|
|
2095
|
+
if is_aws_cloud():
|
|
2096
|
+
retry(wait_for_endpoint_deleted, retries=30, sleep=10 if is_aws_cloud() else 1)
|
|
2097
|
+
|
|
2098
|
+
|
|
2049
2099
|
@pytest.fixture
|
|
2050
2100
|
def cleanups():
|
|
2051
2101
|
cleanup_fns = []
|
|
@@ -2203,7 +2253,7 @@ def assert_host_customisation(monkeypatch):
|
|
|
2203
2253
|
def asserter(
|
|
2204
2254
|
url: str,
|
|
2205
2255
|
*,
|
|
2206
|
-
custom_host:
|
|
2256
|
+
custom_host: str | None = None,
|
|
2207
2257
|
):
|
|
2208
2258
|
if custom_host is not None:
|
|
2209
2259
|
assert custom_host in url, f"Could not find `{custom_host}` in `{url}`"
|
|
@@ -2251,7 +2301,7 @@ def echo_http_server_post(echo_http_server):
|
|
|
2251
2301
|
return f"{echo_http_server}post"
|
|
2252
2302
|
|
|
2253
2303
|
|
|
2254
|
-
def create_policy_doc(effect: str, actions:
|
|
2304
|
+
def create_policy_doc(effect: str, actions: list, resource=None) -> dict:
|
|
2255
2305
|
actions = ensure_list(actions)
|
|
2256
2306
|
resource = resource or "*"
|
|
2257
2307
|
return {
|
|
@@ -2540,14 +2590,22 @@ def events_create_rule(aws_client):
|
|
|
2540
2590
|
|
|
2541
2591
|
@pytest.fixture
|
|
2542
2592
|
def sqs_as_events_target(aws_client, sqs_get_queue_arn):
|
|
2593
|
+
"""
|
|
2594
|
+
Fixture that creates an SQS queue and sets it up as a target for EventBridge events.
|
|
2595
|
+
"""
|
|
2543
2596
|
queue_urls = []
|
|
2544
2597
|
|
|
2545
|
-
def _sqs_as_events_target(
|
|
2598
|
+
def _sqs_as_events_target(
|
|
2599
|
+
queue_name: str | None = None, custom_aws_client=None
|
|
2600
|
+
) -> tuple[str, str]:
|
|
2546
2601
|
if not queue_name:
|
|
2547
2602
|
queue_name = f"tests-queue-{short_uid()}"
|
|
2548
|
-
|
|
2603
|
+
if custom_aws_client:
|
|
2604
|
+
sqs_client = custom_aws_client.sqs
|
|
2605
|
+
else:
|
|
2606
|
+
sqs_client = aws_client.sqs
|
|
2549
2607
|
queue_url = sqs_client.create_queue(QueueName=queue_name)["QueueUrl"]
|
|
2550
|
-
queue_urls.append(queue_url)
|
|
2608
|
+
queue_urls.append((queue_url, sqs_client))
|
|
2551
2609
|
queue_arn = sqs_get_queue_arn(queue_url)
|
|
2552
2610
|
policy = {
|
|
2553
2611
|
"Version": "2012-10-17",
|
|
@@ -2565,17 +2623,98 @@ def sqs_as_events_target(aws_client, sqs_get_queue_arn):
|
|
|
2565
2623
|
sqs_client.set_queue_attributes(
|
|
2566
2624
|
QueueUrl=queue_url, Attributes={"Policy": json.dumps(policy)}
|
|
2567
2625
|
)
|
|
2568
|
-
return queue_url, queue_arn
|
|
2626
|
+
return queue_url, queue_arn, queue_name
|
|
2569
2627
|
|
|
2570
2628
|
yield _sqs_as_events_target
|
|
2571
2629
|
|
|
2572
|
-
for queue_url in queue_urls:
|
|
2630
|
+
for queue_url, sqs_client in queue_urls:
|
|
2573
2631
|
try:
|
|
2574
|
-
|
|
2632
|
+
sqs_client.delete_queue(QueueUrl=queue_url)
|
|
2575
2633
|
except Exception as e:
|
|
2576
2634
|
LOG.debug("error cleaning up queue %s: %s", queue_url, e)
|
|
2577
2635
|
|
|
2578
2636
|
|
|
2637
|
+
@pytest.fixture
|
|
2638
|
+
def create_role_event_bus_source_to_bus_target(create_iam_role_with_policy):
|
|
2639
|
+
def _create_role_event_bus_to_bus():
|
|
2640
|
+
assume_role_policy_document_bus_source_to_bus_target = {
|
|
2641
|
+
"Version": "2012-10-17",
|
|
2642
|
+
"Statement": [
|
|
2643
|
+
{
|
|
2644
|
+
"Effect": "Allow",
|
|
2645
|
+
"Principal": {"Service": "events.amazonaws.com"},
|
|
2646
|
+
"Action": "sts:AssumeRole",
|
|
2647
|
+
}
|
|
2648
|
+
],
|
|
2649
|
+
}
|
|
2650
|
+
|
|
2651
|
+
policy_document_bus_source_to_bus_target = {
|
|
2652
|
+
"Version": "2012-10-17",
|
|
2653
|
+
"Statement": [
|
|
2654
|
+
{
|
|
2655
|
+
"Sid": "",
|
|
2656
|
+
"Effect": "Allow",
|
|
2657
|
+
"Action": "events:PutEvents",
|
|
2658
|
+
"Resource": "arn:aws:events:*:*:event-bus/*",
|
|
2659
|
+
}
|
|
2660
|
+
],
|
|
2661
|
+
}
|
|
2662
|
+
|
|
2663
|
+
role_arn_bus_source_to_bus_target = create_iam_role_with_policy(
|
|
2664
|
+
RoleDefinition=assume_role_policy_document_bus_source_to_bus_target,
|
|
2665
|
+
PolicyDefinition=policy_document_bus_source_to_bus_target,
|
|
2666
|
+
)
|
|
2667
|
+
|
|
2668
|
+
return role_arn_bus_source_to_bus_target
|
|
2669
|
+
|
|
2670
|
+
yield _create_role_event_bus_to_bus
|
|
2671
|
+
|
|
2672
|
+
|
|
2673
|
+
@pytest.fixture
|
|
2674
|
+
def get_primary_secondary_client(
|
|
2675
|
+
aws_client_factory,
|
|
2676
|
+
secondary_aws_client_factory,
|
|
2677
|
+
region_name,
|
|
2678
|
+
secondary_region_name,
|
|
2679
|
+
account_id,
|
|
2680
|
+
secondary_account_id,
|
|
2681
|
+
):
|
|
2682
|
+
def _get_primary_secondary_clients(cross_scenario: str):
|
|
2683
|
+
"""
|
|
2684
|
+
Returns primary and secondary AWS clients based on the cross-scenario.
|
|
2685
|
+
:param cross_scenario: The scenario for cross-region or cross-account testing.
|
|
2686
|
+
Options: "region", "account", "region_account"
|
|
2687
|
+
account_region cross scenario is not supported by AWS
|
|
2688
|
+
:return: A dictionary containing primary and secondary AWS clients, and their respective region and account IDs.
|
|
2689
|
+
"""
|
|
2690
|
+
secondary_region = secondary_region_name
|
|
2691
|
+
secondary_account = secondary_account_id
|
|
2692
|
+
if cross_scenario not in ["region", "account", "region_account"]:
|
|
2693
|
+
raise ValueError(f"cross_scenario {cross_scenario} not supported")
|
|
2694
|
+
|
|
2695
|
+
primary_client = aws_client_factory(region_name=region_name)
|
|
2696
|
+
|
|
2697
|
+
if cross_scenario == "region":
|
|
2698
|
+
secondary_account = account_id
|
|
2699
|
+
secondary_client = aws_client_factory(region_name=secondary_region_name)
|
|
2700
|
+
|
|
2701
|
+
elif cross_scenario == "account":
|
|
2702
|
+
secondary_region = region_name
|
|
2703
|
+
secondary_client = secondary_aws_client_factory(region_name=region_name)
|
|
2704
|
+
|
|
2705
|
+
elif cross_scenario == "region_account":
|
|
2706
|
+
secondary_client = secondary_aws_client_factory(region_name=secondary_region)
|
|
2707
|
+
|
|
2708
|
+
return {
|
|
2709
|
+
"primary_aws_client": primary_client,
|
|
2710
|
+
"secondary_aws_client": secondary_client,
|
|
2711
|
+
"secondary_region_name": secondary_region,
|
|
2712
|
+
"secondary_account_id": secondary_account,
|
|
2713
|
+
}
|
|
2714
|
+
|
|
2715
|
+
return _get_primary_secondary_clients
|
|
2716
|
+
|
|
2717
|
+
|
|
2579
2718
|
@pytest.fixture
|
|
2580
2719
|
def clean_up(
|
|
2581
2720
|
aws_client,
|
|
@@ -2598,10 +2737,10 @@ def clean_up(
|
|
|
2598
2737
|
if rule_name:
|
|
2599
2738
|
call_safe(events_client.delete_rule, kwargs=dict(Name=rule_name, Force=True, **kwargs))
|
|
2600
2739
|
if bus_name:
|
|
2601
|
-
call_safe(events_client.delete_event_bus, kwargs=
|
|
2740
|
+
call_safe(events_client.delete_event_bus, kwargs={"Name": bus_name})
|
|
2602
2741
|
if queue_url:
|
|
2603
2742
|
sqs_client = aws_client.sqs
|
|
2604
|
-
call_safe(sqs_client.delete_queue, kwargs=
|
|
2743
|
+
call_safe(sqs_client.delete_queue, kwargs={"QueueUrl": queue_url})
|
|
2605
2744
|
if log_group_name:
|
|
2606
2745
|
logs_client = aws_client.logs
|
|
2607
2746
|
|
|
@@ -63,15 +63,13 @@ def pytest_runtestloop(session: Session):
|
|
|
63
63
|
return
|
|
64
64
|
LOG.info("TEST_FORCE_LOCALSTACK_START is set, a Localstack instance will be created.")
|
|
65
65
|
|
|
66
|
-
from localstack.utils.common import safe_requests
|
|
67
|
-
|
|
68
66
|
if is_aws_cloud():
|
|
69
67
|
localstack_config.DEFAULT_DELAY = 5
|
|
70
68
|
localstack_config.DEFAULT_MAX_ATTEMPTS = 60
|
|
71
69
|
|
|
72
70
|
# configure
|
|
73
71
|
os.environ[ENV_INTERNAL_TEST_RUN] = "1"
|
|
74
|
-
|
|
72
|
+
localstack_config.INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE = True
|
|
75
73
|
|
|
76
74
|
from localstack.runtime import current
|
|
77
75
|
|
|
@@ -3,7 +3,8 @@ Custom pytest mark typings
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
7
8
|
|
|
8
9
|
import pytest
|
|
9
10
|
from _pytest.config import PytestPluginManager
|
|
@@ -36,13 +37,13 @@ class SkipSnapshotVerifyMarker:
|
|
|
36
37
|
def __call__(
|
|
37
38
|
self,
|
|
38
39
|
*,
|
|
39
|
-
paths: "
|
|
40
|
-
condition: "
|
|
40
|
+
paths: "list[str] | None" = None,
|
|
41
|
+
condition: "Callable[[...], bool] | None" = None,
|
|
41
42
|
): ...
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
class MultiRuntimeMarker:
|
|
45
|
-
def __call__(self, *, scenario: str, runtimes:
|
|
46
|
+
def __call__(self, *, scenario: str, runtimes: list[str] | None = None): ...
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
class SnapshotMarkers:
|
|
@@ -58,13 +59,27 @@ class Markers:
|
|
|
58
59
|
|
|
59
60
|
# test selection
|
|
60
61
|
acceptance_test = pytest.mark.acceptance_test
|
|
62
|
+
"""This test is an acceptance test"""
|
|
61
63
|
skip_offline = pytest.mark.skip_offline
|
|
64
|
+
"""Test is skipped if offline, as it requires some sort of internet connection to run"""
|
|
62
65
|
only_on_amd64 = pytest.mark.only_on_amd64
|
|
66
|
+
"""Test requires ability of the system to execute amd64 binaries"""
|
|
63
67
|
only_on_arm64 = pytest.mark.only_on_arm64
|
|
68
|
+
"""Test requires ability of the system to execute arm64 binaries"""
|
|
64
69
|
resource_heavy = pytest.mark.resource_heavy
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
"""Test is very resource heavy, and might be skipped in CI"""
|
|
71
|
+
requires_in_container = pytest.mark.requires_in_container
|
|
72
|
+
"""Test requires LocalStack to run inside a container"""
|
|
73
|
+
requires_in_process = pytest.mark.requires_in_process
|
|
74
|
+
"""The test and the LS instance have to be run in the same process"""
|
|
75
|
+
requires_docker = pytest.mark.requires_docker
|
|
76
|
+
"""The test requires docker or a compatible container engine - will not work on kubernetes"""
|
|
67
77
|
lambda_runtime_update = pytest.mark.lambda_runtime_update
|
|
78
|
+
"""Tests to execute when updating snapshots for a new Lambda runtime"""
|
|
79
|
+
k8s_always_run = pytest.mark.k8s_always_run
|
|
80
|
+
"""This tests will always run against k8s environment"""
|
|
81
|
+
skip_k8s = pytest.mark.skip_k8s
|
|
82
|
+
"""This test will be skipped in k8s environment"""
|
|
68
83
|
|
|
69
84
|
|
|
70
85
|
# pytest plugin
|
|
@@ -82,7 +97,7 @@ def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager):
|
|
|
82
97
|
)
|
|
83
98
|
|
|
84
99
|
|
|
85
|
-
def enforce_single_aws_marker(items:
|
|
100
|
+
def enforce_single_aws_marker(items: list[pytest.Item]):
|
|
86
101
|
"""Enforce that each test has exactly one aws compatibility marker"""
|
|
87
102
|
marker_errors = []
|
|
88
103
|
|
|
@@ -91,7 +106,7 @@ def enforce_single_aws_marker(items: List[pytest.Item]):
|
|
|
91
106
|
if "tests/aws" not in item.fspath.dirname:
|
|
92
107
|
continue
|
|
93
108
|
|
|
94
|
-
aws_markers =
|
|
109
|
+
aws_markers = []
|
|
95
110
|
for mark in item.iter_markers():
|
|
96
111
|
if mark.name.startswith("aws_"):
|
|
97
112
|
aws_markers.append(mark.name)
|
|
@@ -107,7 +122,7 @@ def enforce_single_aws_marker(items: List[pytest.Item]):
|
|
|
107
122
|
raise pytest.UsageError(*marker_errors)
|
|
108
123
|
|
|
109
124
|
|
|
110
|
-
def filter_by_markers(config: "Config", items:
|
|
125
|
+
def filter_by_markers(config: "Config", items: list[pytest.Item]):
|
|
111
126
|
"""Filter tests by markers."""
|
|
112
127
|
from localstack import config as localstack_config
|
|
113
128
|
from localstack.utils.bootstrap import in_ci
|
|
@@ -131,8 +146,8 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
|
|
|
131
146
|
"Add network connectivity and remove the --offline option when running "
|
|
132
147
|
"the test."
|
|
133
148
|
)
|
|
134
|
-
|
|
135
|
-
reason="Test requires execution inside
|
|
149
|
+
requires_in_container = pytest.mark.skip(
|
|
150
|
+
reason="Test requires execution inside a container (e.g., to install system packages)"
|
|
136
151
|
)
|
|
137
152
|
only_on_amd64 = pytest.mark.skip(
|
|
138
153
|
reason="Test uses features that are currently only supported for AMD64. Skipping in CI."
|
|
@@ -144,8 +159,8 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
|
|
|
144
159
|
for item in items:
|
|
145
160
|
if is_offline and "skip_offline" in item.keywords:
|
|
146
161
|
item.add_marker(skip_offline)
|
|
147
|
-
if not is_in_docker and "
|
|
148
|
-
item.add_marker(
|
|
162
|
+
if not is_in_docker and "requires_in_container" in item.keywords:
|
|
163
|
+
item.add_marker(requires_in_container)
|
|
149
164
|
if is_in_ci and not is_amd64 and "only_on_amd64" in item.keywords:
|
|
150
165
|
item.add_marker(only_on_amd64)
|
|
151
166
|
if is_in_ci and not is_arm64 and "only_on_arm64" in item.keywords:
|
|
@@ -154,7 +169,7 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
|
|
|
154
169
|
|
|
155
170
|
@pytest.hookimpl
|
|
156
171
|
def pytest_collection_modifyitems(
|
|
157
|
-
session: pytest.Session, config: "Config", items:
|
|
172
|
+
session: pytest.Session, config: "Config", items: list[pytest.Item]
|
|
158
173
|
) -> None:
|
|
159
174
|
enforce_single_aws_marker(items)
|
|
160
175
|
filter_by_markers(config, items)
|
|
@@ -177,7 +192,7 @@ def pytest_configure(config):
|
|
|
177
192
|
)
|
|
178
193
|
config.addinivalue_line(
|
|
179
194
|
"markers",
|
|
180
|
-
"
|
|
195
|
+
"requires_in_container: mark the test as running only in a container (e.g., requires installation of system packages)",
|
|
181
196
|
)
|
|
182
197
|
config.addinivalue_line(
|
|
183
198
|
"markers",
|
|
@@ -208,3 +223,15 @@ def pytest_configure(config):
|
|
|
208
223
|
"markers",
|
|
209
224
|
"multiruntime: parametrize test against multiple Lambda runtimes",
|
|
210
225
|
)
|
|
226
|
+
config.addinivalue_line(
|
|
227
|
+
"markers",
|
|
228
|
+
"requires_docker: mark the test as requiring docker (or a compatible container engine) - will not work on kubernetes.",
|
|
229
|
+
)
|
|
230
|
+
config.addinivalue_line(
|
|
231
|
+
"markers",
|
|
232
|
+
"requires_in_process: mark the test as requiring the test to run inside the same process as LocalStack - will not work if tests are run against a running LS container.",
|
|
233
|
+
)
|
|
234
|
+
config.addinivalue_line(
|
|
235
|
+
"markers",
|
|
236
|
+
"k8s_always_run: mark the test to always run in k8s environment. This allows us to run tests that would otherwise be skipped, such as localstack_only tests.",
|
|
237
|
+
)
|
|
@@ -49,7 +49,7 @@ def pytest_collection_modifyitems(config, items):
|
|
|
49
49
|
if not os.path.exists(pathfilter_file):
|
|
50
50
|
raise ValueError(f"Pathfilter file does not exist: {pathfilter_file}")
|
|
51
51
|
|
|
52
|
-
with open(pathfilter_file
|
|
52
|
+
with open(pathfilter_file) as f:
|
|
53
53
|
pathfilter_substrings = [line.strip() for line in f.readlines() if line.strip()]
|
|
54
54
|
|
|
55
55
|
if not pathfilter_substrings:
|
|
@@ -271,7 +271,7 @@ def create_state_machine_iam_role(cleanups, create_state_machine):
|
|
|
271
271
|
|
|
272
272
|
@pytest.fixture
|
|
273
273
|
def create_state_machine():
|
|
274
|
-
created_state_machine_references =
|
|
274
|
+
created_state_machine_references = []
|
|
275
275
|
|
|
276
276
|
def _create_state_machine(target_aws_client, **kwargs):
|
|
277
277
|
sfn_client = target_aws_client.stepfunctions
|
|
@@ -299,7 +299,7 @@ def create_state_machine():
|
|
|
299
299
|
|
|
300
300
|
@pytest.fixture
|
|
301
301
|
def create_state_machine_alias():
|
|
302
|
-
state_machine_alias_arn_and_client =
|
|
302
|
+
state_machine_alias_arn_and_client = []
|
|
303
303
|
|
|
304
304
|
def _create_state_machine_alias(target_aws_client, **kwargs):
|
|
305
305
|
step_functions_client = target_aws_client.stepfunctions
|
|
@@ -324,7 +324,7 @@ def create_state_machine_alias():
|
|
|
324
324
|
|
|
325
325
|
@pytest.fixture
|
|
326
326
|
def create_activity(aws_client):
|
|
327
|
-
activities_arns: Final[list[str]] =
|
|
327
|
+
activities_arns: Final[list[str]] = []
|
|
328
328
|
|
|
329
329
|
def _create_activity(**kwargs):
|
|
330
330
|
create_output = aws_client.stepfunctions.create_activity(**kwargs)
|
|
@@ -778,7 +778,7 @@ def sfn_create_log_group(aws_client, snapshot):
|
|
|
778
778
|
|
|
779
779
|
@pytest.fixture
|
|
780
780
|
def create_cross_account_admin_role_and_policy(create_state_machine, create_state_machine_iam_role):
|
|
781
|
-
created =
|
|
781
|
+
created = []
|
|
782
782
|
|
|
783
783
|
def _create_role_and_policy(trusting_aws_client, trusted_aws_client, trusted_account_id) -> str:
|
|
784
784
|
trusting_iam_client = trusting_aws_client.iam
|