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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import NotRequired, TypedDict
|
|
3
|
+
|
|
4
|
+
from localstack.aws.api.cloudformation import ResourceStatus
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class EngineParameter(TypedDict):
|
|
8
|
+
"""
|
|
9
|
+
Parameters supplied by the user. The resolved value field is populated by the engine
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
type_: str
|
|
13
|
+
given_value: NotRequired[str | None]
|
|
14
|
+
resolved_value: NotRequired[str | None]
|
|
15
|
+
default_value: NotRequired[str | None]
|
|
16
|
+
no_echo: NotRequired[bool | None]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def engine_parameter_value(parameter: EngineParameter) -> str:
|
|
20
|
+
given_value = parameter.get("given_value")
|
|
21
|
+
if given_value is not None:
|
|
22
|
+
return given_value
|
|
23
|
+
|
|
24
|
+
default_value = parameter.get("default_value")
|
|
25
|
+
if default_value is not None:
|
|
26
|
+
return default_value
|
|
27
|
+
|
|
28
|
+
raise RuntimeError("Parameter value is None")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ResolvedResource(TypedDict):
|
|
32
|
+
LogicalResourceId: str
|
|
33
|
+
Type: str
|
|
34
|
+
Properties: dict
|
|
35
|
+
LastUpdatedTimestamp: datetime
|
|
36
|
+
ResourceStatus: NotRequired[ResourceStatus]
|
|
37
|
+
PhysicalResourceId: NotRequired[str]
|
|
38
|
+
ResourceStatusReason: NotRequired[str]
|
|
@@ -2,4 +2,7 @@ from localstack import config
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
def is_v2_engine() -> bool:
|
|
5
|
-
return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation")
|
|
5
|
+
return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation") not in {
|
|
6
|
+
"engine-legacy",
|
|
7
|
+
"engine-legacy_pro",
|
|
8
|
+
}
|
|
@@ -2,8 +2,8 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import math
|
|
4
4
|
import threading
|
|
5
|
-
from datetime import datetime, timedelta
|
|
6
|
-
from typing import TYPE_CHECKING
|
|
5
|
+
from datetime import UTC, datetime, timedelta
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
7
|
|
|
8
8
|
from localstack.aws.api.cloudwatch import MetricAlarm, MetricDataQuery, MetricStat, StateValue
|
|
9
9
|
from localstack.aws.connect import connect_to
|
|
@@ -69,7 +69,10 @@ class AlarmScheduler:
|
|
|
69
69
|
schedule_period = evaluation_periods * period
|
|
70
70
|
|
|
71
71
|
def on_error(e):
|
|
72
|
-
LOG.
|
|
72
|
+
if LOG.isEnabledFor(logging.DEBUG):
|
|
73
|
+
LOG.exception("Error executing scheduled alarm", exc_info=e)
|
|
74
|
+
else:
|
|
75
|
+
LOG.error("Error executing scheduled alarm")
|
|
73
76
|
|
|
74
77
|
task = self.scheduler.schedule(
|
|
75
78
|
func=calculate_alarm_state,
|
|
@@ -120,7 +123,7 @@ class AlarmScheduler:
|
|
|
120
123
|
return True
|
|
121
124
|
|
|
122
125
|
|
|
123
|
-
def get_metric_alarm_details_for_alarm_arn(alarm_arn: str) ->
|
|
126
|
+
def get_metric_alarm_details_for_alarm_arn(alarm_arn: str) -> MetricAlarm | None:
|
|
124
127
|
alarm_name = arns.extract_resource_from_arn(alarm_arn).split(":", 1)[1]
|
|
125
128
|
client = get_cloudwatch_client_for_region_of_alarm(alarm_arn)
|
|
126
129
|
metric_alarms = client.describe_alarms(AlarmNames=[alarm_name])["MetricAlarms"]
|
|
@@ -155,7 +158,7 @@ def generate_metric_query(alarm_details: MetricAlarm) -> MetricDataQuery:
|
|
|
155
158
|
)
|
|
156
159
|
|
|
157
160
|
|
|
158
|
-
def is_threshold_exceeded(metric_values:
|
|
161
|
+
def is_threshold_exceeded(metric_values: list[float], alarm_details: MetricAlarm) -> bool:
|
|
159
162
|
"""Evaluates if the threshold is exceeded for the configured alarm and given metric values
|
|
160
163
|
|
|
161
164
|
:param metric_values: values to compare against threshold
|
|
@@ -185,7 +188,7 @@ def is_threshold_exceeded(metric_values: List[float], alarm_details: MetricAlarm
|
|
|
185
188
|
return False
|
|
186
189
|
|
|
187
190
|
|
|
188
|
-
def is_triggering_premature_alarm(metric_values:
|
|
191
|
+
def is_triggering_premature_alarm(metric_values: list[float], alarm_details: MetricAlarm) -> bool:
|
|
189
192
|
"""
|
|
190
193
|
Checks if a premature alarm should be triggered.
|
|
191
194
|
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#CloudWatch-alarms-avoiding-premature-transition:
|
|
@@ -217,7 +220,7 @@ def is_triggering_premature_alarm(metric_values: List[float], alarm_details: Met
|
|
|
217
220
|
return False
|
|
218
221
|
|
|
219
222
|
|
|
220
|
-
def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient") ->
|
|
223
|
+
def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient") -> list[float]:
|
|
221
224
|
"""
|
|
222
225
|
Collects the metric data for the evaluation interval.
|
|
223
226
|
|
|
@@ -236,7 +239,7 @@ def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient")
|
|
|
236
239
|
magic_number = max(math.floor(evaluation_periods / 3), 2)
|
|
237
240
|
collected_periods = evaluation_periods + magic_number
|
|
238
241
|
|
|
239
|
-
now = datetime.utcnow().replace(tzinfo=
|
|
242
|
+
now = datetime.utcnow().replace(tzinfo=UTC)
|
|
240
243
|
metric_query = generate_metric_query(alarm_details)
|
|
241
244
|
|
|
242
245
|
# get_metric_data needs to be run in a loop, so we also collect empty data points on the right position
|
|
@@ -2,8 +2,7 @@ import logging
|
|
|
2
2
|
import os
|
|
3
3
|
import sqlite3
|
|
4
4
|
import threading
|
|
5
|
-
from datetime import
|
|
6
|
-
from typing import Dict, List, Optional
|
|
5
|
+
from datetime import UTC, datetime
|
|
7
6
|
|
|
8
7
|
from localstack import config
|
|
9
8
|
from localstack.aws.api.cloudwatch import MetricData, MetricDataQuery, ScanBy
|
|
@@ -92,7 +91,7 @@ class CloudwatchDatabase:
|
|
|
92
91
|
self, account_id: str, region: str, namespace: str, metric_data: MetricData
|
|
93
92
|
):
|
|
94
93
|
def _get_current_unix_timestamp_utc():
|
|
95
|
-
now = datetime.utcnow().replace(tzinfo=
|
|
94
|
+
now = datetime.utcnow().replace(tzinfo=UTC)
|
|
96
95
|
return int(now.timestamp())
|
|
97
96
|
|
|
98
97
|
for metric in metric_data:
|
|
@@ -218,7 +217,7 @@ class CloudwatchDatabase:
|
|
|
218
217
|
start_time: datetime,
|
|
219
218
|
end_time: datetime,
|
|
220
219
|
scan_by: str,
|
|
221
|
-
) ->
|
|
220
|
+
) -> dict[str, list]:
|
|
222
221
|
metric_stat = query.get("MetricStat")
|
|
223
222
|
metric = metric_stat.get("Metric")
|
|
224
223
|
period = metric_stat.get("Period")
|
|
@@ -389,7 +388,7 @@ class CloudwatchDatabase:
|
|
|
389
388
|
cur.execute("VACUUM")
|
|
390
389
|
conn.commit()
|
|
391
390
|
|
|
392
|
-
def _get_ordered_dimensions_with_separator(self, dims:
|
|
391
|
+
def _get_ordered_dimensions_with_separator(self, dims: list[dict] | None, for_search=False):
|
|
393
392
|
"""
|
|
394
393
|
Returns a string with the dimensions in the format "Name=Value\tName=Value\tName=Value" in order to store the metric
|
|
395
394
|
with the dimensions in a single column in the database
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import datetime
|
|
2
|
-
from datetime import timezone
|
|
3
|
-
from typing import Dict, List
|
|
4
2
|
|
|
5
3
|
from localstack.aws.api.cloudwatch import CompositeAlarm, DashboardBody, MetricAlarm, StateValue
|
|
6
4
|
from localstack.services.stores import (
|
|
@@ -25,7 +23,7 @@ class LocalStackMetricAlarm:
|
|
|
25
23
|
self.set_default_attributes()
|
|
26
24
|
|
|
27
25
|
def set_default_attributes(self):
|
|
28
|
-
current_time = datetime.datetime.now(
|
|
26
|
+
current_time = datetime.datetime.now(datetime.UTC)
|
|
29
27
|
self.alarm["AlarmArn"] = arns.cloudwatch_alarm_arn(
|
|
30
28
|
self.alarm["AlarmName"], account_id=self.account_id, region_name=self.region
|
|
31
29
|
)
|
|
@@ -53,7 +51,7 @@ class LocalStackCompositeAlarm:
|
|
|
53
51
|
self.set_default_attributes()
|
|
54
52
|
|
|
55
53
|
def set_default_attributes(self):
|
|
56
|
-
current_time = datetime.datetime.now(
|
|
54
|
+
current_time = datetime.datetime.now(datetime.UTC)
|
|
57
55
|
self.alarm["AlarmArn"] = arns.cloudwatch_alarm_arn(
|
|
58
56
|
self.alarm["AlarmName"], account_id=self.account_id, region_name=self.region
|
|
59
57
|
)
|
|
@@ -97,13 +95,13 @@ class CloudWatchStore(BaseStore):
|
|
|
97
95
|
TAGS: TaggingService = CrossRegionAttribute(default=TaggingService)
|
|
98
96
|
|
|
99
97
|
# maps resource ARN to alarms
|
|
100
|
-
alarms:
|
|
98
|
+
alarms: dict[str, LocalStackAlarm] = LocalAttribute(default=dict)
|
|
101
99
|
|
|
102
100
|
# Contains all the Alarm Histories. Per documentation, an alarm history is retained even if the alarm is deleted,
|
|
103
101
|
# making it necessary to save this at store level
|
|
104
|
-
histories:
|
|
102
|
+
histories: list[dict] = LocalAttribute(default=list)
|
|
105
103
|
|
|
106
|
-
dashboards:
|
|
104
|
+
dashboards: dict[str, LocalStackDashboard] = LocalAttribute(default=dict)
|
|
107
105
|
|
|
108
106
|
|
|
109
107
|
cloudwatch_stores = AccountRegionBundle("cloudwatch", CloudWatchStore)
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
3
|
import uuid
|
|
4
|
-
from
|
|
5
|
-
from
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from typing import Any
|
|
6
6
|
|
|
7
7
|
from moto.cloudwatch import cloudwatch_backends
|
|
8
|
-
from moto.cloudwatch.models import
|
|
8
|
+
from moto.cloudwatch.models import Alarm, CloudWatchBackend, MetricDatum
|
|
9
9
|
|
|
10
10
|
from localstack.aws.accounts import get_account_id_from_access_key_id
|
|
11
11
|
from localstack.aws.api import CommonServiceException, RequestContext, handler
|
|
@@ -54,7 +54,7 @@ MOTO_INITIAL_UNCHECKED_REASON = "Unchecked: Initial alarm creation"
|
|
|
54
54
|
LOG = logging.getLogger(__name__)
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
@patch(target=
|
|
57
|
+
@patch(target=Alarm.update_state)
|
|
58
58
|
def update_state(target, self, reason, reason_data, state_value):
|
|
59
59
|
if reason_data is None:
|
|
60
60
|
reason_data = ""
|
|
@@ -115,21 +115,19 @@ def put_metric_alarm(
|
|
|
115
115
|
description: str,
|
|
116
116
|
dimensions: list[dict[str, str]],
|
|
117
117
|
alarm_actions: list[str],
|
|
118
|
-
metric_data_queries:
|
|
119
|
-
datapoints_to_alarm:
|
|
120
|
-
extended_statistic:
|
|
121
|
-
ok_actions:
|
|
122
|
-
insufficient_data_actions:
|
|
123
|
-
unit:
|
|
118
|
+
metric_data_queries: list[Any] | None = None,
|
|
119
|
+
datapoints_to_alarm: int | None = None,
|
|
120
|
+
extended_statistic: str | None = None,
|
|
121
|
+
ok_actions: list[str] | None = None,
|
|
122
|
+
insufficient_data_actions: list[str] | None = None,
|
|
123
|
+
unit: str | None = None,
|
|
124
124
|
actions_enabled: bool = True,
|
|
125
|
-
treat_missing_data:
|
|
126
|
-
evaluate_low_sample_count_percentile:
|
|
127
|
-
threshold_metric_id:
|
|
128
|
-
rule:
|
|
129
|
-
tags:
|
|
130
|
-
) ->
|
|
131
|
-
if description:
|
|
132
|
-
description = escape(description)
|
|
125
|
+
treat_missing_data: str | None = None,
|
|
126
|
+
evaluate_low_sample_count_percentile: str | None = None,
|
|
127
|
+
threshold_metric_id: str | None = None,
|
|
128
|
+
rule: str | None = None,
|
|
129
|
+
tags: list[dict[str, str]] | None = None,
|
|
130
|
+
) -> Alarm:
|
|
133
131
|
return target(
|
|
134
132
|
self,
|
|
135
133
|
name,
|
|
@@ -158,7 +156,7 @@ def put_metric_alarm(
|
|
|
158
156
|
)
|
|
159
157
|
|
|
160
158
|
|
|
161
|
-
def create_metric_data_query_from_alarm(alarm:
|
|
159
|
+
def create_metric_data_query_from_alarm(alarm: Alarm):
|
|
162
160
|
# TODO may need to be adapted for other use cases
|
|
163
161
|
# verified return value with a snapshot test
|
|
164
162
|
return [
|
|
@@ -179,7 +177,7 @@ def create_metric_data_query_from_alarm(alarm: FakeAlarm):
|
|
|
179
177
|
|
|
180
178
|
|
|
181
179
|
def create_message_response_update_state_lambda(
|
|
182
|
-
alarm:
|
|
180
|
+
alarm: Alarm, old_state, old_state_reason, old_state_timestamp
|
|
183
181
|
):
|
|
184
182
|
response = {
|
|
185
183
|
"accountId": extract_account_id_from_arn(alarm.alarm_arn),
|
|
@@ -189,12 +187,12 @@ def create_message_response_update_state_lambda(
|
|
|
189
187
|
"state": {
|
|
190
188
|
"value": alarm.state_value,
|
|
191
189
|
"reason": alarm.state_reason,
|
|
192
|
-
"timestamp": alarm.state_updated_timestamp,
|
|
190
|
+
"timestamp": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
|
|
193
191
|
},
|
|
194
192
|
"previousState": {
|
|
195
193
|
"value": old_state,
|
|
196
194
|
"reason": old_state_reason,
|
|
197
|
-
"timestamp": old_state_timestamp,
|
|
195
|
+
"timestamp": _to_iso_8601_datetime_with_nanoseconds(old_state_timestamp),
|
|
198
196
|
},
|
|
199
197
|
"configuration": {
|
|
200
198
|
"description": alarm.description or "",
|
|
@@ -204,7 +202,7 @@ def create_message_response_update_state_lambda(
|
|
|
204
202
|
), # TODO: add test with metric_data_queries
|
|
205
203
|
},
|
|
206
204
|
},
|
|
207
|
-
"time": alarm.state_updated_timestamp,
|
|
205
|
+
"time": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
|
|
208
206
|
"region": alarm.region_name,
|
|
209
207
|
"source": "aws.cloudwatch",
|
|
210
208
|
}
|
|
@@ -217,10 +215,12 @@ def create_message_response_update_state_sns(alarm, old_state):
|
|
|
217
215
|
"OldStateValue": old_state,
|
|
218
216
|
"AlarmName": alarm.name,
|
|
219
217
|
"AlarmDescription": alarm.description or "",
|
|
220
|
-
"AlarmConfigurationUpdatedTimestamp":
|
|
218
|
+
"AlarmConfigurationUpdatedTimestamp": _to_iso_8601_datetime_with_nanoseconds(
|
|
219
|
+
alarm.configuration_updated_timestamp
|
|
220
|
+
),
|
|
221
221
|
"NewStateValue": alarm.state_value,
|
|
222
222
|
"NewStateReason": alarm.state_reason,
|
|
223
|
-
"StateChangeTime": alarm.state_updated_timestamp,
|
|
223
|
+
"StateChangeTime": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
|
|
224
224
|
# the long-name for 'region' should be used - as we don't have it, we use the short name
|
|
225
225
|
# which needs to be slightly changed to make snapshot tests work
|
|
226
226
|
"Region": alarm.region_name.replace("-", " ").capitalize(),
|
|
@@ -268,6 +268,11 @@ class ValidationError(CommonServiceException):
|
|
|
268
268
|
super().__init__("ValidationError", message, 400, True)
|
|
269
269
|
|
|
270
270
|
|
|
271
|
+
def _to_iso_8601_datetime_with_nanoseconds(date: datetime | None) -> str | None:
|
|
272
|
+
if date is not None:
|
|
273
|
+
return date.strftime("%Y-%m-%dT%H:%M:%S.%f000Z")
|
|
274
|
+
|
|
275
|
+
|
|
271
276
|
def _set_alarm_actions(context, alarm_names, enabled):
|
|
272
277
|
backend = cloudwatch_backends[context.account_id][context.region]
|
|
273
278
|
for name in alarm_names:
|
|
@@ -4,8 +4,6 @@ import logging
|
|
|
4
4
|
import re
|
|
5
5
|
import threading
|
|
6
6
|
import uuid
|
|
7
|
-
from datetime import timezone
|
|
8
|
-
from typing import List
|
|
9
7
|
|
|
10
8
|
from localstack.aws.api import CommonServiceException, RequestContext, handler
|
|
11
9
|
from localstack.aws.api.cloudwatch import (
|
|
@@ -17,6 +15,7 @@ from localstack.aws.api.cloudwatch import (
|
|
|
17
15
|
AlarmTypes,
|
|
18
16
|
AmazonResourceName,
|
|
19
17
|
CloudwatchApi,
|
|
18
|
+
ContributorId,
|
|
20
19
|
DashboardBody,
|
|
21
20
|
DashboardName,
|
|
22
21
|
DashboardNamePrefix,
|
|
@@ -109,17 +108,11 @@ _STORE_LOCK = threading.RLock()
|
|
|
109
108
|
AWS_MAX_DATAPOINTS_ACCEPTED: int = 1440
|
|
110
109
|
|
|
111
110
|
|
|
112
|
-
class
|
|
113
|
-
# TODO: check this error against AWS (doesn't exist in the API)
|
|
111
|
+
class ValidationException(CommonServiceException):
|
|
114
112
|
def __init__(self, message: str):
|
|
115
113
|
super().__init__("ValidationError", message, 400, True)
|
|
116
114
|
|
|
117
115
|
|
|
118
|
-
class InvalidParameterCombination(CommonServiceException):
|
|
119
|
-
def __init__(self, message: str):
|
|
120
|
-
super().__init__("InvalidParameterCombination", message, 400, True)
|
|
121
|
-
|
|
122
|
-
|
|
123
116
|
def _validate_parameters_for_put_metric_data(metric_data: MetricData) -> None:
|
|
124
117
|
for index, metric_item in enumerate(metric_data):
|
|
125
118
|
indexplusone = index + 1
|
|
@@ -244,10 +237,10 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
244
237
|
label_options: LabelOptions = None,
|
|
245
238
|
**kwargs,
|
|
246
239
|
) -> GetMetricDataOutput:
|
|
247
|
-
results:
|
|
240
|
+
results: list[MetricDataResult] = []
|
|
248
241
|
limit = max_datapoints or 100_800
|
|
249
242
|
messages: MetricDataResultMessages = []
|
|
250
|
-
nxt = None
|
|
243
|
+
nxt: str | None = None
|
|
251
244
|
label_additions = []
|
|
252
245
|
|
|
253
246
|
for diff in LABEL_DIFFERENTIATORS:
|
|
@@ -281,14 +274,14 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
281
274
|
timestamp_value_dicts = [
|
|
282
275
|
{
|
|
283
276
|
"Timestamp": timestamp,
|
|
284
|
-
"Value": value,
|
|
277
|
+
"Value": float(value),
|
|
285
278
|
}
|
|
286
279
|
for timestamp, value in zip(timestamps, values, strict=False)
|
|
287
280
|
]
|
|
288
281
|
|
|
289
282
|
pagination = PaginatedList(timestamp_value_dicts)
|
|
290
283
|
timestamp_page, nxt = pagination.get_page(
|
|
291
|
-
lambda item: item.get("Timestamp"),
|
|
284
|
+
lambda item: str(item.get("Timestamp")),
|
|
292
285
|
next_token=next_token,
|
|
293
286
|
page_size=limit,
|
|
294
287
|
)
|
|
@@ -316,6 +309,11 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
316
309
|
state_reason_data: StateReasonData = None,
|
|
317
310
|
**kwargs,
|
|
318
311
|
) -> None:
|
|
312
|
+
if state_value not in ("OK", "ALARM", "INSUFFICIENT_DATA"):
|
|
313
|
+
raise ValidationException(
|
|
314
|
+
f"1 validation error detected: Value '{state_value}' at 'stateValue' failed to satisfy constraint: Member must satisfy enum value set: [INSUFFICIENT_DATA, ALARM, OK]"
|
|
315
|
+
)
|
|
316
|
+
|
|
319
317
|
try:
|
|
320
318
|
if state_reason_data:
|
|
321
319
|
state_reason_data = json.loads(state_reason_data)
|
|
@@ -334,10 +332,6 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
334
332
|
raise ResourceNotFound()
|
|
335
333
|
|
|
336
334
|
old_state = alarm.alarm["StateValue"]
|
|
337
|
-
if state_value not in ("OK", "ALARM", "INSUFFICIENT_DATA"):
|
|
338
|
-
raise ValidationError(
|
|
339
|
-
f"1 validation error detected: Value '{state_value}' at 'stateValue' failed to satisfy constraint: Member must satisfy enum value set: [INSUFFICIENT_DATA, ALARM, OK]"
|
|
340
|
-
)
|
|
341
335
|
|
|
342
336
|
old_state_reason = alarm.alarm["StateReason"]
|
|
343
337
|
old_state_update_timestamp = alarm.alarm["StateUpdatedTimestamp"]
|
|
@@ -345,7 +339,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
345
339
|
if old_state == state_value:
|
|
346
340
|
return
|
|
347
341
|
|
|
348
|
-
alarm.alarm["StateTransitionedTimestamp"] = datetime.datetime.now(
|
|
342
|
+
alarm.alarm["StateTransitionedTimestamp"] = datetime.datetime.now(datetime.UTC)
|
|
349
343
|
# update startDate (=last ALARM date) - should only update when a new alarm is triggered
|
|
350
344
|
# the date is only updated if we have a reason-data, which is set by an alarm
|
|
351
345
|
if state_reason_data:
|
|
@@ -417,7 +411,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
417
411
|
"ignore",
|
|
418
412
|
"missing",
|
|
419
413
|
]:
|
|
420
|
-
raise
|
|
414
|
+
raise ValidationException(
|
|
421
415
|
f"The value {request['TreatMissingData']} is not supported for TreatMissingData parameter. Supported values are [breaching, notBreaching, ignore, missing]."
|
|
422
416
|
)
|
|
423
417
|
# do some sanity checks:
|
|
@@ -426,7 +420,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
426
420
|
value = request.get("Period")
|
|
427
421
|
if value not in (10, 30):
|
|
428
422
|
if value % 60 != 0:
|
|
429
|
-
raise
|
|
423
|
+
raise ValidationException("Period must be 10, 30 or a multiple of 60")
|
|
430
424
|
if request.get("Statistic"):
|
|
431
425
|
if request.get("Statistic") not in [
|
|
432
426
|
"SampleCount",
|
|
@@ -435,7 +429,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
435
429
|
"Minimum",
|
|
436
430
|
"Maximum",
|
|
437
431
|
]:
|
|
438
|
-
raise
|
|
432
|
+
raise ValidationException(
|
|
439
433
|
f"Value '{request.get('Statistic')}' at 'statistic' failed to satisfy constraint: Member must satisfy enum value set: [Maximum, SampleCount, Sum, Minimum, Average]"
|
|
440
434
|
)
|
|
441
435
|
|
|
@@ -449,7 +443,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
449
443
|
"evaluate",
|
|
450
444
|
"ignore",
|
|
451
445
|
):
|
|
452
|
-
raise
|
|
446
|
+
raise ValidationException(
|
|
453
447
|
f"Option {evaluate_low_sample_count_percentile} is not supported. "
|
|
454
448
|
"Supported options for parameter EvaluateLowSampleCountPercentile are evaluate and ignore."
|
|
455
449
|
)
|
|
@@ -692,7 +686,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
692
686
|
expected_datapoints = (end_time_unix - start_time_unix) / period
|
|
693
687
|
|
|
694
688
|
if expected_datapoints > AWS_MAX_DATAPOINTS_ACCEPTED:
|
|
695
|
-
raise
|
|
689
|
+
raise InvalidParameterCombinationException(
|
|
696
690
|
f"You have requested up to {int(expected_datapoints)} datapoints, which exceeds the limit of {AWS_MAX_DATAPOINTS_ACCEPTED}. "
|
|
697
691
|
f"You may reduce the datapoints requested by increasing Period, or decreasing the time range."
|
|
698
692
|
)
|
|
@@ -739,7 +733,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
739
733
|
for i, timestamp in enumerate(timestamps):
|
|
740
734
|
stat_datapoints.setdefault(selected_unit, {})
|
|
741
735
|
stat_datapoints[selected_unit].setdefault(timestamp, {})
|
|
742
|
-
stat_datapoints[selected_unit][timestamp][stat] = values[i]
|
|
736
|
+
stat_datapoints[selected_unit][timestamp][stat] = float(values[i])
|
|
743
737
|
stat_datapoints[selected_unit][timestamp]["Unit"] = selected_unit
|
|
744
738
|
|
|
745
739
|
datapoints: list[Datapoint] = []
|
|
@@ -824,14 +818,15 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
|
|
|
824
818
|
def describe_alarm_history(
|
|
825
819
|
self,
|
|
826
820
|
context: RequestContext,
|
|
827
|
-
alarm_name: AlarmName = None,
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
821
|
+
alarm_name: AlarmName | None = None,
|
|
822
|
+
alarm_contributor_id: ContributorId | None = None,
|
|
823
|
+
alarm_types: AlarmTypes | None = None,
|
|
824
|
+
history_item_type: HistoryItemType | None = None,
|
|
825
|
+
start_date: Timestamp | None = None,
|
|
826
|
+
end_date: Timestamp | None = None,
|
|
827
|
+
max_records: MaxRecords | None = None,
|
|
828
|
+
next_token: NextToken | None = None,
|
|
829
|
+
scan_by: ScanBy | None = None,
|
|
835
830
|
**kwargs,
|
|
836
831
|
) -> DescribeAlarmHistoryOutput:
|
|
837
832
|
store = self.get_store(context.account_id, context.region)
|
|
@@ -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,57 +14,57 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class CloudWatchAlarmProperties(TypedDict):
|
|
17
|
-
ComparisonOperator:
|
|
18
|
-
EvaluationPeriods:
|
|
19
|
-
ActionsEnabled:
|
|
20
|
-
AlarmActions:
|
|
21
|
-
AlarmDescription:
|
|
22
|
-
AlarmName:
|
|
23
|
-
Arn:
|
|
24
|
-
DatapointsToAlarm:
|
|
25
|
-
Dimensions:
|
|
26
|
-
EvaluateLowSampleCountPercentile:
|
|
27
|
-
ExtendedStatistic:
|
|
28
|
-
Id:
|
|
29
|
-
InsufficientDataActions:
|
|
30
|
-
MetricName:
|
|
31
|
-
Metrics:
|
|
32
|
-
Namespace:
|
|
33
|
-
OKActions:
|
|
34
|
-
Period:
|
|
35
|
-
Statistic:
|
|
36
|
-
Threshold:
|
|
37
|
-
ThresholdMetricId:
|
|
38
|
-
TreatMissingData:
|
|
39
|
-
Unit:
|
|
17
|
+
ComparisonOperator: str | None
|
|
18
|
+
EvaluationPeriods: int | None
|
|
19
|
+
ActionsEnabled: bool | None
|
|
20
|
+
AlarmActions: list[str] | None
|
|
21
|
+
AlarmDescription: str | None
|
|
22
|
+
AlarmName: str | None
|
|
23
|
+
Arn: str | None
|
|
24
|
+
DatapointsToAlarm: int | None
|
|
25
|
+
Dimensions: list[Dimension] | None
|
|
26
|
+
EvaluateLowSampleCountPercentile: str | None
|
|
27
|
+
ExtendedStatistic: str | None
|
|
28
|
+
Id: str | None
|
|
29
|
+
InsufficientDataActions: list[str] | None
|
|
30
|
+
MetricName: str | None
|
|
31
|
+
Metrics: list[MetricDataQuery] | None
|
|
32
|
+
Namespace: str | None
|
|
33
|
+
OKActions: list[str] | None
|
|
34
|
+
Period: int | None
|
|
35
|
+
Statistic: str | None
|
|
36
|
+
Threshold: float | None
|
|
37
|
+
ThresholdMetricId: str | None
|
|
38
|
+
TreatMissingData: str | None
|
|
39
|
+
Unit: str | None
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class Dimension(TypedDict):
|
|
43
|
-
Name:
|
|
44
|
-
Value:
|
|
43
|
+
Name: str | None
|
|
44
|
+
Value: str | None
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
class Metric(TypedDict):
|
|
48
|
-
Dimensions:
|
|
49
|
-
MetricName:
|
|
50
|
-
Namespace:
|
|
48
|
+
Dimensions: list[Dimension] | None
|
|
49
|
+
MetricName: str | None
|
|
50
|
+
Namespace: str | None
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class MetricStat(TypedDict):
|
|
54
|
-
Metric:
|
|
55
|
-
Period:
|
|
56
|
-
Stat:
|
|
57
|
-
Unit:
|
|
54
|
+
Metric: Metric | None
|
|
55
|
+
Period: int | None
|
|
56
|
+
Stat: str | None
|
|
57
|
+
Unit: str | None
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
class MetricDataQuery(TypedDict):
|
|
61
|
-
Id:
|
|
62
|
-
AccountId:
|
|
63
|
-
Expression:
|
|
64
|
-
Label:
|
|
65
|
-
MetricStat:
|
|
66
|
-
Period:
|
|
67
|
-
ReturnData:
|
|
61
|
+
Id: str | None
|
|
62
|
+
AccountId: str | None
|
|
63
|
+
Expression: str | None
|
|
64
|
+
Label: str | None
|
|
65
|
+
MetricStat: MetricStat | None
|
|
66
|
+
Period: int | None
|
|
67
|
+
ReturnData: bool | None
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
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 CloudWatchAlarmProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::CloudWatch::Alarm"
|
|
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.cloudwatch.resource_providers.aws_cloudwatch_alarm import (
|
|
@@ -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 (
|
|
@@ -15,17 +15,17 @@ from localstack.utils.strings import str_to_bool
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class CloudWatchCompositeAlarmProperties(TypedDict):
|
|
18
|
-
AlarmRule:
|
|
19
|
-
ActionsEnabled:
|
|
20
|
-
ActionsSuppressor:
|
|
21
|
-
ActionsSuppressorExtensionPeriod:
|
|
22
|
-
ActionsSuppressorWaitPeriod:
|
|
23
|
-
AlarmActions:
|
|
24
|
-
AlarmDescription:
|
|
25
|
-
AlarmName:
|
|
26
|
-
Arn:
|
|
27
|
-
InsufficientDataActions:
|
|
28
|
-
OKActions:
|
|
18
|
+
AlarmRule: str | None
|
|
19
|
+
ActionsEnabled: bool | None
|
|
20
|
+
ActionsSuppressor: str | None
|
|
21
|
+
ActionsSuppressorExtensionPeriod: int | None
|
|
22
|
+
ActionsSuppressorWaitPeriod: int | None
|
|
23
|
+
AlarmActions: list[str] | None
|
|
24
|
+
AlarmDescription: str | None
|
|
25
|
+
AlarmName: str | None
|
|
26
|
+
Arn: str | None
|
|
27
|
+
InsufficientDataActions: list[str] | None
|
|
28
|
+
OKActions: list[str] | None
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
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 CloudWatchCompositeAlarmProviderPlugin(CloudFormationResourceProviderPlugi
|
|
|
10
8
|
name = "AWS::CloudWatch::CompositeAlarm"
|
|
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.cloudwatch.resource_providers.aws_cloudwatch_compositealarm import (
|