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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import TypedDict
|
|
6
6
|
|
|
7
7
|
import localstack.services.cloudformation.provider_utils as util
|
|
8
8
|
from localstack.services.cloudformation.resource_provider import (
|
|
@@ -14,113 +14,113 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class DynamoDBTableProperties(TypedDict):
|
|
17
|
-
KeySchema:
|
|
18
|
-
Arn:
|
|
19
|
-
AttributeDefinitions:
|
|
20
|
-
BillingMode:
|
|
21
|
-
ContributorInsightsSpecification:
|
|
22
|
-
DeletionProtectionEnabled:
|
|
23
|
-
GlobalSecondaryIndexes:
|
|
24
|
-
ImportSourceSpecification:
|
|
25
|
-
KinesisStreamSpecification:
|
|
26
|
-
LocalSecondaryIndexes:
|
|
27
|
-
PointInTimeRecoverySpecification:
|
|
28
|
-
ProvisionedThroughput:
|
|
29
|
-
SSESpecification:
|
|
30
|
-
StreamArn:
|
|
31
|
-
StreamSpecification:
|
|
32
|
-
TableClass:
|
|
33
|
-
TableName:
|
|
34
|
-
Tags:
|
|
35
|
-
TimeToLiveSpecification:
|
|
17
|
+
KeySchema: list[KeySchema] | dict | None
|
|
18
|
+
Arn: str | None
|
|
19
|
+
AttributeDefinitions: list[AttributeDefinition] | None
|
|
20
|
+
BillingMode: str | None
|
|
21
|
+
ContributorInsightsSpecification: ContributorInsightsSpecification | None
|
|
22
|
+
DeletionProtectionEnabled: bool | None
|
|
23
|
+
GlobalSecondaryIndexes: list[GlobalSecondaryIndex] | None
|
|
24
|
+
ImportSourceSpecification: ImportSourceSpecification | None
|
|
25
|
+
KinesisStreamSpecification: KinesisStreamSpecification | None
|
|
26
|
+
LocalSecondaryIndexes: list[LocalSecondaryIndex] | None
|
|
27
|
+
PointInTimeRecoverySpecification: PointInTimeRecoverySpecification | None
|
|
28
|
+
ProvisionedThroughput: ProvisionedThroughput | None
|
|
29
|
+
SSESpecification: SSESpecification | None
|
|
30
|
+
StreamArn: str | None
|
|
31
|
+
StreamSpecification: StreamSpecification | None
|
|
32
|
+
TableClass: str | None
|
|
33
|
+
TableName: str | None
|
|
34
|
+
Tags: list[Tag] | None
|
|
35
|
+
TimeToLiveSpecification: TimeToLiveSpecification | None
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class AttributeDefinition(TypedDict):
|
|
39
|
-
AttributeName:
|
|
40
|
-
AttributeType:
|
|
39
|
+
AttributeName: str | None
|
|
40
|
+
AttributeType: str | None
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
class KeySchema(TypedDict):
|
|
44
|
-
AttributeName:
|
|
45
|
-
KeyType:
|
|
44
|
+
AttributeName: str | None
|
|
45
|
+
KeyType: str | None
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
class Projection(TypedDict):
|
|
49
|
-
NonKeyAttributes:
|
|
50
|
-
ProjectionType:
|
|
49
|
+
NonKeyAttributes: list[str] | None
|
|
50
|
+
ProjectionType: str | None
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class ProvisionedThroughput(TypedDict):
|
|
54
|
-
ReadCapacityUnits:
|
|
55
|
-
WriteCapacityUnits:
|
|
54
|
+
ReadCapacityUnits: int | None
|
|
55
|
+
WriteCapacityUnits: int | None
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
class ContributorInsightsSpecification(TypedDict):
|
|
59
|
-
Enabled:
|
|
59
|
+
Enabled: bool | None
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
class GlobalSecondaryIndex(TypedDict):
|
|
63
|
-
IndexName:
|
|
64
|
-
KeySchema:
|
|
65
|
-
Projection:
|
|
66
|
-
ContributorInsightsSpecification:
|
|
67
|
-
ProvisionedThroughput:
|
|
63
|
+
IndexName: str | None
|
|
64
|
+
KeySchema: list[KeySchema] | None
|
|
65
|
+
Projection: Projection | None
|
|
66
|
+
ContributorInsightsSpecification: ContributorInsightsSpecification | None
|
|
67
|
+
ProvisionedThroughput: ProvisionedThroughput | None
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
class LocalSecondaryIndex(TypedDict):
|
|
71
|
-
IndexName:
|
|
72
|
-
KeySchema:
|
|
73
|
-
Projection:
|
|
71
|
+
IndexName: str | None
|
|
72
|
+
KeySchema: list[KeySchema] | None
|
|
73
|
+
Projection: Projection | None
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
class PointInTimeRecoverySpecification(TypedDict):
|
|
77
|
-
PointInTimeRecoveryEnabled:
|
|
77
|
+
PointInTimeRecoveryEnabled: bool | None
|
|
78
78
|
|
|
79
79
|
|
|
80
80
|
class SSESpecification(TypedDict):
|
|
81
|
-
SSEEnabled:
|
|
82
|
-
KMSMasterKeyId:
|
|
83
|
-
SSEType:
|
|
81
|
+
SSEEnabled: bool | None
|
|
82
|
+
KMSMasterKeyId: str | None
|
|
83
|
+
SSEType: str | None
|
|
84
84
|
|
|
85
85
|
|
|
86
86
|
class StreamSpecification(TypedDict):
|
|
87
|
-
StreamViewType:
|
|
87
|
+
StreamViewType: str | None
|
|
88
88
|
|
|
89
89
|
|
|
90
90
|
class Tag(TypedDict):
|
|
91
|
-
Key:
|
|
92
|
-
Value:
|
|
91
|
+
Key: str | None
|
|
92
|
+
Value: str | None
|
|
93
93
|
|
|
94
94
|
|
|
95
95
|
class TimeToLiveSpecification(TypedDict):
|
|
96
|
-
AttributeName:
|
|
97
|
-
Enabled:
|
|
96
|
+
AttributeName: str | None
|
|
97
|
+
Enabled: bool | None
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
class KinesisStreamSpecification(TypedDict):
|
|
101
|
-
StreamArn:
|
|
101
|
+
StreamArn: str | None
|
|
102
102
|
|
|
103
103
|
|
|
104
104
|
class S3BucketSource(TypedDict):
|
|
105
|
-
S3Bucket:
|
|
106
|
-
S3BucketOwner:
|
|
107
|
-
S3KeyPrefix:
|
|
105
|
+
S3Bucket: str | None
|
|
106
|
+
S3BucketOwner: str | None
|
|
107
|
+
S3KeyPrefix: str | None
|
|
108
108
|
|
|
109
109
|
|
|
110
110
|
class Csv(TypedDict):
|
|
111
|
-
Delimiter:
|
|
112
|
-
HeaderList:
|
|
111
|
+
Delimiter: str | None
|
|
112
|
+
HeaderList: list[str] | None
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
class InputFormatOptions(TypedDict):
|
|
116
|
-
Csv:
|
|
116
|
+
Csv: Csv | None
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
class ImportSourceSpecification(TypedDict):
|
|
120
|
-
InputFormat:
|
|
121
|
-
S3BucketSource:
|
|
122
|
-
InputCompressionType:
|
|
123
|
-
InputFormatOptions:
|
|
120
|
+
InputFormat: str | None
|
|
121
|
+
S3BucketSource: S3BucketSource | None
|
|
122
|
+
InputCompressionType: str | None
|
|
123
|
+
InputFormatOptions: InputFormatOptions | None
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
REPEATED_INVOCATION = "repeated_invocation"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
from typing import Optional, Type
|
|
2
|
-
|
|
3
1
|
from localstack.services.cloudformation.resource_provider import (
|
|
4
2
|
CloudFormationResourceProviderPlugin,
|
|
5
3
|
ResourceProvider,
|
|
@@ -10,7 +8,7 @@ class DynamoDBTableProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::DynamoDB::Table"
|
|
11
9
|
|
|
12
10
|
def __init__(self):
|
|
13
|
-
self.factory:
|
|
11
|
+
self.factory: type[ResourceProvider] | None = None
|
|
14
12
|
|
|
15
13
|
def load(self):
|
|
16
14
|
from localstack.services.dynamodb.resource_providers.aws_dynamodb_table import (
|
|
@@ -162,7 +162,7 @@ class DynamodbServer(Server):
|
|
|
162
162
|
cmd = [
|
|
163
163
|
"java",
|
|
164
164
|
*self._get_java_vm_options(),
|
|
165
|
-
"-Xmx
|
|
165
|
+
f"-Xmx{self.heap_size}",
|
|
166
166
|
f"-javaagent:{dynamodblocal_package.get_installer().get_ddb_agent_jar_path()}",
|
|
167
167
|
f"-Djava.library.path={self.library_path}",
|
|
168
168
|
"-jar",
|
|
@@ -219,7 +219,7 @@ class DynamodbServer(Server):
|
|
|
219
219
|
aws_secret_access_key=DEFAULT_AWS_ACCOUNT_ID,
|
|
220
220
|
).dynamodb.list_tables()
|
|
221
221
|
except Exception:
|
|
222
|
-
LOG.
|
|
222
|
+
LOG.error("DynamoDB health check failed", exc_info=LOG.isEnabledFor(logging.DEBUG))
|
|
223
223
|
if expect_shutdown:
|
|
224
224
|
assert out is None
|
|
225
225
|
else:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import re
|
|
3
3
|
from binascii import crc32
|
|
4
|
-
from typing import Dict, List, Optional
|
|
5
4
|
|
|
6
5
|
from boto3.dynamodb.types import TypeDeserializer, TypeSerializer
|
|
7
6
|
from cachetools import TTLCache
|
|
@@ -61,7 +60,7 @@ def get_ddb_access_key(account_id: str, region_name: str) -> str:
|
|
|
61
60
|
class ItemSet:
|
|
62
61
|
"""Represents a set of items and provides utils to find individual items in the set"""
|
|
63
62
|
|
|
64
|
-
def __init__(self, items:
|
|
63
|
+
def __init__(self, items: list[dict], key_schema: list[dict]):
|
|
65
64
|
self.items_list = items
|
|
66
65
|
self.key_schema = key_schema
|
|
67
66
|
self._build_dict()
|
|
@@ -71,11 +70,11 @@ class ItemSet:
|
|
|
71
70
|
for item in self.items_list:
|
|
72
71
|
self.items_dict[self._hashable_key(item)] = item
|
|
73
72
|
|
|
74
|
-
def _hashable_key(self, item:
|
|
73
|
+
def _hashable_key(self, item: dict):
|
|
75
74
|
keys = SchemaExtractor.extract_keys_for_schema(item=item, key_schema=self.key_schema)
|
|
76
75
|
return canonical_json(keys)
|
|
77
76
|
|
|
78
|
-
def find_item(self, item:
|
|
77
|
+
def find_item(self, item: dict) -> dict | None:
|
|
79
78
|
key = self._hashable_key(item)
|
|
80
79
|
return self.items_dict.get(key)
|
|
81
80
|
|
|
@@ -83,13 +82,13 @@ class ItemSet:
|
|
|
83
82
|
class SchemaExtractor:
|
|
84
83
|
@classmethod
|
|
85
84
|
def extract_keys(
|
|
86
|
-
cls, item:
|
|
87
|
-
) ->
|
|
85
|
+
cls, item: dict, table_name: str, account_id: str, region_name: str
|
|
86
|
+
) -> dict | None:
|
|
88
87
|
key_schema = cls.get_key_schema(table_name, account_id, region_name)
|
|
89
88
|
return cls.extract_keys_for_schema(item, key_schema)
|
|
90
89
|
|
|
91
90
|
@classmethod
|
|
92
|
-
def extract_keys_for_schema(cls, item:
|
|
91
|
+
def extract_keys_for_schema(cls, item: dict, key_schema: list[dict]):
|
|
93
92
|
result = {}
|
|
94
93
|
for key in key_schema:
|
|
95
94
|
attr_name = key["AttributeName"]
|
|
@@ -104,10 +103,10 @@ class SchemaExtractor:
|
|
|
104
103
|
@classmethod
|
|
105
104
|
def get_key_schema(
|
|
106
105
|
cls, table_name: str, account_id: str, region_name: str
|
|
107
|
-
) ->
|
|
106
|
+
) -> list[dict] | None:
|
|
108
107
|
from localstack.services.dynamodb.provider import get_store
|
|
109
108
|
|
|
110
|
-
table_definitions:
|
|
109
|
+
table_definitions: dict = get_store(
|
|
111
110
|
account_id=account_id,
|
|
112
111
|
region_name=region_name,
|
|
113
112
|
).table_definitions
|
|
@@ -169,12 +168,12 @@ class ItemFinder:
|
|
|
169
168
|
|
|
170
169
|
@staticmethod
|
|
171
170
|
def find_existing_item(
|
|
172
|
-
put_item:
|
|
171
|
+
put_item: dict,
|
|
173
172
|
table_name: str,
|
|
174
173
|
account_id: str,
|
|
175
174
|
region_name: str,
|
|
176
175
|
endpoint_url: str,
|
|
177
|
-
) ->
|
|
176
|
+
) -> AttributeMap | None:
|
|
178
177
|
from localstack.services.dynamodb.provider import ValidationException
|
|
179
178
|
|
|
180
179
|
ddb_client = ItemFinder.get_ddb_local_client(account_id, region_name, endpoint_url)
|
|
@@ -273,7 +272,7 @@ class ItemFinder:
|
|
|
273
272
|
@classmethod
|
|
274
273
|
def list_existing_items_for_statement(
|
|
275
274
|
cls, partiql_statement: str, account_id: str, region_name: str, endpoint_url: str
|
|
276
|
-
) ->
|
|
275
|
+
) -> list:
|
|
277
276
|
table_name = extract_table_name_from_partiql_update(partiql_statement)
|
|
278
277
|
if not table_name:
|
|
279
278
|
return []
|
|
@@ -288,7 +287,7 @@ class ItemFinder:
|
|
|
288
287
|
@staticmethod
|
|
289
288
|
def get_all_table_items(
|
|
290
289
|
account_id: str, region_name: str, table_name: str, endpoint_url: str
|
|
291
|
-
) ->
|
|
290
|
+
) -> list:
|
|
292
291
|
ddb_client = ItemFinder.get_ddb_local_client(account_id, region_name, endpoint_url)
|
|
293
292
|
dynamodb_kwargs = {"TableName": table_name}
|
|
294
293
|
all_items = list_all_resources(
|
|
@@ -300,7 +299,7 @@ class ItemFinder:
|
|
|
300
299
|
return all_items
|
|
301
300
|
|
|
302
301
|
|
|
303
|
-
def extract_table_name_from_partiql_update(statement: str) ->
|
|
302
|
+
def extract_table_name_from_partiql_update(statement: str) -> str | None:
|
|
304
303
|
regex = r"^\s*(UPDATE|INSERT\s+INTO|DELETE\s+FROM)\s+([^\s]+).*"
|
|
305
304
|
match = re.match(regex, statement, flags=re.IGNORECASE | re.MULTILINE)
|
|
306
305
|
return match and match.group(2)
|
|
@@ -9,7 +9,6 @@ import time
|
|
|
9
9
|
from contextlib import contextmanager
|
|
10
10
|
from datetime import datetime
|
|
11
11
|
from operator import itemgetter
|
|
12
|
-
from typing import Dict, Optional
|
|
13
12
|
|
|
14
13
|
import requests
|
|
15
14
|
import werkzeug
|
|
@@ -24,6 +23,7 @@ from localstack.aws.api import (
|
|
|
24
23
|
handler,
|
|
25
24
|
)
|
|
26
25
|
from localstack.aws.api.dynamodb import (
|
|
26
|
+
ApproximateCreationDateTimePrecision,
|
|
27
27
|
BatchExecuteStatementOutput,
|
|
28
28
|
BatchGetItemOutput,
|
|
29
29
|
BatchGetRequestMap,
|
|
@@ -40,6 +40,8 @@ from localstack.aws.api.dynamodb import (
|
|
|
40
40
|
DeleteRequest,
|
|
41
41
|
DeleteTableOutput,
|
|
42
42
|
DescribeContinuousBackupsOutput,
|
|
43
|
+
DescribeContributorInsightsInput,
|
|
44
|
+
DescribeContributorInsightsOutput,
|
|
43
45
|
DescribeGlobalTableOutput,
|
|
44
46
|
DescribeKinesisStreamingDestinationOutput,
|
|
45
47
|
DescribeTableOutput,
|
|
@@ -84,6 +86,7 @@ from localstack.aws.api.dynamodb import (
|
|
|
84
86
|
ScanInput,
|
|
85
87
|
ScanOutput,
|
|
86
88
|
StreamArn,
|
|
89
|
+
TableArn,
|
|
87
90
|
TableDescription,
|
|
88
91
|
TableName,
|
|
89
92
|
TagKeyList,
|
|
@@ -97,6 +100,8 @@ from localstack.aws.api.dynamodb import (
|
|
|
97
100
|
UpdateGlobalTableOutput,
|
|
98
101
|
UpdateItemInput,
|
|
99
102
|
UpdateItemOutput,
|
|
103
|
+
UpdateKinesisStreamingConfiguration,
|
|
104
|
+
UpdateKinesisStreamingDestinationOutput,
|
|
100
105
|
UpdateTableInput,
|
|
101
106
|
UpdateTableOutput,
|
|
102
107
|
UpdateTimeToLiveOutput,
|
|
@@ -336,7 +341,7 @@ class ExpiredItemsWorker:
|
|
|
336
341
|
def __init__(self) -> None:
|
|
337
342
|
super().__init__()
|
|
338
343
|
self.scheduler = Scheduler()
|
|
339
|
-
self.thread:
|
|
344
|
+
self.thread: FuncThread | None = None
|
|
340
345
|
self.mutex = threading.RLock()
|
|
341
346
|
|
|
342
347
|
def start(self):
|
|
@@ -555,6 +560,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
555
560
|
if "NumberOfDecreasesToday" not in table_description["ProvisionedThroughput"]:
|
|
556
561
|
table_description["ProvisionedThroughput"]["NumberOfDecreasesToday"] = 0
|
|
557
562
|
|
|
563
|
+
if "WarmThroughput" in table_description:
|
|
564
|
+
table_description["WarmThroughput"]["Status"] = "UPDATING"
|
|
565
|
+
|
|
558
566
|
tags = table_definitions.pop("Tags", [])
|
|
559
567
|
if tags:
|
|
560
568
|
get_store(context.account_id, context.region).TABLE_TAGS[table_arn] = {
|
|
@@ -572,6 +580,13 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
572
580
|
) -> DeleteTableOutput:
|
|
573
581
|
global_table_region = self.get_global_table_region(context, table_name)
|
|
574
582
|
|
|
583
|
+
self.ensure_table_exists(
|
|
584
|
+
context.account_id,
|
|
585
|
+
global_table_region,
|
|
586
|
+
table_name,
|
|
587
|
+
error_message=f"Requested resource not found: Table: {table_name} not found",
|
|
588
|
+
)
|
|
589
|
+
|
|
575
590
|
# Limitation note: On AWS, for a replicated table, if the source table is deleted, the replicated tables continue to exist.
|
|
576
591
|
# This is not the case for LocalStack, where all replicated tables will also be removed if source is deleted.
|
|
577
592
|
|
|
@@ -603,7 +618,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
603
618
|
store = get_store(context.account_id, context.region)
|
|
604
619
|
|
|
605
620
|
# Update replication details
|
|
606
|
-
replicas:
|
|
621
|
+
replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
|
|
607
622
|
|
|
608
623
|
replica_description_list = []
|
|
609
624
|
|
|
@@ -631,6 +646,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
631
646
|
table_description["TableClassSummary"] = {
|
|
632
647
|
"TableClass": table_definitions["TableClass"]
|
|
633
648
|
}
|
|
649
|
+
if warm_throughput := table_definitions.get("WarmThroughput"):
|
|
650
|
+
table_description["WarmThroughput"] = warm_throughput.copy()
|
|
651
|
+
table_description["WarmThroughput"].setdefault("Status", "ACTIVE")
|
|
634
652
|
|
|
635
653
|
if "GlobalSecondaryIndexes" in table_description:
|
|
636
654
|
for gsi in table_description["GlobalSecondaryIndexes"]:
|
|
@@ -643,6 +661,17 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
643
661
|
# Terraform depends on this parity for update operations
|
|
644
662
|
gsi["ProvisionedThroughput"] = default_values | gsi.get("ProvisionedThroughput", {})
|
|
645
663
|
|
|
664
|
+
# Set defaults for warm throughput
|
|
665
|
+
if "WarmThroughput" not in table_description:
|
|
666
|
+
billing_mode = table_definitions.get("BillingMode") if table_definitions else None
|
|
667
|
+
table_description["WarmThroughput"] = {
|
|
668
|
+
"ReadUnitsPerSecond": 12000 if billing_mode == "PAY_PER_REQUEST" else 5,
|
|
669
|
+
"WriteUnitsPerSecond": 4000 if billing_mode == "PAY_PER_REQUEST" else 5,
|
|
670
|
+
}
|
|
671
|
+
table_description["WarmThroughput"]["Status"] = (
|
|
672
|
+
table_description.get("TableStatus") or "ACTIVE"
|
|
673
|
+
)
|
|
674
|
+
|
|
646
675
|
return DescribeTableOutput(
|
|
647
676
|
Table=select_from_typed_dict(TableDescription, table_description)
|
|
648
677
|
)
|
|
@@ -672,7 +701,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
672
701
|
store = get_store(context.account_id, global_table_region)
|
|
673
702
|
|
|
674
703
|
# Dict with source region to set of replicated regions
|
|
675
|
-
replicas:
|
|
704
|
+
replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
|
|
676
705
|
|
|
677
706
|
for replica_update in replica_updates:
|
|
678
707
|
for key, details in replica_update.items():
|
|
@@ -754,6 +783,22 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
754
783
|
|
|
755
784
|
return response
|
|
756
785
|
|
|
786
|
+
#
|
|
787
|
+
# Contributor Insights
|
|
788
|
+
#
|
|
789
|
+
|
|
790
|
+
@handler("DescribeContributorInsights", expand=False)
|
|
791
|
+
def describe_contributor_insights(
|
|
792
|
+
self,
|
|
793
|
+
context: RequestContext,
|
|
794
|
+
describe_contributor_insights_input: DescribeContributorInsightsInput,
|
|
795
|
+
) -> DescribeContributorInsightsOutput:
|
|
796
|
+
return DescribeContributorInsightsOutput(
|
|
797
|
+
TableName=describe_contributor_insights_input["TableName"],
|
|
798
|
+
IndexName=describe_contributor_insights_input.get("IndexName"),
|
|
799
|
+
ContributorInsightsStatus="DISABLED",
|
|
800
|
+
)
|
|
801
|
+
|
|
757
802
|
#
|
|
758
803
|
# Item ops
|
|
759
804
|
#
|
|
@@ -1032,7 +1077,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1032
1077
|
replication_group: ReplicaList,
|
|
1033
1078
|
**kwargs,
|
|
1034
1079
|
) -> CreateGlobalTableOutput:
|
|
1035
|
-
global_tables:
|
|
1080
|
+
global_tables: dict = get_store(context.account_id, context.region).GLOBAL_TABLES
|
|
1036
1081
|
if global_table_name in global_tables:
|
|
1037
1082
|
raise GlobalTableAlreadyExistsException("Global table with this name already exists")
|
|
1038
1083
|
replication_group = [grp.copy() for grp in replication_group or []]
|
|
@@ -1110,7 +1155,14 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1110
1155
|
enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
|
|
1111
1156
|
**kwargs,
|
|
1112
1157
|
) -> KinesisStreamingDestinationOutput:
|
|
1113
|
-
self.ensure_table_exists(
|
|
1158
|
+
self.ensure_table_exists(
|
|
1159
|
+
context.account_id,
|
|
1160
|
+
context.region,
|
|
1161
|
+
table_name,
|
|
1162
|
+
error_message=f"Requested resource not found: Table: {table_name} not found",
|
|
1163
|
+
)
|
|
1164
|
+
|
|
1165
|
+
enable_kinesis_streaming_configuration = enable_kinesis_streaming_configuration or {}
|
|
1114
1166
|
|
|
1115
1167
|
if not kinesis_stream_exists(stream_arn=stream_arn):
|
|
1116
1168
|
raise ValidationException("User does not have a permission to use kinesis stream")
|
|
@@ -1127,9 +1179,8 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1127
1179
|
"to perform ENABLE operation."
|
|
1128
1180
|
)
|
|
1129
1181
|
|
|
1130
|
-
table_def
|
|
1131
|
-
|
|
1132
|
-
)
|
|
1182
|
+
table_def.setdefault("KinesisDataStreamDestinations", [])
|
|
1183
|
+
|
|
1133
1184
|
# remove the stream destination if already present
|
|
1134
1185
|
table_def["KinesisDataStreamDestinations"] = [
|
|
1135
1186
|
t for t in table_def["KinesisDataStreamDestinations"] if t["StreamArn"] != stream_arn
|
|
@@ -1140,11 +1191,15 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1140
1191
|
"DestinationStatus": DestinationStatus.ACTIVE,
|
|
1141
1192
|
"DestinationStatusDescription": "Stream is active",
|
|
1142
1193
|
"StreamArn": stream_arn,
|
|
1194
|
+
"ApproximateCreationDateTimePrecision": ApproximateCreationDateTimePrecision.MILLISECOND,
|
|
1143
1195
|
}
|
|
1144
1196
|
)
|
|
1145
1197
|
table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.ACTIVE
|
|
1146
1198
|
return KinesisStreamingDestinationOutput(
|
|
1147
|
-
DestinationStatus=DestinationStatus.
|
|
1199
|
+
DestinationStatus=DestinationStatus.ENABLING,
|
|
1200
|
+
StreamArn=stream_arn,
|
|
1201
|
+
TableName=table_name,
|
|
1202
|
+
EnableKinesisStreamingConfiguration=enable_kinesis_streaming_configuration,
|
|
1148
1203
|
)
|
|
1149
1204
|
|
|
1150
1205
|
def disable_kinesis_streaming_destination(
|
|
@@ -1155,8 +1210,14 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1155
1210
|
enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
|
|
1156
1211
|
**kwargs,
|
|
1157
1212
|
) -> KinesisStreamingDestinationOutput:
|
|
1158
|
-
self.ensure_table_exists(
|
|
1159
|
-
|
|
1213
|
+
self.ensure_table_exists(
|
|
1214
|
+
context.account_id,
|
|
1215
|
+
context.region,
|
|
1216
|
+
table_name,
|
|
1217
|
+
error_message=f"Requested resource not found: Table: {table_name} not found",
|
|
1218
|
+
)
|
|
1219
|
+
|
|
1220
|
+
if not kinesis_stream_exists(stream_arn=stream_arn):
|
|
1160
1221
|
raise ValidationException(
|
|
1161
1222
|
"User does not have a permission to use kinesis stream",
|
|
1162
1223
|
)
|
|
@@ -1177,7 +1238,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1177
1238
|
dest["DestinationStatusDescription"] = ("Stream is disabled",)
|
|
1178
1239
|
table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.DISABLED
|
|
1179
1240
|
return KinesisStreamingDestinationOutput(
|
|
1180
|
-
DestinationStatus=DestinationStatus.
|
|
1241
|
+
DestinationStatus=DestinationStatus.DISABLING,
|
|
1181
1242
|
StreamArn=stream_arn,
|
|
1182
1243
|
TableName=table_name,
|
|
1183
1244
|
)
|
|
@@ -1196,8 +1257,81 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1196
1257
|
)
|
|
1197
1258
|
|
|
1198
1259
|
stream_destinations = table_def.get("KinesisDataStreamDestinations") or []
|
|
1260
|
+
stream_destinations = copy.deepcopy(stream_destinations)
|
|
1261
|
+
|
|
1262
|
+
for destination in stream_destinations:
|
|
1263
|
+
destination.pop("ApproximateCreationDateTimePrecision", None)
|
|
1264
|
+
destination.pop("DestinationStatusDescription", None)
|
|
1265
|
+
|
|
1199
1266
|
return DescribeKinesisStreamingDestinationOutput(
|
|
1200
|
-
KinesisDataStreamDestinations=stream_destinations,
|
|
1267
|
+
KinesisDataStreamDestinations=stream_destinations,
|
|
1268
|
+
TableName=table_name,
|
|
1269
|
+
)
|
|
1270
|
+
|
|
1271
|
+
def update_kinesis_streaming_destination(
|
|
1272
|
+
self,
|
|
1273
|
+
context: RequestContext,
|
|
1274
|
+
table_name: TableArn,
|
|
1275
|
+
stream_arn: StreamArn,
|
|
1276
|
+
update_kinesis_streaming_configuration: UpdateKinesisStreamingConfiguration | None = None,
|
|
1277
|
+
**kwargs,
|
|
1278
|
+
) -> UpdateKinesisStreamingDestinationOutput:
|
|
1279
|
+
self.ensure_table_exists(context.account_id, context.region, table_name)
|
|
1280
|
+
|
|
1281
|
+
if not update_kinesis_streaming_configuration:
|
|
1282
|
+
raise ValidationException(
|
|
1283
|
+
"Streaming destination cannot be updated with given parameters: "
|
|
1284
|
+
"UpdateKinesisStreamingConfiguration cannot be null or contain only null values"
|
|
1285
|
+
)
|
|
1286
|
+
|
|
1287
|
+
time_precision = update_kinesis_streaming_configuration.get(
|
|
1288
|
+
"ApproximateCreationDateTimePrecision"
|
|
1289
|
+
)
|
|
1290
|
+
if time_precision not in (
|
|
1291
|
+
ApproximateCreationDateTimePrecision.MILLISECOND,
|
|
1292
|
+
ApproximateCreationDateTimePrecision.MICROSECOND,
|
|
1293
|
+
):
|
|
1294
|
+
raise ValidationException(
|
|
1295
|
+
f"1 validation error detected: Value '{time_precision}' at "
|
|
1296
|
+
"'updateKinesisStreamingConfiguration.approximateCreationDateTimePrecision' failed to satisfy constraint: "
|
|
1297
|
+
"Member must satisfy enum value set: [MILLISECOND, MICROSECOND]"
|
|
1298
|
+
)
|
|
1299
|
+
|
|
1300
|
+
store = get_store(context.account_id, context.region)
|
|
1301
|
+
|
|
1302
|
+
table_def = store.table_definitions.get(table_name) or {}
|
|
1303
|
+
table_def.setdefault("KinesisDataStreamDestinations", [])
|
|
1304
|
+
|
|
1305
|
+
table_id = table_def["TableId"]
|
|
1306
|
+
|
|
1307
|
+
destination = None
|
|
1308
|
+
for stream in table_def["KinesisDataStreamDestinations"]:
|
|
1309
|
+
if stream["StreamArn"] == stream_arn:
|
|
1310
|
+
destination = stream
|
|
1311
|
+
|
|
1312
|
+
if destination is None:
|
|
1313
|
+
raise ValidationException(
|
|
1314
|
+
"Table is not in a valid state to enable Kinesis Streaming Destination: "
|
|
1315
|
+
f"No streaming destination with streamArn: {stream_arn} found for table with tableName: {table_name}"
|
|
1316
|
+
)
|
|
1317
|
+
|
|
1318
|
+
if (
|
|
1319
|
+
existing_precision := destination["ApproximateCreationDateTimePrecision"]
|
|
1320
|
+
) == update_kinesis_streaming_configuration["ApproximateCreationDateTimePrecision"]:
|
|
1321
|
+
raise ValidationException(
|
|
1322
|
+
f"Invalid Request: Precision is already set to the desired value of {existing_precision} "
|
|
1323
|
+
f"for tableId: {table_id}, kdsArn: {stream_arn}"
|
|
1324
|
+
)
|
|
1325
|
+
|
|
1326
|
+
destination["ApproximateCreationDateTimePrecision"] = time_precision
|
|
1327
|
+
|
|
1328
|
+
return UpdateKinesisStreamingDestinationOutput(
|
|
1329
|
+
TableName=table_name,
|
|
1330
|
+
StreamArn=stream_arn,
|
|
1331
|
+
DestinationStatus=DestinationStatus.UPDATING,
|
|
1332
|
+
UpdateKinesisStreamingConfiguration=UpdateKinesisStreamingConfiguration(
|
|
1333
|
+
ApproximateCreationDateTimePrecision=time_precision,
|
|
1334
|
+
),
|
|
1201
1335
|
)
|
|
1202
1336
|
|
|
1203
1337
|
#
|
|
@@ -1275,7 +1409,12 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1275
1409
|
return dynamodb_table_exists(table_name, client)
|
|
1276
1410
|
|
|
1277
1411
|
@staticmethod
|
|
1278
|
-
def ensure_table_exists(
|
|
1412
|
+
def ensure_table_exists(
|
|
1413
|
+
account_id: str,
|
|
1414
|
+
region_name: str,
|
|
1415
|
+
table_name: str,
|
|
1416
|
+
error_message: str = "Cannot do operations on a non-existent table",
|
|
1417
|
+
):
|
|
1279
1418
|
"""
|
|
1280
1419
|
Raise ResourceNotFoundException if the given table does not exist.
|
|
1281
1420
|
|
|
@@ -1285,7 +1424,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1285
1424
|
:raise: ResourceNotFoundException if table does not exist in DynamoDB Local
|
|
1286
1425
|
"""
|
|
1287
1426
|
if not DynamoDBProvider.table_exists(account_id, region_name, table_name):
|
|
1288
|
-
raise ResourceNotFoundException(
|
|
1427
|
+
raise ResourceNotFoundException(error_message)
|
|
1289
1428
|
|
|
1290
1429
|
@staticmethod
|
|
1291
1430
|
def get_global_table_region(context: RequestContext, table_name: str) -> str:
|
|
@@ -1312,7 +1451,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1312
1451
|
return context.region
|
|
1313
1452
|
|
|
1314
1453
|
@staticmethod
|
|
1315
|
-
def prepare_request_headers(headers:
|
|
1454
|
+
def prepare_request_headers(headers: dict, account_id: str, region_name: str):
|
|
1316
1455
|
"""
|
|
1317
1456
|
Modify the Credentials field of Authorization header to achieve namespacing in DynamoDBLocal.
|
|
1318
1457
|
"""
|
|
@@ -1329,7 +1468,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
|
|
|
1329
1468
|
flags=re.IGNORECASE,
|
|
1330
1469
|
)
|
|
1331
1470
|
|
|
1332
|
-
def fix_consumed_capacity(self, request:
|
|
1471
|
+
def fix_consumed_capacity(self, request: dict, result: dict):
|
|
1333
1472
|
# make sure we append 'ConsumedCapacity', which is properly
|
|
1334
1473
|
# returned by dynalite, but not by AWS's DynamoDBLocal
|
|
1335
1474
|
table_name = request.get("TableName")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import threading
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from bson.json_util import dumps
|
|
6
6
|
|
|
@@ -206,7 +206,7 @@ def kinesis_shard_id(dynamodbstream_shard_id: str) -> str:
|
|
|
206
206
|
return f"{shard_params[0]}-{shard_params[-1]}"
|
|
207
207
|
|
|
208
208
|
|
|
209
|
-
def get_shard_id(stream:
|
|
209
|
+
def get_shard_id(stream: dict, kinesis_shard_id: str) -> str:
|
|
210
210
|
ddb_stream_shard_id = stream.get("shards_id_map", {}).get(kinesis_shard_id)
|
|
211
211
|
if not ddb_stream_shard_id:
|
|
212
212
|
ddb_stream_shard_id = shard_id(kinesis_shard_id)
|