localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- localstack/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/cloudformation/__init__.py +18 -4
- localstack/aws/api/cloudwatch/__init__.py +41 -1
- localstack/aws/api/config/__init__.py +4 -0
- localstack/aws/api/core.py +8 -5
- localstack/aws/api/dynamodb/__init__.py +30 -0
- localstack/aws/api/ec2/__init__.py +1545 -66
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/iam/__init__.py +7 -0
- localstack/aws/api/kinesis/__init__.py +19 -0
- localstack/aws/api/kms/__init__.py +6 -0
- localstack/aws/api/lambda_/__init__.py +36 -23
- localstack/aws/api/logs/__init__.py +20 -8
- localstack/aws/api/opensearch/__init__.py +16 -0
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/redshift/__init__.py +9 -3
- localstack/aws/api/route53/__init__.py +5 -0
- localstack/aws/api/s3/__init__.py +12 -0
- localstack/aws/api/s3control/__init__.py +56 -0
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/ssm/__init__.py +2 -0
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/api/transcribe/__init__.py +17 -0
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +14 -11
- localstack/aws/connect.py +42 -41
- localstack/aws/forwarder.py +57 -9
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +2 -3
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/internal_requests.py +6 -1
- localstack/aws/handlers/logging.py +13 -4
- localstack/aws/handlers/metric_handler.py +44 -5
- localstack/aws/handlers/service.py +48 -28
- localstack/aws/mocking.py +18 -27
- localstack/aws/patches.py +2 -2
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +475 -49
- localstack/aws/protocol/serializer.py +723 -106
- localstack/aws/protocol/service_router.py +133 -33
- localstack/aws/protocol/validate.py +6 -6
- localstack/aws/scaffold.py +9 -10
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +12 -11
- localstack/aws/spec-patches.json +58 -0
- localstack/aws/spec.py +66 -46
- localstack/cli/exceptions.py +1 -1
- localstack/cli/localstack.py +11 -11
- localstack/cli/lpm.py +4 -5
- localstack/cli/plugins.py +1 -1
- localstack/cli/profiles.py +1 -2
- localstack/config.py +44 -30
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +130 -7
- localstack/dev/run/__main__.py +5 -5
- localstack/dev/run/configurators.py +1 -4
- localstack/dev/run/paths.py +6 -6
- localstack/dns/models.py +2 -1
- localstack/dns/plugins.py +5 -1
- localstack/dns/server.py +16 -6
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +6 -6
- localstack/packages/api.py +13 -12
- localstack/packages/core.py +4 -4
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +38 -12
- localstack/packages/plugins.py +0 -8
- localstack/runtime/analytics.py +3 -0
- localstack/runtime/hooks.py +1 -1
- localstack/runtime/init.py +8 -9
- localstack/runtime/main.py +5 -5
- localstack/runtime/patches.py +2 -2
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +7 -10
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +27 -28
- localstack/services/apigateway/legacy/integration.py +11 -10
- localstack/services/apigateway/legacy/invocations.py +6 -5
- localstack/services/apigateway/legacy/provider.py +148 -68
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +6 -6
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
- localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
- localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/next_gen/provider.py +5 -0
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/api_utils.py +4 -8
- localstack/services/cloudformation/cfn_utils.py +2 -2
- localstack/services/cloudformation/deployment_utils.py +14 -12
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +27 -17
- localstack/services/cloudformation/engine/parameters.py +4 -4
- localstack/services/cloudformation/engine/template_deployer.py +15 -14
- localstack/services/cloudformation/engine/template_utils.py +34 -12
- localstack/services/cloudformation/engine/transformers.py +11 -8
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
- localstack/services/cloudformation/engine/v2/resolving.py +102 -0
- localstack/services/cloudformation/engine/yaml_parser.py +9 -2
- localstack/services/cloudformation/provider.py +11 -6
- localstack/services/cloudformation/provider_utils.py +34 -4
- localstack/services/cloudformation/resource_provider.py +31 -21
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/resources.py +24149 -0
- localstack/services/cloudformation/scaffolding/__main__.py +13 -12
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/service_models.py +2 -2
- localstack/services/cloudformation/stores.py +33 -22
- localstack/services/cloudformation/v2/entities.py +103 -88
- localstack/services/cloudformation/v2/provider.py +872 -131
- localstack/services/cloudformation/v2/types.py +38 -0
- localstack/services/cloudformation/v2/utils.py +4 -1
- localstack/services/cloudwatch/alarm_scheduler.py +11 -8
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +30 -25
- localstack/services/cloudwatch/provider_v2.py +27 -32
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +3 -3
- localstack/services/dynamodb/provider.py +159 -18
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/server.py +2 -2
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +157 -18
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +26 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +6 -6
- localstack/services/es/provider.py +21 -21
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/event_rule_engine.py +31 -13
- localstack/services/events/models.py +29 -30
- localstack/services/events/provider.py +29 -26
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +21 -13
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +15 -15
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +25 -16
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +14 -119
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/iam/resources/policy_simulator.py +133 -0
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +17 -5
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/provider.py +86 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +21 -18
- localstack/services/kms/provider.py +62 -26
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +4 -3
- localstack/services/lambda_/api_utils.py +19 -16
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
- localstack/services/lambda_/invocation/event_manager.py +1 -1
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
- localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
- localstack/services/lambda_/invocation/lambda_models.py +33 -30
- localstack/services/lambda_/invocation/lambda_service.py +12 -5
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/invocation/version_manager.py +31 -8
- localstack/services/lambda_/ldm.py +14 -0
- localstack/services/lambda_/packages.py +3 -4
- localstack/services/lambda_/provider.py +9 -26
- localstack/services/lambda_/provider_utils.py +1 -1
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/lambda_/urlrouter.py +14 -1
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +39 -22
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +5 -4
- localstack/services/opensearch/cluster.py +28 -20
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +27 -9
- localstack/services/opensearch/provider.py +15 -10
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +57 -10
- localstack/services/plugins.py +37 -32
- localstack/services/providers.py +10 -2
- localstack/services/redshift/provider.py +0 -21
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/constants.py +5 -2
- localstack/services/s3/cors.py +8 -8
- localstack/services/s3/models.py +73 -73
- localstack/services/s3/notifications.py +74 -58
- localstack/services/s3/presigned_url.py +41 -59
- localstack/services/s3/provider.py +86 -29
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +51 -31
- localstack/services/s3/validation.py +47 -33
- localstack/services/s3/website_hosting.py +9 -7
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +10 -12
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/models.py +8 -1
- localstack/services/ses/provider.py +128 -55
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/constants.py +7 -1
- localstack/services/sns/executor.py +9 -2
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +9 -7
- localstack/services/sns/publisher.py +37 -23
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sns/v2/models.py +167 -0
- localstack/services/sns/v2/provider.py +867 -0
- localstack/services/sns/v2/utils.py +130 -0
- localstack/services/sqs/constants.py +2 -2
- localstack/services/sqs/developer_api.py +205 -0
- localstack/services/sqs/models.py +71 -36
- localstack/services/sqs/provider.py +56 -332
- localstack/services/sqs/query_api.py +8 -5
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +123 -4
- localstack/services/ssm/provider.py +3 -4
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +9 -9
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
- localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +22 -24
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +12 -12
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
- localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +8 -8
- localstack/services/stepfunctions/backend/execution.py +29 -30
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +28 -28
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +9 -9
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/packages.py +14 -5
- localstack/services/stepfunctions/provider.py +34 -44
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +8 -8
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +8 -3
- localstack/state/codecs.py +61 -0
- localstack/state/core.py +11 -5
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +36 -23
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/cloudformation_utils.py +1 -1
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +68 -18
- localstack/testing/pytest/container.py +5 -5
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +188 -49
- localstack/testing/pytest/in_memory_localstack.py +1 -3
- localstack/testing/pytest/marking.py +42 -15
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +11 -10
- localstack/testing/pytest/util.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -4
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +8 -3
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metadata.py +6 -4
- localstack/utils/analytics/metrics/counter.py +11 -18
- localstack/utils/analytics/metrics/registry.py +2 -2
- localstack/utils/analytics/publisher.py +4 -5
- localstack/utils/analytics/service_providers.py +19 -0
- localstack/utils/analytics/service_request_aggregator.py +4 -4
- localstack/utils/archives.py +12 -12
- localstack/utils/asyncio.py +2 -2
- localstack/utils/aws/arns.py +26 -31
- localstack/utils/aws/aws_responses.py +21 -28
- localstack/utils/aws/aws_stack.py +7 -12
- localstack/utils/aws/dead_letter_queue.py +4 -9
- localstack/utils/aws/message_forwarding.py +8 -11
- localstack/utils/aws/request_context.py +5 -6
- localstack/utils/aws/resources.py +1 -1
- localstack/utils/aws/templating.py +4 -4
- localstack/utils/batch_policy.py +4 -4
- localstack/utils/bootstrap.py +37 -30
- localstack/utils/catalog/catalog.py +139 -0
- localstack/utils/catalog/catalog_loader.py +119 -0
- localstack/utils/catalog/common.py +58 -0
- localstack/utils/catalog/plugins.py +28 -0
- localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
- localstack/utils/collections.py +33 -27
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +5 -6
- localstack/utils/container_utils/container_client.py +156 -160
- localstack/utils/container_utils/docker_cmd_client.py +97 -81
- localstack/utils/container_utils/docker_sdk_client.py +75 -72
- localstack/utils/crypto.py +12 -13
- localstack/utils/diagnose.py +11 -12
- localstack/utils/docker_utils.py +11 -7
- localstack/utils/files.py +34 -15
- localstack/utils/functions.py +5 -4
- localstack/utils/http.py +14 -14
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +21 -7
- localstack/utils/kinesis/kinesis_connector.py +2 -1
- localstack/utils/net.py +25 -17
- localstack/utils/no_exit_argument_parser.py +2 -2
- localstack/utils/numbers.py +9 -2
- localstack/utils/objects.py +15 -14
- localstack/utils/patch.py +14 -7
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +15 -14
- localstack/utils/scheduler.py +13 -12
- localstack/utils/server/tcp_proxy.py +2 -2
- localstack/utils/serving.py +3 -4
- localstack/utils/strings.py +15 -16
- localstack/utils/sync.py +126 -1
- localstack/utils/tagging.py +10 -8
- localstack/utils/testutil.py +17 -17
- localstack/utils/threads.py +3 -3
- localstack/utils/time.py +12 -4
- localstack/utils/urls.py +1 -3
- localstack/utils/xml.py +1 -1
- localstack/utils/xray/traceid.py +1 -1
- localstack/version.py +16 -3
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
- localstack/packages/terraform.py +0 -47
- localstack/services/cloudformation/deploy.html +0 -144
- localstack/services/cloudformation/deploy_ui.py +0 -47
- localstack/services/cloudformation/plugins.py +0 -12
- localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
- localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
- /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
localstack/utils/batch_policy.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import time
|
|
3
|
-
from typing import Generic,
|
|
3
|
+
from typing import Generic, TypeVar, overload
|
|
4
4
|
|
|
5
5
|
from pydantic import Field
|
|
6
6
|
from pydantic.dataclasses import dataclass
|
|
@@ -47,8 +47,8 @@ class Batcher(Generic[T]):
|
|
|
47
47
|
assert batcher.flush() == ["item1", "item2", "item3", "item4"]
|
|
48
48
|
"""
|
|
49
49
|
|
|
50
|
-
max_count:
|
|
51
|
-
max_window:
|
|
50
|
+
max_count: int | None = Field(default=None, description="Maximum number of items", ge=0)
|
|
51
|
+
max_window: float | None = Field(
|
|
52
52
|
default=None, description="Maximum time window in seconds", ge=0
|
|
53
53
|
)
|
|
54
54
|
|
|
@@ -76,7 +76,7 @@ class Batcher(Generic[T]):
|
|
|
76
76
|
def add(self, item: T, *, deep_copy: bool = False) -> BatchPolicyTriggered: ...
|
|
77
77
|
|
|
78
78
|
@overload
|
|
79
|
-
def add(self, items:
|
|
79
|
+
def add(self, items: list[T], *, deep_copy: bool = False) -> BatchPolicyTriggered: ...
|
|
80
80
|
|
|
81
81
|
def add(self, item_or_items: T | list[T], *, deep_copy: bool = False) -> BatchPolicyTriggered:
|
|
82
82
|
"""
|
localstack/utils/bootstrap.py
CHANGED
|
@@ -9,8 +9,9 @@ import shlex
|
|
|
9
9
|
import signal
|
|
10
10
|
import threading
|
|
11
11
|
import time
|
|
12
|
+
from collections.abc import Callable, Iterable
|
|
12
13
|
from functools import wraps
|
|
13
|
-
from typing import Any
|
|
14
|
+
from typing import Any
|
|
14
15
|
|
|
15
16
|
from localstack import config, constants
|
|
16
17
|
from localstack.config import (
|
|
@@ -156,7 +157,7 @@ def log_duration(name=None, min_ms=500):
|
|
|
156
157
|
return wrapper
|
|
157
158
|
|
|
158
159
|
|
|
159
|
-
def get_docker_image_details(image_name: str = None) ->
|
|
160
|
+
def get_docker_image_details(image_name: str = None) -> dict[str, str]:
|
|
160
161
|
image_name = image_name or get_docker_image_to_start()
|
|
161
162
|
try:
|
|
162
163
|
result = DOCKER_CLIENT.inspect_image(image_name)
|
|
@@ -174,7 +175,7 @@ def get_docker_image_details(image_name: str = None) -> Dict[str, str]:
|
|
|
174
175
|
return result
|
|
175
176
|
|
|
176
177
|
|
|
177
|
-
def get_image_environment_variable(env_name: str) ->
|
|
178
|
+
def get_image_environment_variable(env_name: str) -> str | None:
|
|
178
179
|
image_name = get_docker_image_to_start()
|
|
179
180
|
image_info = DOCKER_CLIENT.inspect_image(image_name)
|
|
180
181
|
image_envs = image_info["Config"]["Env"]
|
|
@@ -249,7 +250,7 @@ def setup_logging():
|
|
|
249
250
|
# --------------
|
|
250
251
|
|
|
251
252
|
|
|
252
|
-
def resolve_apis(services: Iterable[str]) ->
|
|
253
|
+
def resolve_apis(services: Iterable[str]) -> set[str]:
|
|
253
254
|
"""
|
|
254
255
|
Resolves recursively for the given collection of services (e.g., ["serverless", "cognito"]) the list of actual
|
|
255
256
|
API services that need to be included (e.g., {'dynamodb', 'cloudformation', 'logs', 'kinesis', 'sts',
|
|
@@ -289,8 +290,8 @@ def resolve_apis(services: Iterable[str]) -> Set[str]:
|
|
|
289
290
|
return result
|
|
290
291
|
|
|
291
292
|
|
|
292
|
-
@functools.lru_cache
|
|
293
|
-
def get_enabled_apis() ->
|
|
293
|
+
@functools.lru_cache
|
|
294
|
+
def get_enabled_apis() -> set[str]:
|
|
294
295
|
"""
|
|
295
296
|
Returns the list of APIs that are enabled through the combination of the SERVICES variable and
|
|
296
297
|
STRICT_SERVICE_LOADING variable. If the SERVICES variable is empty, then it will return all available services.
|
|
@@ -324,8 +325,8 @@ def is_api_enabled(api: str) -> bool:
|
|
|
324
325
|
return api in get_enabled_apis()
|
|
325
326
|
|
|
326
327
|
|
|
327
|
-
@functools.lru_cache
|
|
328
|
-
def get_preloaded_services() ->
|
|
328
|
+
@functools.lru_cache
|
|
329
|
+
def get_preloaded_services() -> set[str]:
|
|
329
330
|
"""
|
|
330
331
|
Returns the list of APIs that are marked to be eager loaded through the combination of SERVICES variable and
|
|
331
332
|
EAGER_SERVICE_LOADING. If the SERVICES variable is empty, then it will return all available services.
|
|
@@ -426,15 +427,13 @@ def validate_localstack_config(name: str):
|
|
|
426
427
|
|
|
427
428
|
def port_exposed(port):
|
|
428
429
|
for exposed in docker_ports:
|
|
429
|
-
if re.match(
|
|
430
|
+
if re.match(rf"^([0-9]+-)?{port}(-[0-9]+)?$", exposed):
|
|
430
431
|
return True
|
|
431
432
|
|
|
432
433
|
if not port_exposed(edge_port):
|
|
433
434
|
warns.append(
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
'to the "ports" section of the docker-compose file.'
|
|
437
|
-
)
|
|
435
|
+
f"Edge port {edge_port} is not exposed. You may have to add the entry "
|
|
436
|
+
'to the "ports" section of the docker-compose file.'
|
|
438
437
|
)
|
|
439
438
|
|
|
440
439
|
# print warning/info messages
|
|
@@ -456,7 +455,7 @@ def get_docker_image_to_start():
|
|
|
456
455
|
|
|
457
456
|
def extract_port_flags(user_flags, port_mappings: PortMappings):
|
|
458
457
|
regex = r"-p\s+([0-9]+)(\-([0-9]+))?:([0-9]+)(\-([0-9]+))?"
|
|
459
|
-
matches = re.match("
|
|
458
|
+
matches = re.match(f".*{regex}", user_flags)
|
|
460
459
|
if matches:
|
|
461
460
|
for match in re.findall(regex, user_flags):
|
|
462
461
|
start = int(match[0])
|
|
@@ -545,7 +544,7 @@ class ContainerConfigurators:
|
|
|
545
544
|
|
|
546
545
|
@staticmethod
|
|
547
546
|
def gateway_listen(
|
|
548
|
-
port:
|
|
547
|
+
port: int | Iterable[int] | HostAndPort | Iterable[HostAndPort],
|
|
549
548
|
):
|
|
550
549
|
"""
|
|
551
550
|
Uses the given ports to configure GATEWAY_LISTEN. For instance, ``gateway_listen([4566, 443])`` would
|
|
@@ -638,7 +637,7 @@ class ContainerConfigurators:
|
|
|
638
637
|
return _cfg
|
|
639
638
|
|
|
640
639
|
@staticmethod
|
|
641
|
-
def custom_command(cmd:
|
|
640
|
+
def custom_command(cmd: list[str]):
|
|
642
641
|
"""
|
|
643
642
|
Overwrites the container command and unsets the default entrypoint.
|
|
644
643
|
|
|
@@ -653,7 +652,7 @@ class ContainerConfigurators:
|
|
|
653
652
|
return _cfg
|
|
654
653
|
|
|
655
654
|
@staticmethod
|
|
656
|
-
def env_vars(env_vars:
|
|
655
|
+
def env_vars(env_vars: dict[str, str]):
|
|
657
656
|
def _cfg(cfg: ContainerConfiguration):
|
|
658
657
|
cfg.env_vars.update(env_vars)
|
|
659
658
|
|
|
@@ -674,7 +673,7 @@ class ContainerConfigurators:
|
|
|
674
673
|
return _cfg
|
|
675
674
|
|
|
676
675
|
@staticmethod
|
|
677
|
-
def cli_params(params:
|
|
676
|
+
def cli_params(params: dict[str, Any]):
|
|
678
677
|
"""
|
|
679
678
|
Parse docker CLI parameters and add them to the config. The currently known CLI params are::
|
|
680
679
|
|
|
@@ -808,7 +807,7 @@ def get_gateway_port(container: Container) -> int:
|
|
|
808
807
|
:param container: the localstack container
|
|
809
808
|
:return: the gateway port reachable from the host
|
|
810
809
|
"""
|
|
811
|
-
candidates:
|
|
810
|
+
candidates: list[int]
|
|
812
811
|
|
|
813
812
|
gateway_listen = container.config.env_vars.get("GATEWAY_LISTEN")
|
|
814
813
|
if gateway_listen:
|
|
@@ -1001,7 +1000,7 @@ class RunningContainer:
|
|
|
1001
1000
|
return
|
|
1002
1001
|
raise
|
|
1003
1002
|
|
|
1004
|
-
def inspect(self) ->
|
|
1003
|
+
def inspect(self) -> dict[str, dict | str]:
|
|
1005
1004
|
return self.container_client.inspect_container(container_name_or_id=self.id)
|
|
1006
1005
|
|
|
1007
1006
|
def attach(self):
|
|
@@ -1029,11 +1028,11 @@ class ContainerLogPrinter:
|
|
|
1029
1028
|
self.callback = callback
|
|
1030
1029
|
|
|
1031
1030
|
self._closed = threading.Event()
|
|
1032
|
-
self._stream:
|
|
1031
|
+
self._stream: CancellableStream | None = None
|
|
1033
1032
|
|
|
1034
1033
|
def _can_start_streaming(self):
|
|
1035
1034
|
if self._closed.is_set():
|
|
1036
|
-
raise
|
|
1035
|
+
raise OSError("Already stopped")
|
|
1037
1036
|
if not self.container.running_container:
|
|
1038
1037
|
return False
|
|
1039
1038
|
return self.container.running_container.is_running()
|
|
@@ -1041,7 +1040,7 @@ class ContainerLogPrinter:
|
|
|
1041
1040
|
def run(self):
|
|
1042
1041
|
try:
|
|
1043
1042
|
poll_condition(self._can_start_streaming)
|
|
1044
|
-
except
|
|
1043
|
+
except OSError:
|
|
1045
1044
|
return
|
|
1046
1045
|
self._stream = self.container.running_container.stream_logs()
|
|
1047
1046
|
for line in self._stream:
|
|
@@ -1115,8 +1114,8 @@ class LocalstackContainerServer(Server):
|
|
|
1115
1114
|
|
|
1116
1115
|
def do_run(self):
|
|
1117
1116
|
if self.is_container_running():
|
|
1118
|
-
raise
|
|
1119
|
-
'LocalStack container named "
|
|
1117
|
+
raise ContainerRunning(
|
|
1118
|
+
f'LocalStack container named "{self.container.name}" is already running'
|
|
1120
1119
|
)
|
|
1121
1120
|
|
|
1122
1121
|
config.dirs.mkdirs()
|
|
@@ -1152,12 +1151,19 @@ class ContainerExists(Exception):
|
|
|
1152
1151
|
pass
|
|
1153
1152
|
|
|
1154
1153
|
|
|
1154
|
+
class ContainerRunning(Exception):
|
|
1155
|
+
pass
|
|
1156
|
+
|
|
1157
|
+
|
|
1155
1158
|
def prepare_docker_start():
|
|
1156
1159
|
# prepare environment for docker start
|
|
1157
1160
|
container_name = config.MAIN_CONTAINER_NAME
|
|
1158
1161
|
|
|
1159
1162
|
if DOCKER_CLIENT.is_container_running(container_name):
|
|
1160
|
-
raise
|
|
1163
|
+
raise ContainerRunning(f'LocalStack container named "{container_name}" is already running')
|
|
1164
|
+
|
|
1165
|
+
if container_name in DOCKER_CLIENT.get_all_container_names():
|
|
1166
|
+
raise ContainerExists(f'LocalStack container named "{container_name}" already exists')
|
|
1161
1167
|
|
|
1162
1168
|
config.dirs.mkdirs()
|
|
1163
1169
|
|
|
@@ -1227,7 +1233,7 @@ def prepare_host(console):
|
|
|
1227
1233
|
hooks.prepare_host.run()
|
|
1228
1234
|
|
|
1229
1235
|
|
|
1230
|
-
def start_infra_in_docker(console, cli_params:
|
|
1236
|
+
def start_infra_in_docker(console, cli_params: dict[str, Any] = None):
|
|
1231
1237
|
prepare_docker_start()
|
|
1232
1238
|
|
|
1233
1239
|
# create and prepare container
|
|
@@ -1302,14 +1308,15 @@ def ensure_container_image(console, container: Container):
|
|
|
1302
1308
|
console.log("download complete")
|
|
1303
1309
|
|
|
1304
1310
|
|
|
1305
|
-
def start_infra_in_docker_detached(console, cli_params:
|
|
1311
|
+
def start_infra_in_docker_detached(console, cli_params: dict[str, Any] = None):
|
|
1306
1312
|
"""
|
|
1307
1313
|
An alternative to start_infra_in_docker where the terminal is not blocked by the follow on the logfile.
|
|
1308
1314
|
"""
|
|
1309
1315
|
console.log("preparing environment")
|
|
1310
1316
|
try:
|
|
1311
1317
|
prepare_docker_start()
|
|
1312
|
-
except
|
|
1318
|
+
except ContainerRunning as e:
|
|
1319
|
+
# starting in detached mode is idempotent, return if container is already running
|
|
1313
1320
|
console.print(str(e))
|
|
1314
1321
|
return
|
|
1315
1322
|
|
|
@@ -1331,7 +1338,7 @@ def start_infra_in_docker_detached(console, cli_params: Dict[str, Any] = None):
|
|
|
1331
1338
|
console.log("detaching")
|
|
1332
1339
|
|
|
1333
1340
|
|
|
1334
|
-
def wait_container_is_ready(timeout:
|
|
1341
|
+
def wait_container_is_ready(timeout: float | None = None):
|
|
1335
1342
|
"""Blocks until the localstack main container is running and the ready marker has been printed."""
|
|
1336
1343
|
container_name = config.MAIN_CONTAINER_NAME
|
|
1337
1344
|
started = time.time()
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from abc import abstractmethod
|
|
3
|
+
|
|
4
|
+
from plux import Plugin
|
|
5
|
+
|
|
6
|
+
from localstack.services.cloudformation.resource_provider import (
|
|
7
|
+
plugin_manager as cfn_plugin_manager,
|
|
8
|
+
)
|
|
9
|
+
from localstack.utils.catalog.catalog_loader import RemoteCatalogLoader
|
|
10
|
+
from localstack.utils.catalog.common import (
|
|
11
|
+
AwsServiceOperationsSupportInLatest,
|
|
12
|
+
AwsServicesSupportInLatest,
|
|
13
|
+
AwsServiceSupportAtRuntime,
|
|
14
|
+
CloudFormationResourcesSupportAtRuntime,
|
|
15
|
+
CloudFormationResourcesSupportInLatest,
|
|
16
|
+
LocalstackEmulatorType,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
ServiceName = str
|
|
20
|
+
ServiceOperations = set[str]
|
|
21
|
+
ProviderName = str
|
|
22
|
+
CfnResourceName = str
|
|
23
|
+
CfnResourceMethodName = str
|
|
24
|
+
AwsServicesSupportStatus = (
|
|
25
|
+
AwsServiceSupportAtRuntime | AwsServicesSupportInLatest | AwsServiceOperationsSupportInLatest
|
|
26
|
+
)
|
|
27
|
+
CfnResourceSupportStatus = (
|
|
28
|
+
CloudFormationResourcesSupportInLatest | CloudFormationResourcesSupportAtRuntime
|
|
29
|
+
)
|
|
30
|
+
CfnResourceCatalog = dict[LocalstackEmulatorType, dict[CfnResourceName, set[CfnResourceMethodName]]]
|
|
31
|
+
|
|
32
|
+
LOG = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class CatalogPlugin(Plugin):
|
|
36
|
+
namespace = "localstack.utils.catalog"
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
def _get_cfn_resources_catalog(cloudformation_resources: dict) -> CfnResourceCatalog:
|
|
40
|
+
cfn_resources_catalog = {}
|
|
41
|
+
for emulator_type, resources in cloudformation_resources.items():
|
|
42
|
+
cfn_resources_catalog[emulator_type] = {}
|
|
43
|
+
for resource_name, resource in resources.items():
|
|
44
|
+
cfn_resources_catalog[emulator_type][resource_name] = set(resource.methods)
|
|
45
|
+
return cfn_resources_catalog
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
def _get_services_at_runtime() -> set[ServiceName]:
|
|
49
|
+
from localstack.services.plugins import SERVICE_PLUGINS
|
|
50
|
+
|
|
51
|
+
return set(SERVICE_PLUGINS.list_available())
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def _get_cfn_resources_available_at_runtime() -> set[CfnResourceName]:
|
|
55
|
+
return set(cfn_plugin_manager.list_names())
|
|
56
|
+
|
|
57
|
+
@abstractmethod
|
|
58
|
+
def get_aws_service_status(
|
|
59
|
+
self, service_name: str, operation_name: str | None = None
|
|
60
|
+
) -> AwsServicesSupportStatus | None:
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
@abstractmethod
|
|
64
|
+
def get_cloudformation_resource_status(
|
|
65
|
+
self, resource_name: str, service_name: str, is_pro_resource: bool = False
|
|
66
|
+
) -> CfnResourceSupportStatus | AwsServicesSupportInLatest | None:
|
|
67
|
+
pass
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class AwsCatalogRuntimePlugin(CatalogPlugin):
|
|
71
|
+
name = "aws-catalog-runtime-only"
|
|
72
|
+
|
|
73
|
+
def get_aws_service_status(
|
|
74
|
+
self, service_name: str, operation_name: str | None = None
|
|
75
|
+
) -> AwsServicesSupportStatus | None:
|
|
76
|
+
return None
|
|
77
|
+
|
|
78
|
+
def get_cloudformation_resource_status(
|
|
79
|
+
self, resource_name: str, service_name: str, is_pro_resource: bool = False
|
|
80
|
+
) -> CfnResourceSupportStatus | AwsServicesSupportInLatest | None:
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class AwsCatalogRemoteStatePlugin(CatalogPlugin):
|
|
85
|
+
name = "aws-catalog-remote-state"
|
|
86
|
+
current_emulator_type: LocalstackEmulatorType = LocalstackEmulatorType.COMMUNITY
|
|
87
|
+
services_in_latest: dict[ServiceName, dict[LocalstackEmulatorType, ServiceOperations]] = {}
|
|
88
|
+
services_at_runtime: set[ServiceName] = set()
|
|
89
|
+
cfn_resources_in_latest: CfnResourceCatalog = {}
|
|
90
|
+
cfn_resources_at_runtime: set[CfnResourceName] = set()
|
|
91
|
+
|
|
92
|
+
def __init__(self, remote_catalog_loader: RemoteCatalogLoader | None = None) -> None:
|
|
93
|
+
catalog_loader = remote_catalog_loader or RemoteCatalogLoader()
|
|
94
|
+
remote_catalog = catalog_loader.get_remote_catalog()
|
|
95
|
+
for service_name, emulators in remote_catalog.services.items():
|
|
96
|
+
for emulator_type, service_provider in emulators.items():
|
|
97
|
+
self.services_in_latest.setdefault(service_name, {})[emulator_type] = set(
|
|
98
|
+
service_provider.operations
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
self.cfn_resources_in_latest = self._get_cfn_resources_catalog(
|
|
102
|
+
remote_catalog.cloudformation_resources
|
|
103
|
+
)
|
|
104
|
+
self.cfn_resources_at_runtime = self._get_cfn_resources_available_at_runtime()
|
|
105
|
+
self.services_at_runtime = self._get_services_at_runtime()
|
|
106
|
+
|
|
107
|
+
def get_aws_service_status(
|
|
108
|
+
self, service_name: str, operation_name: str | None = None
|
|
109
|
+
) -> AwsServicesSupportStatus | None:
|
|
110
|
+
if not self.services_in_latest:
|
|
111
|
+
return None
|
|
112
|
+
if service_name not in self.services_in_latest:
|
|
113
|
+
return AwsServicesSupportInLatest.NOT_SUPPORTED
|
|
114
|
+
if self.current_emulator_type not in self.services_in_latest[service_name]:
|
|
115
|
+
return AwsServicesSupportInLatest.SUPPORTED_WITH_LICENSE_UPGRADE
|
|
116
|
+
if not operation_name:
|
|
117
|
+
return AwsServicesSupportInLatest.SUPPORTED
|
|
118
|
+
if operation_name in self.services_in_latest[service_name][self.current_emulator_type]:
|
|
119
|
+
return AwsServiceOperationsSupportInLatest.SUPPORTED
|
|
120
|
+
for emulator_type in self.services_in_latest[service_name]:
|
|
121
|
+
if emulator_type is self.current_emulator_type:
|
|
122
|
+
continue
|
|
123
|
+
if operation_name in self.services_in_latest[service_name][emulator_type]:
|
|
124
|
+
return AwsServiceOperationsSupportInLatest.SUPPORTED_WITH_LICENSE_UPGRADE
|
|
125
|
+
return AwsServiceOperationsSupportInLatest.NOT_SUPPORTED
|
|
126
|
+
|
|
127
|
+
def get_cloudformation_resource_status(
|
|
128
|
+
self, resource_name: str, service_name: str, is_pro_resource: bool = False
|
|
129
|
+
) -> CfnResourceSupportStatus | AwsServicesSupportInLatest | None:
|
|
130
|
+
if resource_name in self.cfn_resources_at_runtime:
|
|
131
|
+
return CloudFormationResourcesSupportAtRuntime.AVAILABLE
|
|
132
|
+
if service_name in self.services_at_runtime:
|
|
133
|
+
if resource_name in self.cfn_resources_in_latest[self.current_emulator_type]:
|
|
134
|
+
return CloudFormationResourcesSupportInLatest.SUPPORTED
|
|
135
|
+
else:
|
|
136
|
+
return CloudFormationResourcesSupportInLatest.NOT_SUPPORTED
|
|
137
|
+
if service_name in self.services_in_latest:
|
|
138
|
+
return self.get_aws_service_status(service_name, operation_name=None)
|
|
139
|
+
return AwsServicesSupportInLatest.NOT_SUPPORTED
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from json import JSONDecodeError
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import requests
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from localstack import config, constants
|
|
10
|
+
from localstack.utils.catalog.common import AwsRemoteCatalog
|
|
11
|
+
from localstack.utils.http import get_proxies
|
|
12
|
+
from localstack.utils.json import FileMappedDocument
|
|
13
|
+
|
|
14
|
+
LOG = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
AWS_CATALOG_FILE_NAME = "aws_catalog.json"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RemoteCatalogVersionResponse(BaseModel):
|
|
20
|
+
emulator_type: str
|
|
21
|
+
version: str
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AwsCatalogLoaderException(Exception):
|
|
25
|
+
def __init__(self, msg: str, *args):
|
|
26
|
+
super().__init__(msg, *args)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class RemoteCatalogLoader:
|
|
30
|
+
supported_schema_version = "v1"
|
|
31
|
+
api_endpoint_catalog = f"{constants.API_ENDPOINT}/license/catalog"
|
|
32
|
+
catalog_file_path = Path(config.dirs.cache) / AWS_CATALOG_FILE_NAME
|
|
33
|
+
|
|
34
|
+
def get_remote_catalog(self) -> AwsRemoteCatalog:
|
|
35
|
+
catalog_doc = FileMappedDocument(self.catalog_file_path)
|
|
36
|
+
cached_catalog = AwsRemoteCatalog(**catalog_doc) if catalog_doc else None
|
|
37
|
+
if cached_catalog:
|
|
38
|
+
cached_catalog_version = cached_catalog.localstack.version
|
|
39
|
+
if not self._should_update_cached_catalog(cached_catalog_version):
|
|
40
|
+
return cached_catalog
|
|
41
|
+
catalog = self._get_catalog_from_platform()
|
|
42
|
+
self._save_catalog_to_cache(catalog_doc, catalog)
|
|
43
|
+
return catalog
|
|
44
|
+
|
|
45
|
+
def _get_latest_localstack_version(self) -> str:
|
|
46
|
+
try:
|
|
47
|
+
proxies = get_proxies()
|
|
48
|
+
response = requests.get(
|
|
49
|
+
f"{self.api_endpoint_catalog}/aws/version",
|
|
50
|
+
verify=not config.is_env_true("SSL_NO_VERIFY"),
|
|
51
|
+
proxies=proxies,
|
|
52
|
+
)
|
|
53
|
+
if response.ok:
|
|
54
|
+
return RemoteCatalogVersionResponse.model_validate(response.content).version
|
|
55
|
+
self._raise_server_error(response)
|
|
56
|
+
except requests.exceptions.RequestException as e:
|
|
57
|
+
raise AwsCatalogLoaderException(
|
|
58
|
+
f"An unexpected network error occurred when trying to fetch latest localstack version: {e}"
|
|
59
|
+
) from e
|
|
60
|
+
|
|
61
|
+
def _should_update_cached_catalog(self, current_catalog_version: str) -> bool:
|
|
62
|
+
try:
|
|
63
|
+
latest_version = self._get_latest_localstack_version()
|
|
64
|
+
return latest_version != current_catalog_version
|
|
65
|
+
except Exception as e:
|
|
66
|
+
LOG.warning(
|
|
67
|
+
"Failed to retrieve the latest catalog version, cached catalog update skipped: %s",
|
|
68
|
+
e,
|
|
69
|
+
)
|
|
70
|
+
return False
|
|
71
|
+
|
|
72
|
+
def _save_catalog_to_cache(self, catalog_doc: FileMappedDocument, catalog: AwsRemoteCatalog):
|
|
73
|
+
catalog_doc.clear()
|
|
74
|
+
catalog_doc.update(catalog.model_dump())
|
|
75
|
+
catalog_doc.save()
|
|
76
|
+
|
|
77
|
+
def _get_catalog_from_platform(self) -> AwsRemoteCatalog:
|
|
78
|
+
try:
|
|
79
|
+
proxies = get_proxies()
|
|
80
|
+
response = requests.post(
|
|
81
|
+
self.api_endpoint_catalog,
|
|
82
|
+
verify=not config.is_env_true("SSL_NO_VERIFY"),
|
|
83
|
+
proxies=proxies,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
if response.ok:
|
|
87
|
+
return self._parse_catalog(response.content)
|
|
88
|
+
self._raise_server_error(response)
|
|
89
|
+
except requests.exceptions.RequestException as e:
|
|
90
|
+
raise AwsCatalogLoaderException(
|
|
91
|
+
f"An unexpected network error occurred when trying to fetch remote catalog: {e}"
|
|
92
|
+
) from e
|
|
93
|
+
|
|
94
|
+
def _parse_catalog(self, document: bytes) -> AwsRemoteCatalog | None:
|
|
95
|
+
try:
|
|
96
|
+
catalog_json = json.loads(document)
|
|
97
|
+
except JSONDecodeError as e:
|
|
98
|
+
raise AwsCatalogLoaderException(f"Could not de-serialize json catalog: {e}") from e
|
|
99
|
+
remote_catalog = AwsRemoteCatalog.model_validate(catalog_json)
|
|
100
|
+
if remote_catalog.schema_version != self.supported_schema_version:
|
|
101
|
+
raise AwsCatalogLoaderException(
|
|
102
|
+
f"Unsupported schema version: '{remote_catalog.schema_version}'. Only '{self.supported_schema_version}' is supported"
|
|
103
|
+
)
|
|
104
|
+
return remote_catalog
|
|
105
|
+
|
|
106
|
+
def _raise_server_error(self, response: requests.Response):
|
|
107
|
+
try:
|
|
108
|
+
server_error = response.json()
|
|
109
|
+
if error_message := server_error.get("message"):
|
|
110
|
+
raise AwsCatalogLoaderException(
|
|
111
|
+
f"Unexpected AWS catalog server error: {response.text}"
|
|
112
|
+
)
|
|
113
|
+
raise AwsCatalogLoaderException(
|
|
114
|
+
f"A server error occurred while calling remote catalog API (HTTP {response.status_code}): {error_message}"
|
|
115
|
+
)
|
|
116
|
+
except Exception:
|
|
117
|
+
raise AwsCatalogLoaderException(
|
|
118
|
+
f"An unexpected server error occurred while calling remote catalog API (HTTP {response.status_code}): {response.text}"
|
|
119
|
+
)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from enum import StrEnum
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CloudFormationResource(BaseModel):
|
|
7
|
+
methods: list[str]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AwsServiceCatalog(BaseModel):
|
|
11
|
+
provider: str
|
|
12
|
+
operations: list[str]
|
|
13
|
+
plans: list[str]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class LocalStackMetadata(BaseModel):
|
|
17
|
+
version: str
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AwsRemoteCatalog(BaseModel):
|
|
21
|
+
schema_version: str
|
|
22
|
+
localstack: LocalStackMetadata
|
|
23
|
+
services: dict[str, dict[str, AwsServiceCatalog]]
|
|
24
|
+
cloudformation_resources: dict[str, dict[str, CloudFormationResource]]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class LocalstackEmulatorType(StrEnum):
|
|
28
|
+
COMMUNITY = "community"
|
|
29
|
+
PRO = "pro"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class AwsServiceSupportAtRuntime(StrEnum):
|
|
33
|
+
AVAILABLE = "AVAILABLE"
|
|
34
|
+
AVAILABLE_WITH_LICENSE_UPGRADE = "AVAILABLE_WITH_LICENSE_UPGRADE"
|
|
35
|
+
NOT_IMPLEMENTED = "NOT_IMPLEMENTED"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class AwsServicesSupportInLatest(StrEnum):
|
|
39
|
+
SUPPORTED = "SUPPORTED"
|
|
40
|
+
SUPPORTED_WITH_LICENSE_UPGRADE = "SUPPORTED_WITH_LICENSE_UPGRADE"
|
|
41
|
+
NOT_SUPPORTED = "NOT_SUPPORTED"
|
|
42
|
+
NON_DEFAULT_PROVIDER = "NON_DEFAULT_PROVIDER"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class AwsServiceOperationsSupportInLatest(StrEnum):
|
|
46
|
+
SUPPORTED = "SUPPORTED"
|
|
47
|
+
SUPPORTED_WITH_LICENSE_UPGRADE = "SUPPORTED_WITH_LICENSE_UPGRADE"
|
|
48
|
+
NOT_SUPPORTED = "NOT_SUPPORTED"
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class CloudFormationResourcesSupportInLatest(StrEnum):
|
|
52
|
+
SUPPORTED = "SUPPORTED"
|
|
53
|
+
NOT_SUPPORTED = "NOT_SUPPORTED"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class CloudFormationResourcesSupportAtRuntime(StrEnum):
|
|
57
|
+
AVAILABLE = "AVAILABLE"
|
|
58
|
+
NOT_IMPLEMENTED = "NOT_IMPLEMENTED"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from plux import PluginManager
|
|
4
|
+
|
|
5
|
+
from localstack.utils.catalog.catalog import CatalogPlugin
|
|
6
|
+
from localstack.utils.objects import singleton_factory
|
|
7
|
+
|
|
8
|
+
LOG = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@singleton_factory
|
|
12
|
+
def get_aws_catalog() -> CatalogPlugin:
|
|
13
|
+
plugin_manager = PluginManager(CatalogPlugin.namespace)
|
|
14
|
+
try:
|
|
15
|
+
plugin_name = "aws-catalog-remote-state-with-license"
|
|
16
|
+
if not plugin_manager.exists(plugin_name):
|
|
17
|
+
plugin_name = "aws-catalog-remote-state"
|
|
18
|
+
return plugin_manager.load(plugin_name)
|
|
19
|
+
except Exception as e:
|
|
20
|
+
LOG.debug(
|
|
21
|
+
"Failed to load catalog plugin with the latest LocalStack services support data, falling back to catalog without remote state: %s",
|
|
22
|
+
e,
|
|
23
|
+
)
|
|
24
|
+
# Try to load runtime catalog from pro version first
|
|
25
|
+
fallback_plugin_name = "aws-catalog-runtime-only-with-license"
|
|
26
|
+
if not plugin_manager.exists(fallback_plugin_name):
|
|
27
|
+
fallback_plugin_name = "aws-catalog-runtime-only"
|
|
28
|
+
return plugin_manager.load(fallback_plugin_name)
|
|
@@ -2,7 +2,7 @@ import logging
|
|
|
2
2
|
import time
|
|
3
3
|
from datetime import datetime, timezone
|
|
4
4
|
from itertools import islice
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import TypedDict
|
|
6
6
|
|
|
7
7
|
from werkzeug import Response as WerkzeugResponse
|
|
8
8
|
|
|
@@ -20,8 +20,8 @@ LOG = logging.getLogger(__name__)
|
|
|
20
20
|
class SqsMetricBatchData(TypedDict, total=False):
|
|
21
21
|
MetricName: str
|
|
22
22
|
QueueName: str
|
|
23
|
-
Value:
|
|
24
|
-
Unit:
|
|
23
|
+
Value: int | None
|
|
24
|
+
Unit: str | None
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
def dimension_lambda(kwargs):
|
|
@@ -30,7 +30,7 @@ def dimension_lambda(kwargs):
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
def publish_lambda_metric(
|
|
33
|
-
metric, value, kwargs, account_id:
|
|
33
|
+
metric, value, kwargs, account_id: str | None = None, region_name: str | None = None
|
|
34
34
|
):
|
|
35
35
|
# publish metric only if CloudWatch service is available
|
|
36
36
|
if not is_api_enabled("cloudwatch"):
|
|
@@ -155,7 +155,7 @@ def store_cloudwatch_logs(
|
|
|
155
155
|
log_stream_name,
|
|
156
156
|
log_output,
|
|
157
157
|
start_time=None,
|
|
158
|
-
auto_create_group:
|
|
158
|
+
auto_create_group: bool | None = True,
|
|
159
159
|
):
|
|
160
160
|
if not is_api_enabled("logs"):
|
|
161
161
|
return
|