localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- localstack/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/cloudformation/__init__.py +18 -4
- localstack/aws/api/cloudwatch/__init__.py +41 -1
- localstack/aws/api/config/__init__.py +4 -0
- localstack/aws/api/core.py +8 -5
- localstack/aws/api/dynamodb/__init__.py +30 -0
- localstack/aws/api/ec2/__init__.py +1545 -66
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/iam/__init__.py +7 -0
- localstack/aws/api/kinesis/__init__.py +19 -0
- localstack/aws/api/kms/__init__.py +6 -0
- localstack/aws/api/lambda_/__init__.py +36 -23
- localstack/aws/api/logs/__init__.py +20 -8
- localstack/aws/api/opensearch/__init__.py +16 -0
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/redshift/__init__.py +9 -3
- localstack/aws/api/route53/__init__.py +5 -0
- localstack/aws/api/s3/__init__.py +12 -0
- localstack/aws/api/s3control/__init__.py +56 -0
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/ssm/__init__.py +2 -0
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/api/transcribe/__init__.py +17 -0
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +14 -11
- localstack/aws/connect.py +42 -41
- localstack/aws/forwarder.py +57 -9
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +2 -3
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/internal_requests.py +6 -1
- localstack/aws/handlers/logging.py +13 -4
- localstack/aws/handlers/metric_handler.py +44 -5
- localstack/aws/handlers/service.py +48 -28
- localstack/aws/mocking.py +18 -27
- localstack/aws/patches.py +2 -2
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +475 -49
- localstack/aws/protocol/serializer.py +723 -106
- localstack/aws/protocol/service_router.py +133 -33
- localstack/aws/protocol/validate.py +6 -6
- localstack/aws/scaffold.py +9 -10
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +12 -11
- localstack/aws/spec-patches.json +58 -0
- localstack/aws/spec.py +66 -46
- localstack/cli/exceptions.py +1 -1
- localstack/cli/localstack.py +11 -11
- localstack/cli/lpm.py +4 -5
- localstack/cli/plugins.py +1 -1
- localstack/cli/profiles.py +1 -2
- localstack/config.py +44 -30
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +130 -7
- localstack/dev/run/__main__.py +5 -5
- localstack/dev/run/configurators.py +1 -4
- localstack/dev/run/paths.py +6 -6
- localstack/dns/models.py +2 -1
- localstack/dns/plugins.py +5 -1
- localstack/dns/server.py +16 -6
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +6 -6
- localstack/packages/api.py +13 -12
- localstack/packages/core.py +4 -4
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +38 -12
- localstack/packages/plugins.py +0 -8
- localstack/runtime/analytics.py +3 -0
- localstack/runtime/hooks.py +1 -1
- localstack/runtime/init.py +8 -9
- localstack/runtime/main.py +5 -5
- localstack/runtime/patches.py +2 -2
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +7 -10
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +27 -28
- localstack/services/apigateway/legacy/integration.py +11 -10
- localstack/services/apigateway/legacy/invocations.py +6 -5
- localstack/services/apigateway/legacy/provider.py +148 -68
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +6 -6
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
- localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
- localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/next_gen/provider.py +5 -0
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/api_utils.py +4 -8
- localstack/services/cloudformation/cfn_utils.py +2 -2
- localstack/services/cloudformation/deployment_utils.py +14 -12
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +27 -17
- localstack/services/cloudformation/engine/parameters.py +4 -4
- localstack/services/cloudformation/engine/template_deployer.py +15 -14
- localstack/services/cloudformation/engine/template_utils.py +34 -12
- localstack/services/cloudformation/engine/transformers.py +11 -8
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
- localstack/services/cloudformation/engine/v2/resolving.py +102 -0
- localstack/services/cloudformation/engine/yaml_parser.py +9 -2
- localstack/services/cloudformation/provider.py +11 -6
- localstack/services/cloudformation/provider_utils.py +34 -4
- localstack/services/cloudformation/resource_provider.py +31 -21
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/resources.py +24149 -0
- localstack/services/cloudformation/scaffolding/__main__.py +13 -12
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/service_models.py +2 -2
- localstack/services/cloudformation/stores.py +33 -22
- localstack/services/cloudformation/v2/entities.py +103 -88
- localstack/services/cloudformation/v2/provider.py +872 -131
- localstack/services/cloudformation/v2/types.py +38 -0
- localstack/services/cloudformation/v2/utils.py +4 -1
- localstack/services/cloudwatch/alarm_scheduler.py +11 -8
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +30 -25
- localstack/services/cloudwatch/provider_v2.py +27 -32
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +3 -3
- localstack/services/dynamodb/provider.py +159 -18
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/server.py +2 -2
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +157 -18
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +26 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +6 -6
- localstack/services/es/provider.py +21 -21
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/event_rule_engine.py +31 -13
- localstack/services/events/models.py +29 -30
- localstack/services/events/provider.py +29 -26
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +21 -13
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +15 -15
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +25 -16
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +14 -119
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/iam/resources/policy_simulator.py +133 -0
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +17 -5
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/provider.py +86 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +21 -18
- localstack/services/kms/provider.py +62 -26
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +4 -3
- localstack/services/lambda_/api_utils.py +19 -16
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
- localstack/services/lambda_/invocation/event_manager.py +1 -1
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
- localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
- localstack/services/lambda_/invocation/lambda_models.py +33 -30
- localstack/services/lambda_/invocation/lambda_service.py +12 -5
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/invocation/version_manager.py +31 -8
- localstack/services/lambda_/ldm.py +14 -0
- localstack/services/lambda_/packages.py +3 -4
- localstack/services/lambda_/provider.py +9 -26
- localstack/services/lambda_/provider_utils.py +1 -1
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/lambda_/urlrouter.py +14 -1
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +39 -22
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +5 -4
- localstack/services/opensearch/cluster.py +28 -20
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +27 -9
- localstack/services/opensearch/provider.py +15 -10
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +57 -10
- localstack/services/plugins.py +37 -32
- localstack/services/providers.py +10 -2
- localstack/services/redshift/provider.py +0 -21
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/constants.py +5 -2
- localstack/services/s3/cors.py +8 -8
- localstack/services/s3/models.py +73 -73
- localstack/services/s3/notifications.py +74 -58
- localstack/services/s3/presigned_url.py +41 -59
- localstack/services/s3/provider.py +86 -29
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +51 -31
- localstack/services/s3/validation.py +47 -33
- localstack/services/s3/website_hosting.py +9 -7
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +10 -12
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/models.py +8 -1
- localstack/services/ses/provider.py +128 -55
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/constants.py +7 -1
- localstack/services/sns/executor.py +9 -2
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +9 -7
- localstack/services/sns/publisher.py +37 -23
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sns/v2/models.py +167 -0
- localstack/services/sns/v2/provider.py +867 -0
- localstack/services/sns/v2/utils.py +130 -0
- localstack/services/sqs/constants.py +2 -2
- localstack/services/sqs/developer_api.py +205 -0
- localstack/services/sqs/models.py +71 -36
- localstack/services/sqs/provider.py +56 -332
- localstack/services/sqs/query_api.py +8 -5
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +123 -4
- localstack/services/ssm/provider.py +3 -4
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +9 -9
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
- localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +22 -24
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +12 -12
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
- localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +8 -8
- localstack/services/stepfunctions/backend/execution.py +29 -30
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +28 -28
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +9 -9
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/packages.py +14 -5
- localstack/services/stepfunctions/provider.py +34 -44
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +8 -8
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +8 -3
- localstack/state/codecs.py +61 -0
- localstack/state/core.py +11 -5
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +36 -23
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/cloudformation_utils.py +1 -1
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +68 -18
- localstack/testing/pytest/container.py +5 -5
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +188 -49
- localstack/testing/pytest/in_memory_localstack.py +1 -3
- localstack/testing/pytest/marking.py +42 -15
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +11 -10
- localstack/testing/pytest/util.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -4
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +8 -3
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metadata.py +6 -4
- localstack/utils/analytics/metrics/counter.py +11 -18
- localstack/utils/analytics/metrics/registry.py +2 -2
- localstack/utils/analytics/publisher.py +4 -5
- localstack/utils/analytics/service_providers.py +19 -0
- localstack/utils/analytics/service_request_aggregator.py +4 -4
- localstack/utils/archives.py +12 -12
- localstack/utils/asyncio.py +2 -2
- localstack/utils/aws/arns.py +26 -31
- localstack/utils/aws/aws_responses.py +21 -28
- localstack/utils/aws/aws_stack.py +7 -12
- localstack/utils/aws/dead_letter_queue.py +4 -9
- localstack/utils/aws/message_forwarding.py +8 -11
- localstack/utils/aws/request_context.py +5 -6
- localstack/utils/aws/resources.py +1 -1
- localstack/utils/aws/templating.py +4 -4
- localstack/utils/batch_policy.py +4 -4
- localstack/utils/bootstrap.py +37 -30
- localstack/utils/catalog/catalog.py +139 -0
- localstack/utils/catalog/catalog_loader.py +119 -0
- localstack/utils/catalog/common.py +58 -0
- localstack/utils/catalog/plugins.py +28 -0
- localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
- localstack/utils/collections.py +33 -27
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +5 -6
- localstack/utils/container_utils/container_client.py +156 -160
- localstack/utils/container_utils/docker_cmd_client.py +97 -81
- localstack/utils/container_utils/docker_sdk_client.py +75 -72
- localstack/utils/crypto.py +12 -13
- localstack/utils/diagnose.py +11 -12
- localstack/utils/docker_utils.py +11 -7
- localstack/utils/files.py +34 -15
- localstack/utils/functions.py +5 -4
- localstack/utils/http.py +14 -14
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +21 -7
- localstack/utils/kinesis/kinesis_connector.py +2 -1
- localstack/utils/net.py +25 -17
- localstack/utils/no_exit_argument_parser.py +2 -2
- localstack/utils/numbers.py +9 -2
- localstack/utils/objects.py +15 -14
- localstack/utils/patch.py +14 -7
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +15 -14
- localstack/utils/scheduler.py +13 -12
- localstack/utils/server/tcp_proxy.py +2 -2
- localstack/utils/serving.py +3 -4
- localstack/utils/strings.py +15 -16
- localstack/utils/sync.py +126 -1
- localstack/utils/tagging.py +10 -8
- localstack/utils/testutil.py +17 -17
- localstack/utils/threads.py +3 -3
- localstack/utils/time.py +12 -4
- localstack/utils/urls.py +1 -3
- localstack/utils/xml.py +1 -1
- localstack/utils/xray/traceid.py +1 -1
- localstack/version.py +16 -3
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
- localstack/packages/terraform.py +0 -47
- localstack/services/cloudformation/deploy.html +0 -144
- localstack/services/cloudformation/deploy_ui.py +0 -47
- localstack/services/cloudformation/plugins.py +0 -12
- localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
- localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
- /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
localstack/utils/scheduler.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import queue
|
|
2
2
|
import threading
|
|
3
3
|
import time
|
|
4
|
+
from collections.abc import Callable, Mapping
|
|
4
5
|
from concurrent.futures import Executor
|
|
5
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class ScheduledTask:
|
|
@@ -13,12 +14,12 @@ class ScheduledTask:
|
|
|
13
14
|
def __init__(
|
|
14
15
|
self,
|
|
15
16
|
task: Callable,
|
|
16
|
-
period:
|
|
17
|
+
period: float | None = None,
|
|
17
18
|
fixed_rate: bool = True,
|
|
18
|
-
start:
|
|
19
|
+
start: float | None = None,
|
|
19
20
|
on_error: Callable[[Exception], None] = None,
|
|
20
|
-
args:
|
|
21
|
-
kwargs:
|
|
21
|
+
args: tuple | list | None = None,
|
|
22
|
+
kwargs: Mapping[str, Any] | None = None,
|
|
22
23
|
) -> None:
|
|
23
24
|
super().__init__()
|
|
24
25
|
self.task = task
|
|
@@ -26,8 +27,8 @@ class ScheduledTask:
|
|
|
26
27
|
self.period = period
|
|
27
28
|
self.start = start
|
|
28
29
|
self.on_error = on_error
|
|
29
|
-
self.args = args or
|
|
30
|
-
self.kwargs = kwargs or
|
|
30
|
+
self.args = args or ()
|
|
31
|
+
self.kwargs = kwargs or {}
|
|
31
32
|
|
|
32
33
|
self.deadline = None
|
|
33
34
|
self.error = None
|
|
@@ -75,7 +76,7 @@ class Scheduler:
|
|
|
75
76
|
|
|
76
77
|
POISON = (-1, "__POISON__")
|
|
77
78
|
|
|
78
|
-
def __init__(self, executor:
|
|
79
|
+
def __init__(self, executor: Executor | None = None) -> None:
|
|
79
80
|
"""
|
|
80
81
|
Creates a new Scheduler. If an executor is passed, then that executor will be used to run the scheduled tasks
|
|
81
82
|
asynchronously, otherwise they will be executed synchronously inside the event loop. Running tasks
|
|
@@ -93,12 +94,12 @@ class Scheduler:
|
|
|
93
94
|
def schedule(
|
|
94
95
|
self,
|
|
95
96
|
func: Callable,
|
|
96
|
-
period:
|
|
97
|
+
period: float | None = None,
|
|
97
98
|
fixed_rate: bool = True,
|
|
98
|
-
start:
|
|
99
|
+
start: float | None = None,
|
|
99
100
|
on_error: Callable[[Exception], None] = None,
|
|
100
|
-
args:
|
|
101
|
-
kwargs:
|
|
101
|
+
args: tuple | list[Any] | None = None,
|
|
102
|
+
kwargs: Mapping[str, Any] | None = None,
|
|
102
103
|
) -> ScheduledTask:
|
|
103
104
|
"""
|
|
104
105
|
Schedules a given task (function call).
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import select
|
|
3
3
|
import socket
|
|
4
|
+
from collections.abc import Callable
|
|
4
5
|
from concurrent.futures import ThreadPoolExecutor
|
|
5
|
-
from typing import Callable
|
|
6
6
|
|
|
7
7
|
from localstack.utils.serving import Server
|
|
8
8
|
|
|
@@ -93,7 +93,7 @@ class TCPProxy(Server):
|
|
|
93
93
|
try:
|
|
94
94
|
src_socket, _ = self._server_socket.accept()
|
|
95
95
|
self._thread_pool.submit(self._handle_request, src_socket)
|
|
96
|
-
except
|
|
96
|
+
except TimeoutError:
|
|
97
97
|
pass
|
|
98
98
|
except OSError as e:
|
|
99
99
|
# avoid creating an error message if OSError is thrown due to socket closing
|
localstack/utils/serving.py
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import abc
|
|
2
2
|
import logging
|
|
3
3
|
import threading
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from localstack.utils.net import is_port_open
|
|
7
6
|
from localstack.utils.sync import poll_condition
|
|
@@ -21,7 +20,7 @@ class Server(abc.ABC):
|
|
|
21
20
|
|
|
22
21
|
def __init__(self, port: int, host: str = "localhost") -> None:
|
|
23
22
|
super().__init__()
|
|
24
|
-
self._thread:
|
|
23
|
+
self._thread: FuncThread | None = None
|
|
25
24
|
|
|
26
25
|
self._lifecycle_lock = threading.RLock()
|
|
27
26
|
self._stopped = threading.Event()
|
|
@@ -44,9 +43,9 @@ class Server(abc.ABC):
|
|
|
44
43
|
|
|
45
44
|
@property
|
|
46
45
|
def url(self):
|
|
47
|
-
return "
|
|
46
|
+
return f"{self.protocol}://{self.host}:{self.port}"
|
|
48
47
|
|
|
49
|
-
def get_error(self) ->
|
|
48
|
+
def get_error(self) -> Exception | None:
|
|
50
49
|
"""
|
|
51
50
|
If the thread running the server returned with an Exception, then this function will return that exception.
|
|
52
51
|
"""
|
localstack/utils/strings.py
CHANGED
|
@@ -7,7 +7,6 @@ import re
|
|
|
7
7
|
import string
|
|
8
8
|
import uuid
|
|
9
9
|
import zlib
|
|
10
|
-
from typing import Dict, List, Union
|
|
11
10
|
|
|
12
11
|
from localstack.config import DEFAULT_ENCODING
|
|
13
12
|
|
|
@@ -28,13 +27,13 @@ REGEX_UNPRINTABLE_CHARS = re.compile(
|
|
|
28
27
|
)
|
|
29
28
|
|
|
30
29
|
|
|
31
|
-
def to_str(obj:
|
|
30
|
+
def to_str(obj: str | bytes, encoding: str = DEFAULT_ENCODING, errors="strict") -> str:
|
|
32
31
|
"""If ``obj`` is an instance of ``binary_type``, return
|
|
33
32
|
``obj.decode(encoding, errors)``, otherwise return ``obj``"""
|
|
34
33
|
return obj.decode(encoding, errors) if isinstance(obj, bytes) else obj
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
def to_bytes(obj:
|
|
36
|
+
def to_bytes(obj: str | bytes, encoding: str = DEFAULT_ENCODING, errors="strict") -> bytes:
|
|
38
37
|
"""If ``obj`` is an instance of ``text_type``, return
|
|
39
38
|
``obj.encode(encoding, errors)``, otherwise return ``obj``"""
|
|
40
39
|
return obj.encode(encoding, errors) if isinstance(obj, str) else obj
|
|
@@ -42,7 +41,7 @@ def to_bytes(obj: Union[str, bytes], encoding: str = DEFAULT_ENCODING, errors="s
|
|
|
42
41
|
|
|
43
42
|
def truncate(data: str, max_length: int = 100) -> str:
|
|
44
43
|
data = str(data or "")
|
|
45
|
-
return ("
|
|
44
|
+
return (f"{data[:max_length]}...") if len(data) > max_length else data
|
|
46
45
|
|
|
47
46
|
|
|
48
47
|
def is_string(s, include_unicode=True, exclude_binary=False):
|
|
@@ -86,7 +85,7 @@ def canonicalize_bool_to_str(val: bool) -> str:
|
|
|
86
85
|
return "true" if str(val).lower() == "true" else "false"
|
|
87
86
|
|
|
88
87
|
|
|
89
|
-
def convert_to_printable_chars(value:
|
|
88
|
+
def convert_to_printable_chars(value: list | dict | str) -> str:
|
|
90
89
|
"""Removes all unprintable characters from the given string."""
|
|
91
90
|
from localstack.utils.objects import recurse_object
|
|
92
91
|
|
|
@@ -104,11 +103,11 @@ def convert_to_printable_chars(value: Union[List, Dict, str]) -> str:
|
|
|
104
103
|
|
|
105
104
|
|
|
106
105
|
def first_char_to_lower(s: str) -> str:
|
|
107
|
-
return s and "
|
|
106
|
+
return s and f"{s[0].lower()}{s[1:]}"
|
|
108
107
|
|
|
109
108
|
|
|
110
109
|
def first_char_to_upper(s: str) -> str:
|
|
111
|
-
return s and "
|
|
110
|
+
return s and f"{s[0].upper()}{s[1:]}"
|
|
112
111
|
|
|
113
112
|
|
|
114
113
|
def str_to_bool(value):
|
|
@@ -121,13 +120,13 @@ def str_to_bool(value):
|
|
|
121
120
|
|
|
122
121
|
def str_insert(string, index, content):
|
|
123
122
|
"""Insert a substring into an existing string at a certain index."""
|
|
124
|
-
return "
|
|
123
|
+
return f"{string[:index]}{content}{string[index:]}"
|
|
125
124
|
|
|
126
125
|
|
|
127
126
|
def str_remove(string, index, end_index=None):
|
|
128
127
|
"""Remove a substring from an existing string at a certain from-to index range."""
|
|
129
128
|
end_index = end_index or (index + 1)
|
|
130
|
-
return "
|
|
129
|
+
return f"{string[:index]}{string[end_index:]}"
|
|
131
130
|
|
|
132
131
|
|
|
133
132
|
def str_startswith_ignore_case(value: str, prefix: str) -> bool:
|
|
@@ -148,19 +147,19 @@ def long_uid() -> str:
|
|
|
148
147
|
return str(uuid.uuid4())
|
|
149
148
|
|
|
150
149
|
|
|
151
|
-
def md5(string:
|
|
150
|
+
def md5(string: str | bytes) -> str:
|
|
152
151
|
m = hashlib.md5()
|
|
153
152
|
m.update(to_bytes(string))
|
|
154
153
|
return m.hexdigest()
|
|
155
154
|
|
|
156
155
|
|
|
157
|
-
def checksum_crc32(string:
|
|
156
|
+
def checksum_crc32(string: str | bytes) -> str:
|
|
158
157
|
bytes = to_bytes(string)
|
|
159
158
|
checksum = zlib.crc32(bytes)
|
|
160
159
|
return base64.b64encode(checksum.to_bytes(4, "big")).decode()
|
|
161
160
|
|
|
162
161
|
|
|
163
|
-
def checksum_crc32c(string:
|
|
162
|
+
def checksum_crc32c(string: str | bytes):
|
|
164
163
|
# import botocore locally here to avoid a dependency of the CLI to botocore
|
|
165
164
|
from botocore.httpchecksum import CrtCrc32cChecksum
|
|
166
165
|
|
|
@@ -169,7 +168,7 @@ def checksum_crc32c(string: Union[str, bytes]):
|
|
|
169
168
|
return base64.b64encode(checksum.digest()).decode()
|
|
170
169
|
|
|
171
170
|
|
|
172
|
-
def checksum_crc64nvme(string:
|
|
171
|
+
def checksum_crc64nvme(string: str | bytes):
|
|
173
172
|
# import botocore locally here to avoid a dependency of the CLI to botocore
|
|
174
173
|
from botocore.httpchecksum import CrtCrc64NvmeChecksum
|
|
175
174
|
|
|
@@ -178,12 +177,12 @@ def checksum_crc64nvme(string: Union[str, bytes]):
|
|
|
178
177
|
return base64.b64encode(checksum.digest()).decode()
|
|
179
178
|
|
|
180
179
|
|
|
181
|
-
def hash_sha1(string:
|
|
180
|
+
def hash_sha1(string: str | bytes) -> str:
|
|
182
181
|
digest = hashlib.sha1(to_bytes(string)).digest()
|
|
183
182
|
return base64.b64encode(digest).decode()
|
|
184
183
|
|
|
185
184
|
|
|
186
|
-
def hash_sha256(string:
|
|
185
|
+
def hash_sha256(string: str | bytes) -> str:
|
|
187
186
|
digest = hashlib.sha256(to_bytes(string)).digest()
|
|
188
187
|
return base64.b64encode(digest).decode()
|
|
189
188
|
|
|
@@ -192,7 +191,7 @@ def base64_to_hex(b64_string: str) -> bytes:
|
|
|
192
191
|
return binascii.hexlify(base64.b64decode(b64_string))
|
|
193
192
|
|
|
194
193
|
|
|
195
|
-
def base64_decode(data:
|
|
194
|
+
def base64_decode(data: str | bytes) -> bytes:
|
|
196
195
|
"""Decode base64 data - with optional padding, and able to handle urlsafe encoding (containing -/_)."""
|
|
197
196
|
data = to_str(data)
|
|
198
197
|
missing_padding = len(data) % 4
|
localstack/utils/sync.py
CHANGED
|
@@ -4,7 +4,8 @@ import functools
|
|
|
4
4
|
import threading
|
|
5
5
|
import time
|
|
6
6
|
from collections import defaultdict
|
|
7
|
-
from
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from typing import Literal, TypeVar
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class ShortCircuitWaitException(Exception):
|
|
@@ -140,3 +141,127 @@ class SynchronizedDefaultDict(defaultdict):
|
|
|
140
141
|
def __str__(self):
|
|
141
142
|
with self._lock:
|
|
142
143
|
return super().__str__()
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class Once:
|
|
147
|
+
"""
|
|
148
|
+
An object that will perform an action exactly once.
|
|
149
|
+
Inspired by Golang's [sync.Once](https://pkg.go.dev/sync#Once) operation.
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
### Example 1
|
|
153
|
+
|
|
154
|
+
Multiple threads using `Once::do` to ensure only 1 line is printed.
|
|
155
|
+
|
|
156
|
+
```python
|
|
157
|
+
import threading
|
|
158
|
+
import time
|
|
159
|
+
import random
|
|
160
|
+
|
|
161
|
+
greet_once = Once()
|
|
162
|
+
def greet():
|
|
163
|
+
print("This should happen only once.")
|
|
164
|
+
|
|
165
|
+
greet_threads = []
|
|
166
|
+
for _ in range(10):
|
|
167
|
+
t = threading.Thread(target=lambda: greet_once.do(greet))
|
|
168
|
+
greet_threads.append(t)
|
|
169
|
+
t.start()
|
|
170
|
+
|
|
171
|
+
for t in greet_threads:
|
|
172
|
+
t.join()
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
### Example 2
|
|
177
|
+
|
|
178
|
+
Ensuring idemponent calling to prevent exceptions on multiple calls.
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
import os
|
|
182
|
+
|
|
183
|
+
class Service:
|
|
184
|
+
close_once: sync.Once
|
|
185
|
+
|
|
186
|
+
def start(self):
|
|
187
|
+
with open("my-service.txt) as f:
|
|
188
|
+
myfile.write("Started service")
|
|
189
|
+
|
|
190
|
+
def close(self):
|
|
191
|
+
# Ensure we only ever delete the file once on close
|
|
192
|
+
self.close_once.do(lambda: os.remove("my-service.txt"))
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
_is_done: bool = False
|
|
200
|
+
_mu: threading.Lock = threading.Lock()
|
|
201
|
+
|
|
202
|
+
def do(self, fn: Callable[[], None]):
|
|
203
|
+
"""
|
|
204
|
+
`do` calls the function `fn()` if-and-only-if `do` has never been called before.
|
|
205
|
+
|
|
206
|
+
This ensures idempotent and thread-safe execution.
|
|
207
|
+
|
|
208
|
+
If the function raises an exception, `do` considers `fn` as done, where subsequent calls are still no-ops.
|
|
209
|
+
"""
|
|
210
|
+
if self._is_done:
|
|
211
|
+
return
|
|
212
|
+
|
|
213
|
+
with self._mu:
|
|
214
|
+
if not self._is_done:
|
|
215
|
+
try:
|
|
216
|
+
fn()
|
|
217
|
+
finally:
|
|
218
|
+
self._is_done = True
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def once_func(fn: Callable[..., T]) -> Callable[..., T | None]:
|
|
222
|
+
"""
|
|
223
|
+
Wraps and returns a function that can only ever execute once.
|
|
224
|
+
|
|
225
|
+
The first call to the returned function will permanently set the result.
|
|
226
|
+
If the wrapped function raises an exception, this will be re-raised on each subsequent call.
|
|
227
|
+
|
|
228
|
+
This function can be used either as a decorator or called directly.
|
|
229
|
+
|
|
230
|
+
Direct usage:
|
|
231
|
+
```python
|
|
232
|
+
delete_file = once_func(os.remove)
|
|
233
|
+
|
|
234
|
+
delete_file("myfile.txt") # deletes the file
|
|
235
|
+
delete_file("myfile.txt") # does nothing
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
As a decorator:
|
|
239
|
+
```python
|
|
240
|
+
@once_func
|
|
241
|
+
def delete_file():
|
|
242
|
+
os.remove("myfile.txt")
|
|
243
|
+
|
|
244
|
+
delete_file() # deletes the file
|
|
245
|
+
delete_file() # does nothing
|
|
246
|
+
```
|
|
247
|
+
"""
|
|
248
|
+
once = Once()
|
|
249
|
+
|
|
250
|
+
result, exception = None, None
|
|
251
|
+
|
|
252
|
+
def _do(*args, **kwargs):
|
|
253
|
+
nonlocal result, exception
|
|
254
|
+
try:
|
|
255
|
+
result = fn(*args, **kwargs)
|
|
256
|
+
except Exception as e:
|
|
257
|
+
exception = e
|
|
258
|
+
raise
|
|
259
|
+
|
|
260
|
+
@functools.wraps(fn)
|
|
261
|
+
def wrapper(*args, **kwargs):
|
|
262
|
+
once.do(lambda: _do(*args, **kwargs))
|
|
263
|
+
if exception is not None:
|
|
264
|
+
raise exception
|
|
265
|
+
return result
|
|
266
|
+
|
|
267
|
+
return wrapper
|
localstack/utils/tagging.py
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
class TaggingService:
|
|
2
|
+
key_field: str
|
|
3
|
+
value_field: str
|
|
2
4
|
|
|
5
|
+
tags: dict[str, dict[str, str]]
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
def __init__(self, key_field: str = None, value_field: str = None):
|
|
7
|
+
def __init__(self, key_field: str = "Key", value_field: str = "Value"):
|
|
6
8
|
"""
|
|
7
9
|
:param key_field: the field name representing the tag key as used by botocore specs
|
|
8
10
|
:param value_field: the field name representing the tag value as used by botocore specs
|
|
9
11
|
"""
|
|
10
|
-
self.key_field = key_field
|
|
11
|
-
self.value_field = value_field
|
|
12
|
+
self.key_field = key_field
|
|
13
|
+
self.value_field = value_field
|
|
12
14
|
|
|
13
15
|
self.tags = {}
|
|
14
16
|
|
|
15
|
-
def list_tags_for_resource(self, arn: str, root_name:
|
|
17
|
+
def list_tags_for_resource(self, arn: str, root_name: str | None = None):
|
|
16
18
|
root_name = root_name or "Tags"
|
|
17
19
|
|
|
18
20
|
result = []
|
|
@@ -21,7 +23,7 @@ class TaggingService:
|
|
|
21
23
|
result.append({self.key_field: k, self.value_field: v})
|
|
22
24
|
return {root_name: result}
|
|
23
25
|
|
|
24
|
-
def tag_resource(self, arn: str, tags:
|
|
26
|
+
def tag_resource(self, arn: str, tags: list[dict[str, str]]):
|
|
25
27
|
if not tags:
|
|
26
28
|
return
|
|
27
29
|
if arn not in self.tags:
|
|
@@ -29,7 +31,7 @@ class TaggingService:
|
|
|
29
31
|
for t in tags:
|
|
30
32
|
self.tags[arn][t[self.key_field]] = t[self.value_field]
|
|
31
33
|
|
|
32
|
-
def untag_resource(self, arn: str, tag_names:
|
|
34
|
+
def untag_resource(self, arn: str, tag_names: list[str]):
|
|
33
35
|
tags = self.tags.get(arn, {})
|
|
34
36
|
for name in tag_names:
|
|
35
37
|
tags.pop(name, None)
|
localstack/utils/testutil.py
CHANGED
|
@@ -7,7 +7,8 @@ import re
|
|
|
7
7
|
import shutil
|
|
8
8
|
import tempfile
|
|
9
9
|
import time
|
|
10
|
-
from
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from typing import Any
|
|
11
12
|
|
|
12
13
|
from localstack.aws.api.lambda_ import Runtime
|
|
13
14
|
from localstack.aws.connect import connect_externally_to, connect_to
|
|
@@ -20,7 +21,7 @@ from localstack.utils.urls import localstack_host
|
|
|
20
21
|
try:
|
|
21
22
|
from typing import Literal
|
|
22
23
|
except ImportError:
|
|
23
|
-
from
|
|
24
|
+
from typing import Literal
|
|
24
25
|
|
|
25
26
|
import boto3
|
|
26
27
|
import requests
|
|
@@ -71,7 +72,7 @@ def is_local_test_mode():
|
|
|
71
72
|
def create_lambda_archive(
|
|
72
73
|
script: str,
|
|
73
74
|
get_content: bool = False,
|
|
74
|
-
libs:
|
|
75
|
+
libs: list[str] = None,
|
|
75
76
|
runtime: str = None,
|
|
76
77
|
file_name: str = None,
|
|
77
78
|
exclude_func: Callable[[str], bool] = None,
|
|
@@ -94,7 +95,7 @@ def create_lambda_archive(
|
|
|
94
95
|
chmod_r(script_file, 0o777)
|
|
95
96
|
# copy libs
|
|
96
97
|
for lib in libs:
|
|
97
|
-
paths = [lib, "
|
|
98
|
+
paths = [lib, f"{lib}.py"]
|
|
98
99
|
try:
|
|
99
100
|
module = importlib.import_module(lib)
|
|
100
101
|
paths.append(module.__file__)
|
|
@@ -255,7 +256,7 @@ def create_lambda_function(
|
|
|
255
256
|
"Role": role or LAMBDA_TEST_ROLE.format(account_id=TEST_AWS_ACCOUNT_ID),
|
|
256
257
|
"Code": lambda_code,
|
|
257
258
|
"Timeout": timeout or LAMBDA_TIMEOUT_SEC,
|
|
258
|
-
"Environment":
|
|
259
|
+
"Environment": {"Variables": envvars},
|
|
259
260
|
"Tags": tags,
|
|
260
261
|
}
|
|
261
262
|
kwargs.update(additional_kwargs)
|
|
@@ -382,7 +383,7 @@ def assert_object(expected_object, all_objects):
|
|
|
382
383
|
all_objects = [all_objects]
|
|
383
384
|
found = find_object(expected_object, all_objects)
|
|
384
385
|
if not found:
|
|
385
|
-
raise Exception("Expected object not found:
|
|
386
|
+
raise Exception(f"Expected object not found: {expected_object} in list {all_objects}")
|
|
386
387
|
|
|
387
388
|
|
|
388
389
|
def find_object(expected_object, object_list):
|
|
@@ -425,7 +426,7 @@ def list_all_s3_objects(s3_client):
|
|
|
425
426
|
return map_all_s3_objects(s3_client=s3_client).values()
|
|
426
427
|
|
|
427
428
|
|
|
428
|
-
def delete_all_s3_objects(s3_client, buckets: str |
|
|
429
|
+
def delete_all_s3_objects(s3_client, buckets: str | list[str]):
|
|
429
430
|
buckets = ensure_list(buckets)
|
|
430
431
|
for bucket in buckets:
|
|
431
432
|
keys = all_s3_object_keys(s3_client, bucket)
|
|
@@ -444,15 +445,15 @@ def download_s3_object(s3_client, bucket, path):
|
|
|
444
445
|
return result
|
|
445
446
|
|
|
446
447
|
|
|
447
|
-
def all_s3_object_keys(s3_client, bucket: str) ->
|
|
448
|
+
def all_s3_object_keys(s3_client, bucket: str) -> list[str]:
|
|
448
449
|
response = s3_client.list_objects_v2(Bucket=bucket)
|
|
449
450
|
keys = [obj["Key"] for obj in response.get("Contents", [])]
|
|
450
451
|
return keys
|
|
451
452
|
|
|
452
453
|
|
|
453
454
|
def map_all_s3_objects(
|
|
454
|
-
s3_client, to_json: bool = True, buckets: str |
|
|
455
|
-
) ->
|
|
455
|
+
s3_client, to_json: bool = True, buckets: str | list[str] = None
|
|
456
|
+
) -> dict[str, Any]:
|
|
456
457
|
result = {}
|
|
457
458
|
buckets = ensure_list(buckets)
|
|
458
459
|
if not buckets:
|
|
@@ -499,7 +500,7 @@ def send_update_dynamodb_ttl_request(table_name, ttl_status):
|
|
|
499
500
|
def send_dynamodb_request(path, action, request_body):
|
|
500
501
|
headers = {
|
|
501
502
|
"Host": "dynamodb.amazonaws.com",
|
|
502
|
-
"x-amz-target": "DynamoDB_20120810.{}"
|
|
503
|
+
"x-amz-target": f"DynamoDB_20120810.{action}",
|
|
503
504
|
"Authorization": mock_aws_request_headers(
|
|
504
505
|
"dynamodb", aws_access_key_id=TEST_AWS_ACCESS_KEY_ID, region_name=TEST_AWS_REGION_NAME
|
|
505
506
|
)["Authorization"],
|
|
@@ -509,7 +510,7 @@ def send_dynamodb_request(path, action, request_body):
|
|
|
509
510
|
|
|
510
511
|
|
|
511
512
|
def get_lambda_log_group_name(function_name):
|
|
512
|
-
return "/aws/lambda/{}"
|
|
513
|
+
return f"/aws/lambda/{function_name}"
|
|
513
514
|
|
|
514
515
|
|
|
515
516
|
# TODO: make logs_client mandatory
|
|
@@ -522,8 +523,7 @@ def check_expected_lambda_log_events_length(
|
|
|
522
523
|
events = [line for line in events if line not in ["\x1b[0m", "\\x1b[0m"]]
|
|
523
524
|
if len(events) != expected_length:
|
|
524
525
|
print(
|
|
525
|
-
"Invalid # of Lambda
|
|
526
|
-
% (
|
|
526
|
+
"Invalid # of Lambda {} log events: {} / {}: {}".format(
|
|
527
527
|
function_name,
|
|
528
528
|
len(events),
|
|
529
529
|
expected_length,
|
|
@@ -537,7 +537,7 @@ def check_expected_lambda_log_events_length(
|
|
|
537
537
|
return events
|
|
538
538
|
|
|
539
539
|
|
|
540
|
-
def list_all_log_events(log_group_name: str, logs_client=None) ->
|
|
540
|
+
def list_all_log_events(log_group_name: str, logs_client=None) -> list[dict]:
|
|
541
541
|
logs = logs_client or connect_to().logs
|
|
542
542
|
return list_all_resources(
|
|
543
543
|
lambda kwargs: logs.filter_log_events(logGroupName=log_group_name, **kwargs),
|
|
@@ -549,7 +549,7 @@ def list_all_log_events(log_group_name: str, logs_client=None) -> List[Dict]:
|
|
|
549
549
|
def get_lambda_log_events(
|
|
550
550
|
function_name,
|
|
551
551
|
delay_time=DEFAULT_GET_LOG_EVENTS_DELAY,
|
|
552
|
-
regex_filter:
|
|
552
|
+
regex_filter: str | None = None,
|
|
553
553
|
log_group=None,
|
|
554
554
|
logs_client=None,
|
|
555
555
|
):
|
|
@@ -597,7 +597,7 @@ def list_all_resources(
|
|
|
597
597
|
page_function: Callable[[dict], Any],
|
|
598
598
|
last_token_attr_name: str,
|
|
599
599
|
list_attr_name: str,
|
|
600
|
-
next_token_attr_name:
|
|
600
|
+
next_token_attr_name: str | None = None,
|
|
601
601
|
) -> list:
|
|
602
602
|
"""
|
|
603
603
|
List all available resources by loading all available pages using `page_function`.
|
localstack/utils/threads.py
CHANGED
|
@@ -3,9 +3,9 @@ import inspect
|
|
|
3
3
|
import logging
|
|
4
4
|
import threading
|
|
5
5
|
import traceback
|
|
6
|
+
from collections.abc import Callable
|
|
6
7
|
from concurrent.futures import Future
|
|
7
8
|
from multiprocessing.dummy import Pool
|
|
8
|
-
from typing import Callable, List, Optional
|
|
9
9
|
|
|
10
10
|
LOG = logging.getLogger(__name__)
|
|
11
11
|
|
|
@@ -26,7 +26,7 @@ class FuncThread(threading.Thread):
|
|
|
26
26
|
params=None,
|
|
27
27
|
quiet=False,
|
|
28
28
|
on_stop: Callable[["FuncThread"], None] = None,
|
|
29
|
-
name:
|
|
29
|
+
name: str | None = None,
|
|
30
30
|
daemon=True,
|
|
31
31
|
):
|
|
32
32
|
global counter
|
|
@@ -153,7 +153,7 @@ def cleanup_threads_and_processes(quiet=True):
|
|
|
153
153
|
TMP_PROCESSES.clear()
|
|
154
154
|
|
|
155
155
|
|
|
156
|
-
def parallelize(func: Callable, arr:
|
|
156
|
+
def parallelize(func: Callable, arr: list, size: int = None):
|
|
157
157
|
if not size:
|
|
158
158
|
size = len(arr)
|
|
159
159
|
if size <= 0:
|
localstack/utils/time.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import time
|
|
2
2
|
from datetime import date, datetime, timezone, tzinfo
|
|
3
|
-
from
|
|
3
|
+
from zoneinfo import ZoneInfo
|
|
4
4
|
|
|
5
5
|
TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S"
|
|
6
6
|
TIMESTAMP_FORMAT_TZ = "%Y-%m-%dT%H:%M:%SZ"
|
|
@@ -42,6 +42,11 @@ def epoch_timestamp() -> float:
|
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
def parse_timestamp(ts_str: str) -> datetime:
|
|
45
|
+
"""
|
|
46
|
+
Parse the incoming date string into a timezone aware datetime object
|
|
47
|
+
:param ts_str:
|
|
48
|
+
:return:
|
|
49
|
+
"""
|
|
45
50
|
for ts_format in [
|
|
46
51
|
TIMESTAMP_FORMAT,
|
|
47
52
|
TIMESTAMP_FORMAT_TZ,
|
|
@@ -49,13 +54,16 @@ def parse_timestamp(ts_str: str) -> datetime:
|
|
|
49
54
|
TIMESTAMP_READABLE_FORMAT,
|
|
50
55
|
]:
|
|
51
56
|
try:
|
|
52
|
-
|
|
57
|
+
value = datetime.strptime(ts_str, ts_format)
|
|
58
|
+
if value.tzinfo is None:
|
|
59
|
+
value = value.replace(tzinfo=ZoneInfo("UTC"))
|
|
60
|
+
return value
|
|
53
61
|
except ValueError:
|
|
54
62
|
pass
|
|
55
|
-
raise Exception("Unable to parse timestamp string with any known formats:
|
|
63
|
+
raise Exception(f"Unable to parse timestamp string with any known formats: {ts_str}")
|
|
56
64
|
|
|
57
65
|
|
|
58
|
-
def now(millis: bool = False, tz:
|
|
66
|
+
def now(millis: bool = False, tz: tzinfo | None = None) -> int:
|
|
59
67
|
return mktime(datetime.now(tz=tz), millis=millis)
|
|
60
68
|
|
|
61
69
|
|
localstack/utils/urls.py
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
1
|
from localstack import config
|
|
4
2
|
from localstack.config import HostAndPort
|
|
5
3
|
|
|
@@ -12,7 +10,7 @@ def hostname_from_url(url: str) -> str:
|
|
|
12
10
|
return url.split("://")[-1].split("/")[0].split(":")[0]
|
|
13
11
|
|
|
14
12
|
|
|
15
|
-
def localstack_host(custom_port:
|
|
13
|
+
def localstack_host(custom_port: int | None = None) -> HostAndPort:
|
|
16
14
|
"""
|
|
17
15
|
Determine the host and port to return to the user based on:
|
|
18
16
|
- the user's configuration (e.g environment variable overrides)
|
localstack/utils/xml.py
CHANGED
|
@@ -9,7 +9,7 @@ def obj_to_xml(obj: Any) -> str:
|
|
|
9
9
|
if isinstance(obj, list):
|
|
10
10
|
return "".join([obj_to_xml(o) for o in obj])
|
|
11
11
|
if isinstance(obj, dict):
|
|
12
|
-
return "".join(["<{k}>{v}</{k}>"
|
|
12
|
+
return "".join([f"<{k}>{obj_to_xml(v)}</{k}>" for (k, v) in obj.items()])
|
|
13
13
|
return str(obj)
|
|
14
14
|
|
|
15
15
|
|