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
|
@@ -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 EC2VPCEndpointProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::EC2::VPCEndpoint"
|
|
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.ec2.resource_providers.aws_ec2_vpcendpoint 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 (
|
|
@@ -14,10 +14,10 @@ from localstack.services.cloudformation.resource_provider import (
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class EC2VPCGatewayAttachmentProperties(TypedDict):
|
|
17
|
-
VpcId:
|
|
18
|
-
Id:
|
|
19
|
-
InternetGatewayId:
|
|
20
|
-
VpnGatewayId:
|
|
17
|
+
VpcId: str | None
|
|
18
|
+
Id: str | None
|
|
19
|
+
InternetGatewayId: str | None
|
|
20
|
+
VpnGatewayId: str | None
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
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 EC2VPCGatewayAttachmentProviderPlugin(CloudFormationResourceProviderPlugin
|
|
|
10
8
|
name = "AWS::EC2::VPCGatewayAttachment"
|
|
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.ec2.resource_providers.aws_ec2_vpcgatewayattachment import (
|
|
@@ -3,10 +3,9 @@ from __future__ import annotations
|
|
|
3
3
|
|
|
4
4
|
import logging
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import TypedDict
|
|
7
7
|
|
|
8
8
|
import localstack.services.cloudformation.provider_utils as util
|
|
9
|
-
from localstack.constants import AWS_REGION_US_EAST_1, DEFAULT_AWS_ACCOUNT_ID
|
|
10
9
|
from localstack.services.cloudformation.resource_provider import (
|
|
11
10
|
OperationStatus,
|
|
12
11
|
ProgressEvent,
|
|
@@ -22,34 +21,34 @@ default_repos_per_stack = {}
|
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
class ECRRepositoryProperties(TypedDict):
|
|
25
|
-
Arn:
|
|
26
|
-
EncryptionConfiguration:
|
|
27
|
-
ImageScanningConfiguration:
|
|
28
|
-
ImageTagMutability:
|
|
29
|
-
LifecyclePolicy:
|
|
30
|
-
RepositoryName:
|
|
31
|
-
RepositoryPolicyText:
|
|
32
|
-
RepositoryUri:
|
|
33
|
-
Tags:
|
|
24
|
+
Arn: str | None
|
|
25
|
+
EncryptionConfiguration: EncryptionConfiguration | None
|
|
26
|
+
ImageScanningConfiguration: ImageScanningConfiguration | None
|
|
27
|
+
ImageTagMutability: str | None
|
|
28
|
+
LifecyclePolicy: LifecyclePolicy | None
|
|
29
|
+
RepositoryName: str | None
|
|
30
|
+
RepositoryPolicyText: dict | str | None
|
|
31
|
+
RepositoryUri: str | None
|
|
32
|
+
Tags: list[Tag] | None
|
|
34
33
|
|
|
35
34
|
|
|
36
35
|
class LifecyclePolicy(TypedDict):
|
|
37
|
-
LifecyclePolicyText:
|
|
38
|
-
RegistryId:
|
|
36
|
+
LifecyclePolicyText: str | None
|
|
37
|
+
RegistryId: str | None
|
|
39
38
|
|
|
40
39
|
|
|
41
40
|
class Tag(TypedDict):
|
|
42
|
-
Key:
|
|
43
|
-
Value:
|
|
41
|
+
Key: str | None
|
|
42
|
+
Value: str | None
|
|
44
43
|
|
|
45
44
|
|
|
46
45
|
class ImageScanningConfiguration(TypedDict):
|
|
47
|
-
ScanOnPush:
|
|
46
|
+
ScanOnPush: bool | None
|
|
48
47
|
|
|
49
48
|
|
|
50
49
|
class EncryptionConfiguration(TypedDict):
|
|
51
|
-
EncryptionType:
|
|
52
|
-
KmsKey:
|
|
50
|
+
EncryptionType: str | None
|
|
51
|
+
KmsKey: str | None
|
|
53
52
|
|
|
54
53
|
|
|
55
54
|
REPEATED_INVOCATION = "repeated_invocation"
|
|
@@ -90,6 +89,10 @@ class ECRRepositoryProvider(ResourceProvider[ECRRepositoryProperties]):
|
|
|
90
89
|
|
|
91
90
|
"""
|
|
92
91
|
model = request.desired_state
|
|
92
|
+
model["RepositoryName"] = (
|
|
93
|
+
model.get("RepositoryName")
|
|
94
|
+
or util.generate_default_name(request.stack_name, request.logical_resource_id).lower()
|
|
95
|
+
)
|
|
93
96
|
|
|
94
97
|
default_repos_per_stack[request.stack_name] = model["RepositoryName"]
|
|
95
98
|
LOG.warning(
|
|
@@ -98,7 +101,7 @@ class ECRRepositoryProvider(ResourceProvider[ECRRepositoryProperties]):
|
|
|
98
101
|
model.update(
|
|
99
102
|
{
|
|
100
103
|
"Arn": arns.ecr_repository_arn(
|
|
101
|
-
model["RepositoryName"],
|
|
104
|
+
model["RepositoryName"], request.account_id, request.region_name
|
|
102
105
|
),
|
|
103
106
|
"RepositoryUri": "http://localhost:4566",
|
|
104
107
|
"ImageTagMutability": "MUTABLE",
|
|
@@ -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 ECRRepositoryProviderPlugin(CloudFormationResourceProviderPlugin):
|
|
|
10
8
|
name = "AWS::ECR::Repository"
|
|
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.ecr.resource_providers.aws_ecr_repository import (
|
localstack/services/edge.py
CHANGED
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
import shlex
|
|
4
4
|
import subprocess
|
|
5
5
|
import sys
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import TypeVar
|
|
7
7
|
|
|
8
8
|
from localstack import config, constants
|
|
9
9
|
from localstack.config import HostAndPort
|
|
@@ -32,7 +32,7 @@ the actual AWS service call is made."""
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def do_start_edge(
|
|
35
|
-
listen: HostAndPort |
|
|
35
|
+
listen: HostAndPort | list[HostAndPort], use_ssl: bool, asynchronous: bool = False
|
|
36
36
|
):
|
|
37
37
|
from localstack.aws.serving.edge import serve_gateway
|
|
38
38
|
|
|
@@ -50,7 +50,7 @@ def can_use_sudo():
|
|
|
50
50
|
def ensure_can_use_sudo():
|
|
51
51
|
if not is_root() and not can_use_sudo():
|
|
52
52
|
if not sys.stdin.isatty():
|
|
53
|
-
raise
|
|
53
|
+
raise OSError("cannot get sudo password from non-tty input")
|
|
54
54
|
print("Please enter your sudo password (required to configure local network):")
|
|
55
55
|
run("sudo -v", stdin=True)
|
|
56
56
|
|
|
@@ -72,7 +72,7 @@ def start_component(
|
|
|
72
72
|
default_port=constants.DEFAULT_PORT_EDGE,
|
|
73
73
|
),
|
|
74
74
|
)
|
|
75
|
-
raise Exception("Unexpected component name '
|
|
75
|
+
raise Exception(f"Unexpected component name '{component}' received during start up")
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
def start_proxy(
|
|
@@ -166,7 +166,7 @@ def start_edge(listen_str: str, use_ssl: bool = True, asynchronous: bool = False
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
def run_module_as_sudo(
|
|
169
|
-
module: str, arguments:
|
|
169
|
+
module: str, arguments: list[str] | None = None, asynchronous=False, env_vars=None
|
|
170
170
|
):
|
|
171
171
|
# prepare environment
|
|
172
172
|
env_vars = env_vars or {}
|
|
@@ -195,7 +195,7 @@ def run_module_as_sudo(
|
|
|
195
195
|
return result
|
|
196
196
|
|
|
197
197
|
|
|
198
|
-
def parse_gateway_listen(listen: str, default_host: str, default_port: int) ->
|
|
198
|
+
def parse_gateway_listen(listen: str, default_host: str, default_port: int) -> list[HostAndPort]:
|
|
199
199
|
addresses = []
|
|
200
200
|
for address in listen.split(","):
|
|
201
201
|
addresses.append(HostAndPort.parse(address, default_host, default_port))
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
from contextlib import contextmanager
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import cast
|
|
3
3
|
|
|
4
4
|
from botocore.exceptions import ClientError
|
|
5
5
|
|
|
6
|
-
from localstack import constants
|
|
7
6
|
from localstack.aws.api import RequestContext, handler
|
|
8
7
|
from localstack.aws.api.es import (
|
|
9
8
|
ARN,
|
|
@@ -68,11 +67,12 @@ from localstack.aws.api.opensearch import (
|
|
|
68
67
|
VersionString,
|
|
69
68
|
)
|
|
70
69
|
from localstack.aws.connect import connect_to
|
|
70
|
+
from localstack.services.opensearch.packages import ELASTICSEARCH_DEFAULT_VERSION
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
def _version_to_opensearch(
|
|
74
|
-
version:
|
|
75
|
-
) ->
|
|
74
|
+
version: ElasticsearchVersionString | None,
|
|
75
|
+
) -> VersionString | None:
|
|
76
76
|
if version is not None:
|
|
77
77
|
if version.startswith("OpenSearch_"):
|
|
78
78
|
return version
|
|
@@ -81,8 +81,8 @@ def _version_to_opensearch(
|
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
def _version_from_opensearch(
|
|
84
|
-
version:
|
|
85
|
-
) ->
|
|
84
|
+
version: VersionString | None,
|
|
85
|
+
) -> ElasticsearchVersionString | None:
|
|
86
86
|
if version is not None:
|
|
87
87
|
if version.startswith("Elasticsearch_"):
|
|
88
88
|
return version.split("_")[1]
|
|
@@ -90,19 +90,19 @@ def _version_from_opensearch(
|
|
|
90
90
|
return version
|
|
91
91
|
|
|
92
92
|
|
|
93
|
-
def _instancetype_to_opensearch(instance_type:
|
|
93
|
+
def _instancetype_to_opensearch(instance_type: str | None) -> str | None:
|
|
94
94
|
if instance_type is not None:
|
|
95
95
|
return instance_type.replace("elasticsearch", "search")
|
|
96
96
|
|
|
97
97
|
|
|
98
|
-
def _instancetype_from_opensearch(instance_type:
|
|
98
|
+
def _instancetype_from_opensearch(instance_type: str | None) -> str | None:
|
|
99
99
|
if instance_type is not None:
|
|
100
100
|
return instance_type.replace("search", "elasticsearch")
|
|
101
101
|
|
|
102
102
|
|
|
103
103
|
def _clusterconfig_from_opensearch(
|
|
104
|
-
cluster_config:
|
|
105
|
-
) ->
|
|
104
|
+
cluster_config: ClusterConfig | None,
|
|
105
|
+
) -> ElasticsearchClusterConfig | None:
|
|
106
106
|
if cluster_config is not None:
|
|
107
107
|
# Just take the whole typed dict and typecast it to our target type
|
|
108
108
|
result = cast(ElasticsearchClusterConfig, cluster_config)
|
|
@@ -117,8 +117,8 @@ def _clusterconfig_from_opensearch(
|
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
def _domainstatus_from_opensearch(
|
|
120
|
-
domain_status:
|
|
121
|
-
) ->
|
|
120
|
+
domain_status: DomainStatus | None,
|
|
121
|
+
) -> ElasticsearchDomainStatus | None:
|
|
122
122
|
if domain_status is not None:
|
|
123
123
|
# Just take the whole typed dict and typecast it to our target type
|
|
124
124
|
result = cast(ElasticsearchDomainStatus, domain_status)
|
|
@@ -135,8 +135,8 @@ def _domainstatus_from_opensearch(
|
|
|
135
135
|
|
|
136
136
|
|
|
137
137
|
def _clusterconfig_to_opensearch(
|
|
138
|
-
elasticsearch_cluster_config:
|
|
139
|
-
) ->
|
|
138
|
+
elasticsearch_cluster_config: ElasticsearchClusterConfig | None,
|
|
139
|
+
) -> ClusterConfig | None:
|
|
140
140
|
if elasticsearch_cluster_config is not None:
|
|
141
141
|
result = cast(ClusterConfig, elasticsearch_cluster_config)
|
|
142
142
|
if instance_type := result.get("InstanceType"):
|
|
@@ -149,8 +149,8 @@ def _clusterconfig_to_opensearch(
|
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
def _domainconfig_from_opensearch(
|
|
152
|
-
domain_config:
|
|
153
|
-
) ->
|
|
152
|
+
domain_config: DomainConfig | None,
|
|
153
|
+
) -> ElasticsearchDomainConfig | None:
|
|
154
154
|
if domain_config is not None:
|
|
155
155
|
result = cast(ElasticsearchDomainConfig, domain_config)
|
|
156
156
|
engine_version = domain_config.get("EngineVersion", {})
|
|
@@ -169,8 +169,8 @@ def _domainconfig_from_opensearch(
|
|
|
169
169
|
|
|
170
170
|
|
|
171
171
|
def _compatible_version_list_from_opensearch(
|
|
172
|
-
compatible_version_list:
|
|
173
|
-
) ->
|
|
172
|
+
compatible_version_list: CompatibleVersionsList | None,
|
|
173
|
+
) -> CompatibleElasticsearchVersionsList | None:
|
|
174
174
|
if compatible_version_list is not None:
|
|
175
175
|
return [
|
|
176
176
|
CompatibleVersionsMap(
|
|
@@ -236,7 +236,7 @@ class EsProvider(EsApi):
|
|
|
236
236
|
engine_version = (
|
|
237
237
|
_version_to_opensearch(elasticsearch_version)
|
|
238
238
|
if elasticsearch_version
|
|
239
|
-
else
|
|
239
|
+
else ELASTICSEARCH_DEFAULT_VERSION
|
|
240
240
|
)
|
|
241
241
|
kwargs = {
|
|
242
242
|
"DomainName": domain_name,
|
|
@@ -304,7 +304,7 @@ class EsProvider(EsApi):
|
|
|
304
304
|
region_name=context.region, aws_access_key_id=context.account_id
|
|
305
305
|
).opensearch
|
|
306
306
|
|
|
307
|
-
payload:
|
|
307
|
+
payload: dict
|
|
308
308
|
if "ElasticsearchClusterConfig" in payload:
|
|
309
309
|
payload["ClusterConfig"] = payload["ElasticsearchClusterConfig"]
|
|
310
310
|
payload["ClusterConfig"]["InstanceType"] = _instancetype_to_opensearch(
|
|
@@ -347,7 +347,7 @@ class EsProvider(EsApi):
|
|
|
347
347
|
with exception_mapper():
|
|
348
348
|
domain_names = opensearch_client.list_domain_names(**kwargs)["DomainNames"]
|
|
349
349
|
|
|
350
|
-
return ListDomainNamesResponse(DomainNames=cast(
|
|
350
|
+
return ListDomainNamesResponse(DomainNames=cast(DomainInfoList | None, domain_names))
|
|
351
351
|
|
|
352
352
|
def list_elasticsearch_versions(
|
|
353
353
|
self,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
from datetime import
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
4
|
from typing import Self
|
|
5
5
|
|
|
6
6
|
from botocore.client import BaseClient
|
|
@@ -95,7 +95,7 @@ class ArchiveService:
|
|
|
95
95
|
self.archive.state = state
|
|
96
96
|
|
|
97
97
|
def set_creation_time(self) -> None:
|
|
98
|
-
self.archive.creation_time = datetime.now(
|
|
98
|
+
self.archive.creation_time = datetime.now(UTC)
|
|
99
99
|
|
|
100
100
|
def update(
|
|
101
101
|
self,
|
|
@@ -2,7 +2,7 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import re
|
|
4
4
|
import uuid
|
|
5
|
-
from datetime import
|
|
5
|
+
from datetime import UTC, datetime
|
|
6
6
|
|
|
7
7
|
from localstack.aws.api.events import (
|
|
8
8
|
Arn,
|
|
@@ -138,7 +138,7 @@ class ConnectionService:
|
|
|
138
138
|
auth_parameters,
|
|
139
139
|
)
|
|
140
140
|
self.connection.secret_arn = secret_arn
|
|
141
|
-
self.connection.last_authorized_time = datetime.now(
|
|
141
|
+
self.connection.last_authorized_time = datetime.now(UTC)
|
|
142
142
|
|
|
143
143
|
# Set new values
|
|
144
144
|
self.connection.authorization_type = auth_type
|
|
@@ -149,7 +149,7 @@ class ConnectionService:
|
|
|
149
149
|
)
|
|
150
150
|
self.connection.auth_parameters = public_auth_parameters
|
|
151
151
|
self.set_state(ConnectionState.AUTHORIZED)
|
|
152
|
-
self.connection.last_modified_time = datetime.now(
|
|
152
|
+
self.connection.last_modified_time = datetime.now(UTC)
|
|
153
153
|
|
|
154
154
|
except Exception as error:
|
|
155
155
|
LOG.warning(
|
|
@@ -162,7 +162,7 @@ class ConnectionService:
|
|
|
162
162
|
self.set_state(ConnectionState.DELETING)
|
|
163
163
|
self.delete_connection_secret(self.connection.secret_arn)
|
|
164
164
|
self.set_state(ConnectionState.DELETING) # required for AWS parity
|
|
165
|
-
self.connection.last_modified_time = datetime.now(
|
|
165
|
+
self.connection.last_modified_time = datetime.now(UTC)
|
|
166
166
|
|
|
167
167
|
def create_connection_secret(
|
|
168
168
|
self,
|
|
@@ -204,7 +204,7 @@ class ConnectionService:
|
|
|
204
204
|
try:
|
|
205
205
|
secretsmanager_client.update_secret(SecretId=secret_arn, SecretString=secret_value)
|
|
206
206
|
self.set_state(ConnectionState.AUTHORIZED)
|
|
207
|
-
self.connection.last_authorized_time = datetime.now(
|
|
207
|
+
self.connection.last_authorized_time = datetime.now(UTC)
|
|
208
208
|
except Exception as error:
|
|
209
209
|
LOG.warning("Secret with id %s updating failed with errors: %s.", secret_arn, error)
|
|
210
210
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
|
-
from datetime import
|
|
3
|
-
from typing import
|
|
2
|
+
from datetime import UTC, datetime
|
|
3
|
+
from typing import Self
|
|
4
4
|
|
|
5
5
|
from localstack.aws.api.events import (
|
|
6
6
|
Action,
|
|
@@ -34,11 +34,11 @@ class EventBusService:
|
|
|
34
34
|
name: EventBusName,
|
|
35
35
|
region: str,
|
|
36
36
|
account_id: str,
|
|
37
|
-
event_source_name:
|
|
38
|
-
description:
|
|
39
|
-
tags:
|
|
40
|
-
policy:
|
|
41
|
-
rules:
|
|
37
|
+
event_source_name: str | None = None,
|
|
38
|
+
description: str | None = None,
|
|
39
|
+
tags: TagList | None = None,
|
|
40
|
+
policy: str | None = None,
|
|
41
|
+
rules: RuleDict | None = None,
|
|
42
42
|
) -> Self:
|
|
43
43
|
return cls(
|
|
44
44
|
EventBus(
|
|
@@ -68,7 +68,7 @@ class EventBusService:
|
|
|
68
68
|
# TODO: cover via test
|
|
69
69
|
# if policy and any([action, principal, statement_id, condition]):
|
|
70
70
|
# raise ValueError("Combination of policy with other arguments is not allowed")
|
|
71
|
-
self.event_bus.last_modified_time = datetime.now(
|
|
71
|
+
self.event_bus.last_modified_time = datetime.now(UTC)
|
|
72
72
|
if policy: # policy document replaces all existing permissions
|
|
73
73
|
policy = json.loads(policy)
|
|
74
74
|
parsed_policy = ResourcePolicy(**policy)
|
|
@@ -102,7 +102,7 @@ class EventBusService:
|
|
|
102
102
|
for statement in policy["Statement"]
|
|
103
103
|
if statement.get("Sid") != statement_id
|
|
104
104
|
]
|
|
105
|
-
self.event_bus.last_modified_time = datetime.now(
|
|
105
|
+
self.event_bus.last_modified_time = datetime.now(UTC)
|
|
106
106
|
|
|
107
107
|
def _parse_statement(
|
|
108
108
|
self,
|
|
@@ -59,14 +59,21 @@ class EventRuleEngine:
|
|
|
59
59
|
for flat_pattern in flat_pattern_conditions
|
|
60
60
|
)
|
|
61
61
|
|
|
62
|
-
def _evaluate_condition(self, value, condition, field_exists: bool):
|
|
62
|
+
def _evaluate_condition(self, value: t.Any, condition: t.Any, field_exists: bool) -> bool:
|
|
63
63
|
if not isinstance(condition, dict):
|
|
64
64
|
return field_exists and value == condition
|
|
65
|
+
|
|
65
66
|
elif (must_exist := condition.get("exists")) is not None:
|
|
66
67
|
# if must_exists is True then field_exists must be True
|
|
67
68
|
# if must_exists is False then fields_exists must be False
|
|
68
69
|
return must_exist == field_exists
|
|
70
|
+
|
|
69
71
|
elif (anything_but := condition.get("anything-but")) is not None:
|
|
72
|
+
if not field_exists:
|
|
73
|
+
# anything-but can handle None `value`, but it needs to differentiate between user-set `null` and
|
|
74
|
+
# missing value
|
|
75
|
+
return False
|
|
76
|
+
|
|
70
77
|
if isinstance(anything_but, dict):
|
|
71
78
|
if (not_condition := anything_but.get("prefix")) is not None:
|
|
72
79
|
predicate = self._evaluate_prefix
|
|
@@ -95,6 +102,7 @@ class EventRuleEngine:
|
|
|
95
102
|
elif value is None:
|
|
96
103
|
# the remaining conditions require the value to not be None
|
|
97
104
|
return False
|
|
105
|
+
|
|
98
106
|
elif (prefix := condition.get("prefix")) is not None:
|
|
99
107
|
if isinstance(prefix, dict):
|
|
100
108
|
if (prefix_equal_ignore_case := prefix.get("equals-ignore-case")) is not None:
|
|
@@ -104,7 +112,7 @@ class EventRuleEngine:
|
|
|
104
112
|
|
|
105
113
|
elif (suffix := condition.get("suffix")) is not None:
|
|
106
114
|
if isinstance(suffix, dict):
|
|
107
|
-
if suffix_equal_ignore_case := suffix.get("equals-ignore-case"):
|
|
115
|
+
if (suffix_equal_ignore_case := suffix.get("equals-ignore-case")) is not None:
|
|
108
116
|
return self._evaluate_suffix(suffix_equal_ignore_case.lower(), value.lower())
|
|
109
117
|
else:
|
|
110
118
|
return self._evaluate_suffix(suffix, value)
|
|
@@ -126,19 +134,19 @@ class EventRuleEngine:
|
|
|
126
134
|
return False
|
|
127
135
|
|
|
128
136
|
@staticmethod
|
|
129
|
-
def _evaluate_prefix(condition: str | list, value:
|
|
130
|
-
return value.startswith(condition)
|
|
137
|
+
def _evaluate_prefix(condition: str | list, value: t.Any) -> bool:
|
|
138
|
+
return isinstance(value, str) and value.startswith(condition)
|
|
131
139
|
|
|
132
140
|
@staticmethod
|
|
133
|
-
def _evaluate_suffix(condition: str | list, value:
|
|
134
|
-
return value.endswith(condition)
|
|
141
|
+
def _evaluate_suffix(condition: str | list, value: t.Any) -> bool:
|
|
142
|
+
return isinstance(value, str) and value.endswith(condition)
|
|
135
143
|
|
|
136
144
|
@staticmethod
|
|
137
|
-
def _evaluate_equal_ignore_case(condition: str, value:
|
|
138
|
-
return condition.lower() == value.lower()
|
|
145
|
+
def _evaluate_equal_ignore_case(condition: str, value: t.Any) -> bool:
|
|
146
|
+
return isinstance(value, str) and condition.lower() == value.lower()
|
|
139
147
|
|
|
140
148
|
@staticmethod
|
|
141
|
-
def _evaluate_cidr(condition: str, value:
|
|
149
|
+
def _evaluate_cidr(condition: str, value: t.Any) -> bool:
|
|
142
150
|
try:
|
|
143
151
|
ip = ipaddress.ip_address(value)
|
|
144
152
|
return ip in ipaddress.ip_network(condition)
|
|
@@ -146,8 +154,10 @@ class EventRuleEngine:
|
|
|
146
154
|
return False
|
|
147
155
|
|
|
148
156
|
@staticmethod
|
|
149
|
-
def _evaluate_wildcard(condition: str, value:
|
|
150
|
-
return
|
|
157
|
+
def _evaluate_wildcard(condition: str, value: t.Any) -> bool:
|
|
158
|
+
return isinstance(value, str) and bool(
|
|
159
|
+
re.match(re.escape(condition).replace("\\*", ".+") + "$", value)
|
|
160
|
+
)
|
|
151
161
|
|
|
152
162
|
@staticmethod
|
|
153
163
|
def _evaluate_numeric_condition(conditions: list, value: t.Any) -> bool:
|
|
@@ -457,10 +467,18 @@ class EventPatternCompiler:
|
|
|
457
467
|
return
|
|
458
468
|
|
|
459
469
|
elif operator == "anything-but":
|
|
460
|
-
# anything-but can actually contain any kind of simple rule (str, number, and list)
|
|
470
|
+
# anything-but can actually contain any kind of simple rule (str, number, and list) except Null
|
|
471
|
+
if value is None:
|
|
472
|
+
raise InvalidEventPatternException(
|
|
473
|
+
f"{self.error_prefix}Value of anything-but must be an array or single string/number value."
|
|
474
|
+
)
|
|
461
475
|
if isinstance(value, list):
|
|
462
476
|
for v in value:
|
|
463
|
-
|
|
477
|
+
if v is None:
|
|
478
|
+
raise InvalidEventPatternException(
|
|
479
|
+
f"{self.error_prefix}Inside anything but list, start|null|boolean is not supported."
|
|
480
|
+
)
|
|
481
|
+
self._validate_rule(v, from_="anything-but")
|
|
464
482
|
|
|
465
483
|
return
|
|
466
484
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import uuid
|
|
2
2
|
from dataclasses import dataclass, field
|
|
3
|
-
from datetime import
|
|
3
|
+
from datetime import UTC, datetime
|
|
4
4
|
from enum import Enum
|
|
5
|
-
from typing import Literal,
|
|
5
|
+
from typing import Literal, TypeAlias, TypedDict
|
|
6
6
|
|
|
7
|
-
from localstack.aws.api
|
|
7
|
+
from localstack.aws.api import CommonServiceException
|
|
8
8
|
from localstack.aws.api.events import (
|
|
9
9
|
ApiDestinationDescription,
|
|
10
10
|
ApiDestinationHttpMethod,
|
|
@@ -66,10 +66,9 @@ from localstack.utils.tagging import TaggingService
|
|
|
66
66
|
TargetDict = dict[TargetId, Target]
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
class ValidationException(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
status_code: int = 400
|
|
69
|
+
class ValidationException(CommonServiceException):
|
|
70
|
+
def __init__(self, message: str):
|
|
71
|
+
super().__init__("ValidationException", message, 400, True)
|
|
73
72
|
|
|
74
73
|
|
|
75
74
|
class InvalidEventPatternException(Exception):
|
|
@@ -85,14 +84,14 @@ FormattedEvent = TypedDict( # functional syntax required due to name-name keys
|
|
|
85
84
|
{
|
|
86
85
|
"version": str,
|
|
87
86
|
"id": str,
|
|
88
|
-
"detail-type":
|
|
89
|
-
"source":
|
|
87
|
+
"detail-type": str | None,
|
|
88
|
+
"source": EventSourceName | None,
|
|
90
89
|
"account": str,
|
|
91
90
|
"time": EventTime,
|
|
92
91
|
"region": str,
|
|
93
|
-
"resources":
|
|
92
|
+
"resources": EventResourceList | None,
|
|
94
93
|
"detail": dict[str, str | dict],
|
|
95
|
-
"replay-name":
|
|
94
|
+
"replay-name": ReplayName | None,
|
|
96
95
|
"event-bus-name": EventBusName,
|
|
97
96
|
},
|
|
98
97
|
)
|
|
@@ -134,15 +133,15 @@ class Rule:
|
|
|
134
133
|
name: RuleName
|
|
135
134
|
region: str
|
|
136
135
|
account_id: str
|
|
137
|
-
schedule_expression:
|
|
138
|
-
event_pattern:
|
|
139
|
-
state:
|
|
140
|
-
description:
|
|
141
|
-
role_arn:
|
|
136
|
+
schedule_expression: ScheduleExpression | None = None
|
|
137
|
+
event_pattern: EventPattern | None = None
|
|
138
|
+
state: RuleState | None = None
|
|
139
|
+
description: RuleDescription | None = None
|
|
140
|
+
role_arn: RoleArn | None = None
|
|
142
141
|
tags: TagList = field(default_factory=list)
|
|
143
142
|
event_bus_name: EventBusName = "default"
|
|
144
143
|
targets: TargetDict = field(default_factory=dict)
|
|
145
|
-
managed_by:
|
|
144
|
+
managed_by: ManagedBy | None = None # can only be set by AWS services
|
|
146
145
|
created_by: CreatedBy = field(init=False)
|
|
147
146
|
|
|
148
147
|
def __post_init__(self):
|
|
@@ -171,12 +170,12 @@ class Replay:
|
|
|
171
170
|
destination: ReplayDestination # Event Bus Arn or Rule Arns
|
|
172
171
|
event_start_time: Timestamp
|
|
173
172
|
event_end_time: Timestamp
|
|
174
|
-
description:
|
|
175
|
-
state:
|
|
176
|
-
state_reason:
|
|
177
|
-
event_last_replayed_time:
|
|
178
|
-
replay_start_time:
|
|
179
|
-
replay_end_time:
|
|
173
|
+
description: ReplayDescription | None = None
|
|
174
|
+
state: ReplayState | None = None
|
|
175
|
+
state_reason: ReplayStateReason | None = None
|
|
176
|
+
event_last_replayed_time: Timestamp | None = None
|
|
177
|
+
replay_start_time: Timestamp | None = None
|
|
178
|
+
replay_end_time: Timestamp | None = None
|
|
180
179
|
|
|
181
180
|
@property
|
|
182
181
|
def arn(self) -> Arn:
|
|
@@ -217,17 +216,17 @@ class EventBus:
|
|
|
217
216
|
name: EventBusName
|
|
218
217
|
region: str
|
|
219
218
|
account_id: str
|
|
220
|
-
event_source_name:
|
|
221
|
-
description:
|
|
219
|
+
event_source_name: str | None = None
|
|
220
|
+
description: str | None = None
|
|
222
221
|
tags: TagList = field(default_factory=list)
|
|
223
|
-
policy:
|
|
222
|
+
policy: ResourcePolicy | None = None
|
|
224
223
|
rules: RuleDict = field(default_factory=dict)
|
|
225
224
|
creation_time: Timestamp = field(init=False)
|
|
226
225
|
last_modified_time: Timestamp = field(init=False)
|
|
227
226
|
|
|
228
227
|
def __post_init__(self):
|
|
229
|
-
self.creation_time = datetime.now(
|
|
230
|
-
self.last_modified_time = datetime.now(
|
|
228
|
+
self.creation_time = datetime.now(UTC)
|
|
229
|
+
self.last_modified_time = datetime.now(UTC)
|
|
231
230
|
if self.rules is None:
|
|
232
231
|
self.rules = {}
|
|
233
232
|
if self.tags is None:
|
|
@@ -259,7 +258,7 @@ class Connection:
|
|
|
259
258
|
id: str = str(uuid.uuid4())
|
|
260
259
|
|
|
261
260
|
def __post_init__(self):
|
|
262
|
-
timestamp_now = datetime.now(
|
|
261
|
+
timestamp_now = datetime.now(UTC)
|
|
263
262
|
self.creation_time = timestamp_now
|
|
264
263
|
self.last_modified_time = timestamp_now
|
|
265
264
|
self.last_authorized_time = timestamp_now
|
|
@@ -292,7 +291,7 @@ class ApiDestination:
|
|
|
292
291
|
id: str = str(short_uid())
|
|
293
292
|
|
|
294
293
|
def __post_init__(self):
|
|
295
|
-
timestamp_now = datetime.now(
|
|
294
|
+
timestamp_now = datetime.now(UTC)
|
|
296
295
|
self.creation_time = timestamp_now
|
|
297
296
|
self.last_modified_time = timestamp_now
|
|
298
297
|
self.last_authorized_time = timestamp_now
|