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
|
@@ -6,9 +6,10 @@ import queue
|
|
|
6
6
|
import re
|
|
7
7
|
import socket
|
|
8
8
|
import threading
|
|
9
|
-
from
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from functools import cache
|
|
10
11
|
from time import sleep
|
|
11
|
-
from typing import
|
|
12
|
+
from typing import cast
|
|
12
13
|
from urllib.parse import quote
|
|
13
14
|
|
|
14
15
|
import docker
|
|
@@ -56,7 +57,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
56
57
|
is doing some of the heavy lifting for us to support both target platforms.
|
|
57
58
|
"""
|
|
58
59
|
|
|
59
|
-
docker_client:
|
|
60
|
+
docker_client: DockerClient | None
|
|
60
61
|
|
|
61
62
|
def __init__(self):
|
|
62
63
|
try:
|
|
@@ -264,21 +265,23 @@ class SdkDockerClient(ContainerClient):
|
|
|
264
265
|
except APIError as e:
|
|
265
266
|
raise ContainerException() from e
|
|
266
267
|
|
|
267
|
-
def remove_container(
|
|
268
|
-
|
|
269
|
-
|
|
268
|
+
def remove_container(
|
|
269
|
+
self, container_name: str, force=True, check_existence=False, volumes=False
|
|
270
|
+
) -> None:
|
|
271
|
+
LOG.debug("Removing container: %s, with volumes: %s", container_name, volumes)
|
|
272
|
+
if check_existence and container_name not in self.get_all_container_names():
|
|
270
273
|
LOG.debug("Aborting removing due to check_existence check")
|
|
271
274
|
return
|
|
272
275
|
try:
|
|
273
276
|
container = self.client().containers.get(container_name)
|
|
274
|
-
container.remove(force=force)
|
|
277
|
+
container.remove(force=force, v=volumes)
|
|
275
278
|
except NotFound:
|
|
276
279
|
if not force:
|
|
277
280
|
raise NoSuchContainer(container_name)
|
|
278
281
|
except APIError as e:
|
|
279
282
|
raise ContainerException() from e
|
|
280
283
|
|
|
281
|
-
def list_containers(self, filter:
|
|
284
|
+
def list_containers(self, filter: list[str] | str | None = None, all=True) -> list[dict]:
|
|
282
285
|
if filter:
|
|
283
286
|
filter = [filter] if isinstance(filter, str) else filter
|
|
284
287
|
filter = dict([f.split("=", 1) for f in filter])
|
|
@@ -337,14 +340,14 @@ class SdkDockerClient(ContainerClient):
|
|
|
337
340
|
def pull_image(
|
|
338
341
|
self,
|
|
339
342
|
docker_image: str,
|
|
340
|
-
platform:
|
|
341
|
-
log_handler:
|
|
343
|
+
platform: DockerPlatform | None = None,
|
|
344
|
+
log_handler: Callable[[str], None] | None = None,
|
|
342
345
|
) -> None:
|
|
343
346
|
LOG.debug("Pulling Docker image: %s", docker_image)
|
|
344
347
|
# some path in the docker image string indicates a custom repository
|
|
345
348
|
|
|
346
349
|
docker_image = self.registry_resolver_strategy.resolve(docker_image)
|
|
347
|
-
kwargs:
|
|
350
|
+
kwargs: dict[str, str | bool] = {"platform": platform}
|
|
348
351
|
try:
|
|
349
352
|
if log_handler:
|
|
350
353
|
# Use a lower-level API, as the 'stream' argument is not available in the higher-level `pull`-API
|
|
@@ -389,7 +392,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
389
392
|
dockerfile_path: str,
|
|
390
393
|
image_name: str,
|
|
391
394
|
context_path: str = None,
|
|
392
|
-
platform:
|
|
395
|
+
platform: DockerPlatform | None = None,
|
|
393
396
|
):
|
|
394
397
|
try:
|
|
395
398
|
dockerfile_path = Util.resolve_dockerfile_path(dockerfile_path)
|
|
@@ -466,7 +469,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
466
469
|
except APIError as e:
|
|
467
470
|
raise ContainerException() from e
|
|
468
471
|
|
|
469
|
-
def inspect_container(self, container_name_or_id: str) ->
|
|
472
|
+
def inspect_container(self, container_name_or_id: str) -> dict[str, dict | str]:
|
|
470
473
|
try:
|
|
471
474
|
return self.client().containers.get(container_name_or_id).attrs
|
|
472
475
|
except NotFound:
|
|
@@ -479,7 +482,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
479
482
|
image_name: str,
|
|
480
483
|
pull: bool = True,
|
|
481
484
|
strip_wellknown_repo_prefixes: bool = True,
|
|
482
|
-
) ->
|
|
485
|
+
) -> dict[str, dict | list | str]:
|
|
483
486
|
image_name = self.registry_resolver_strategy.resolve(image_name)
|
|
484
487
|
try:
|
|
485
488
|
result = self.client().images.get(image_name).attrs
|
|
@@ -513,7 +516,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
513
516
|
except APIError as e:
|
|
514
517
|
raise ContainerException() from e
|
|
515
518
|
|
|
516
|
-
def inspect_network(self, network_name: str) ->
|
|
519
|
+
def inspect_network(self, network_name: str) -> dict[str, dict | str]:
|
|
517
520
|
try:
|
|
518
521
|
return self.client().networks.get(network_name).attrs
|
|
519
522
|
except NotFound:
|
|
@@ -525,8 +528,8 @@ class SdkDockerClient(ContainerClient):
|
|
|
525
528
|
self,
|
|
526
529
|
network_name: str,
|
|
527
530
|
container_name_or_id: str,
|
|
528
|
-
aliases:
|
|
529
|
-
link_local_ips:
|
|
531
|
+
aliases: list | None = None,
|
|
532
|
+
link_local_ips: list[str] = None,
|
|
530
533
|
) -> None:
|
|
531
534
|
LOG.debug(
|
|
532
535
|
"Connecting container '%s' to network '%s' with aliases '%s'",
|
|
@@ -574,7 +577,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
574
577
|
LOG.info("Container has more than one assigned network. Picking the first one...")
|
|
575
578
|
return networks[network_names[0]]["IPAddress"]
|
|
576
579
|
|
|
577
|
-
@
|
|
580
|
+
@cache
|
|
578
581
|
def has_docker(self) -> bool:
|
|
579
582
|
try:
|
|
580
583
|
if not self.docker_client:
|
|
@@ -619,8 +622,8 @@ class SdkDockerClient(ContainerClient):
|
|
|
619
622
|
stdin=None,
|
|
620
623
|
interactive: bool = False,
|
|
621
624
|
attach: bool = False,
|
|
622
|
-
flags:
|
|
623
|
-
) ->
|
|
625
|
+
flags: str | None = None,
|
|
626
|
+
) -> tuple[bytes, bytes]:
|
|
624
627
|
LOG.debug("Starting container %s", container_name_or_id)
|
|
625
628
|
try:
|
|
626
629
|
container = self.client().containers.get(container_name_or_id)
|
|
@@ -668,7 +671,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
668
671
|
sock.sendall(to_bytes(stdin))
|
|
669
672
|
sock.shutdown(socket.SHUT_WR)
|
|
670
673
|
stdout, stderr = self._read_from_sock(sock, False)
|
|
671
|
-
except
|
|
674
|
+
except TimeoutError:
|
|
672
675
|
LOG.debug(
|
|
673
676
|
"Socket timeout when talking to the I/O streams of Docker container '%s'",
|
|
674
677
|
container_name_or_id,
|
|
@@ -701,31 +704,31 @@ class SdkDockerClient(ContainerClient):
|
|
|
701
704
|
self,
|
|
702
705
|
image_name: str,
|
|
703
706
|
*,
|
|
704
|
-
name:
|
|
705
|
-
entrypoint:
|
|
707
|
+
name: str | None = None,
|
|
708
|
+
entrypoint: list[str] | str | None = None,
|
|
706
709
|
remove: bool = False,
|
|
707
710
|
interactive: bool = False,
|
|
708
711
|
tty: bool = False,
|
|
709
712
|
detach: bool = False,
|
|
710
|
-
command:
|
|
711
|
-
volumes:
|
|
712
|
-
ports:
|
|
713
|
-
exposed_ports:
|
|
714
|
-
env_vars:
|
|
715
|
-
user:
|
|
716
|
-
cap_add:
|
|
717
|
-
cap_drop:
|
|
718
|
-
security_opt:
|
|
719
|
-
network:
|
|
720
|
-
dns:
|
|
721
|
-
additional_flags:
|
|
722
|
-
workdir:
|
|
723
|
-
privileged:
|
|
724
|
-
labels:
|
|
725
|
-
platform:
|
|
726
|
-
ulimits:
|
|
727
|
-
init:
|
|
728
|
-
log_config:
|
|
713
|
+
command: list[str] | str | None = None,
|
|
714
|
+
volumes: list[SimpleVolumeBind] | None = None,
|
|
715
|
+
ports: PortMappings | None = None,
|
|
716
|
+
exposed_ports: list[str] | None = None,
|
|
717
|
+
env_vars: dict[str, str] | None = None,
|
|
718
|
+
user: str | None = None,
|
|
719
|
+
cap_add: list[str] | None = None,
|
|
720
|
+
cap_drop: list[str] | None = None,
|
|
721
|
+
security_opt: list[str] | None = None,
|
|
722
|
+
network: str | None = None,
|
|
723
|
+
dns: str | list[str] | None = None,
|
|
724
|
+
additional_flags: str | None = None,
|
|
725
|
+
workdir: str | None = None,
|
|
726
|
+
privileged: bool | None = None,
|
|
727
|
+
labels: dict[str, str] | None = None,
|
|
728
|
+
platform: DockerPlatform | None = None,
|
|
729
|
+
ulimits: list[Ulimit] | None = None,
|
|
730
|
+
init: bool | None = None,
|
|
731
|
+
log_config: LogConfig | None = None,
|
|
729
732
|
) -> str:
|
|
730
733
|
LOG.debug("Creating container with attributes: %s", locals())
|
|
731
734
|
extra_hosts = None
|
|
@@ -832,32 +835,32 @@ class SdkDockerClient(ContainerClient):
|
|
|
832
835
|
image_name: str,
|
|
833
836
|
stdin=None,
|
|
834
837
|
*,
|
|
835
|
-
name:
|
|
836
|
-
entrypoint:
|
|
838
|
+
name: str | None = None,
|
|
839
|
+
entrypoint: str | None = None,
|
|
837
840
|
remove: bool = False,
|
|
838
841
|
interactive: bool = False,
|
|
839
842
|
tty: bool = False,
|
|
840
843
|
detach: bool = False,
|
|
841
|
-
command:
|
|
842
|
-
volumes:
|
|
843
|
-
ports:
|
|
844
|
-
exposed_ports:
|
|
845
|
-
env_vars:
|
|
846
|
-
user:
|
|
847
|
-
cap_add:
|
|
848
|
-
cap_drop:
|
|
849
|
-
security_opt:
|
|
850
|
-
network:
|
|
851
|
-
dns:
|
|
852
|
-
additional_flags:
|
|
853
|
-
workdir:
|
|
854
|
-
labels:
|
|
855
|
-
platform:
|
|
856
|
-
privileged:
|
|
857
|
-
ulimits:
|
|
858
|
-
init:
|
|
859
|
-
log_config:
|
|
860
|
-
) ->
|
|
844
|
+
command: list[str] | str | None = None,
|
|
845
|
+
volumes: list[SimpleVolumeBind] | None = None,
|
|
846
|
+
ports: PortMappings | None = None,
|
|
847
|
+
exposed_ports: list[str] | None = None,
|
|
848
|
+
env_vars: dict[str, str] | None = None,
|
|
849
|
+
user: str | None = None,
|
|
850
|
+
cap_add: list[str] | None = None,
|
|
851
|
+
cap_drop: list[str] | None = None,
|
|
852
|
+
security_opt: list[str] | None = None,
|
|
853
|
+
network: str | None = None,
|
|
854
|
+
dns: str | None = None,
|
|
855
|
+
additional_flags: str | None = None,
|
|
856
|
+
workdir: str | None = None,
|
|
857
|
+
labels: dict[str, str] | None = None,
|
|
858
|
+
platform: DockerPlatform | None = None,
|
|
859
|
+
privileged: bool | None = None,
|
|
860
|
+
ulimits: list[Ulimit] | None = None,
|
|
861
|
+
init: bool | None = None,
|
|
862
|
+
log_config: LogConfig | None = None,
|
|
863
|
+
) -> tuple[bytes, bytes]:
|
|
861
864
|
LOG.debug("Running container with image: %s", image_name)
|
|
862
865
|
container = None
|
|
863
866
|
try:
|
|
@@ -903,14 +906,14 @@ class SdkDockerClient(ContainerClient):
|
|
|
903
906
|
def exec_in_container(
|
|
904
907
|
self,
|
|
905
908
|
container_name_or_id: str,
|
|
906
|
-
command:
|
|
909
|
+
command: list[str] | str,
|
|
907
910
|
interactive=False,
|
|
908
911
|
detach=False,
|
|
909
|
-
env_vars:
|
|
910
|
-
stdin:
|
|
911
|
-
user:
|
|
912
|
-
workdir:
|
|
913
|
-
) ->
|
|
912
|
+
env_vars: dict[str, str | None] | None = None,
|
|
913
|
+
stdin: bytes | None = None,
|
|
914
|
+
user: str | None = None,
|
|
915
|
+
workdir: str | None = None,
|
|
916
|
+
) -> tuple[bytes, bytes]:
|
|
914
917
|
LOG.debug("Executing command in container %s: %s", container_name_or_id, command)
|
|
915
918
|
try:
|
|
916
919
|
container: Container = self.client().containers.get(container_name_or_id)
|
|
@@ -936,7 +939,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
936
939
|
sock.shutdown(socket.SHUT_WR)
|
|
937
940
|
stdout, stderr = self._read_from_sock(sock, tty)
|
|
938
941
|
return stdout, stderr
|
|
939
|
-
except
|
|
942
|
+
except TimeoutError:
|
|
940
943
|
pass
|
|
941
944
|
else:
|
|
942
945
|
if detach:
|
|
@@ -957,7 +960,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
957
960
|
except APIError as e:
|
|
958
961
|
raise ContainerException() from e
|
|
959
962
|
|
|
960
|
-
def login(self, username: str, password: str, registry:
|
|
963
|
+
def login(self, username: str, password: str, registry: str | None = None) -> None:
|
|
961
964
|
LOG.debug("Docker login for %s", username)
|
|
962
965
|
try:
|
|
963
966
|
self.client().login(username, password=password, registry=registry, reauth=True)
|
localstack/utils/crypto.py
CHANGED
|
@@ -3,7 +3,6 @@ import logging
|
|
|
3
3
|
import os
|
|
4
4
|
import re
|
|
5
5
|
import threading
|
|
6
|
-
from typing import Tuple
|
|
7
6
|
|
|
8
7
|
from cryptography.hazmat.backends import default_backend
|
|
9
8
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
@@ -44,8 +43,8 @@ def generate_ssl_cert(
|
|
|
44
43
|
return all(os.path.exists(f) for f in files)
|
|
45
44
|
|
|
46
45
|
def store_cert_key_files(base_filename):
|
|
47
|
-
key_file_name = "
|
|
48
|
-
cert_file_name = "
|
|
46
|
+
key_file_name = f"{base_filename}.key"
|
|
47
|
+
cert_file_name = f"{base_filename}.crt"
|
|
49
48
|
# TODO: Cleaner code to load the cert dynamically
|
|
50
49
|
# extract key and cert from target_file and store into separate files
|
|
51
50
|
content = load_file(target_file)
|
|
@@ -75,9 +74,9 @@ def generate_ssl_cert(
|
|
|
75
74
|
return target_file, cert_file_name, key_file_name
|
|
76
75
|
if random and target_file:
|
|
77
76
|
if "." in target_file:
|
|
78
|
-
target_file = target_file.replace(".", "
|
|
77
|
+
target_file = target_file.replace(".", f".{short_uid()}.", 1)
|
|
79
78
|
else:
|
|
80
|
-
target_file = "
|
|
79
|
+
target_file = f"{target_file}.{short_uid()}"
|
|
81
80
|
|
|
82
81
|
# create a key pair
|
|
83
82
|
k = crypto.PKey()
|
|
@@ -105,7 +104,7 @@ def generate_ssl_cert(
|
|
|
105
104
|
cert.set_pubkey(k)
|
|
106
105
|
alt_names = (
|
|
107
106
|
f"DNS:localhost,DNS:test.localhost.atlassian.io,DNS:localhost.localstack.cloud,DNS:{host_definition.host}IP:127.0.0.1"
|
|
108
|
-
).encode(
|
|
107
|
+
).encode()
|
|
109
108
|
cert.add_extensions(
|
|
110
109
|
[
|
|
111
110
|
crypto.X509Extension(b"subjectAltName", False, alt_names),
|
|
@@ -124,10 +123,10 @@ def generate_ssl_cert(
|
|
|
124
123
|
key_file.write(to_str(crypto.dump_privatekey(crypto.FILETYPE_PEM, k)))
|
|
125
124
|
cert_file_content = cert_file.getvalue().strip()
|
|
126
125
|
key_file_content = key_file.getvalue().strip()
|
|
127
|
-
file_content = "
|
|
126
|
+
file_content = f"{key_file_content}\n{cert_file_content}"
|
|
128
127
|
if target_file:
|
|
129
|
-
key_file_name = "
|
|
130
|
-
cert_file_name = "
|
|
128
|
+
key_file_name = f"{target_file}.key"
|
|
129
|
+
cert_file_name = f"{target_file}.crt"
|
|
131
130
|
# check existence to avoid permission denied issues:
|
|
132
131
|
# https://github.com/localstack/localstack/issues/1607
|
|
133
132
|
if not all_exist(target_file, key_file_name, cert_file_name):
|
|
@@ -146,9 +145,9 @@ def generate_ssl_cert(
|
|
|
146
145
|
e,
|
|
147
146
|
)
|
|
148
147
|
# Fix for https://github.com/localstack/localstack/issues/1743
|
|
149
|
-
target_file = "
|
|
150
|
-
key_file_name = "
|
|
151
|
-
cert_file_name = "
|
|
148
|
+
target_file = f"{new_tmp_file()}.pem"
|
|
149
|
+
key_file_name = f"{target_file}.key"
|
|
150
|
+
cert_file_name = f"{target_file}.crt"
|
|
152
151
|
TMP_FILES.append(target_file)
|
|
153
152
|
TMP_FILES.append(key_file_name)
|
|
154
153
|
TMP_FILES.append(cert_file_name)
|
|
@@ -165,7 +164,7 @@ def unpad(s: bytes) -> bytes:
|
|
|
165
164
|
return s[0 : -s[-1]]
|
|
166
165
|
|
|
167
166
|
|
|
168
|
-
def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) ->
|
|
167
|
+
def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) -> tuple[bytes, bytes]:
|
|
169
168
|
iv = iv or b"0" * BLOCK_SIZE
|
|
170
169
|
cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
|
|
171
170
|
encryptor = cipher.encryptor()
|
localstack/utils/diagnose.py
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import inspect
|
|
4
4
|
import os
|
|
5
5
|
import socket
|
|
6
|
-
from typing import Dict, List, Optional, Union
|
|
7
6
|
|
|
8
7
|
from localstack import config
|
|
9
8
|
from localstack.constants import DEFAULT_VOLUME_DIR
|
|
@@ -41,7 +40,7 @@ ENDPOINT_RESOLVE_LIST = ["localhost.localstack.cloud", "api.localstack.cloud"]
|
|
|
41
40
|
INSPECT_DIRECTORIES = [DEFAULT_VOLUME_DIR, "/tmp"]
|
|
42
41
|
|
|
43
42
|
|
|
44
|
-
def get_localstack_logs() ->
|
|
43
|
+
def get_localstack_logs() -> dict:
|
|
45
44
|
try:
|
|
46
45
|
result = DOCKER_CLIENT.get_container_logs(get_main_container_name())
|
|
47
46
|
except Exception as e:
|
|
@@ -50,7 +49,7 @@ def get_localstack_logs() -> Dict:
|
|
|
50
49
|
return {"docker": result}
|
|
51
50
|
|
|
52
51
|
|
|
53
|
-
def get_localstack_config() ->
|
|
52
|
+
def get_localstack_config() -> dict:
|
|
54
53
|
result = {}
|
|
55
54
|
for k, v in inspect.getmembers(config):
|
|
56
55
|
if k in EXCLUDE_CONFIG_KEYS:
|
|
@@ -77,14 +76,14 @@ def get_localstack_config() -> Dict:
|
|
|
77
76
|
return result
|
|
78
77
|
|
|
79
78
|
|
|
80
|
-
def inspect_main_container() ->
|
|
79
|
+
def inspect_main_container() -> str | dict:
|
|
81
80
|
try:
|
|
82
81
|
return DOCKER_CLIENT.inspect_container(get_main_container_name())
|
|
83
82
|
except Exception as e:
|
|
84
83
|
return f"inspect failed: {e}"
|
|
85
84
|
|
|
86
85
|
|
|
87
|
-
def get_localstack_version() ->
|
|
86
|
+
def get_localstack_version() -> dict[str, str | None]:
|
|
88
87
|
return {
|
|
89
88
|
"build-date": os.environ.get("LOCALSTACK_BUILD_DATE"),
|
|
90
89
|
"build-git-hash": os.environ.get("LOCALSTACK_BUILD_GIT_HASH"),
|
|
@@ -92,7 +91,7 @@ def get_localstack_version() -> Dict[str, Optional[str]]:
|
|
|
92
91
|
}
|
|
93
92
|
|
|
94
93
|
|
|
95
|
-
def resolve_endpoints() ->
|
|
94
|
+
def resolve_endpoints() -> dict[str, str]:
|
|
96
95
|
result = {}
|
|
97
96
|
for endpoint in ENDPOINT_RESOLVE_LIST:
|
|
98
97
|
try:
|
|
@@ -103,7 +102,7 @@ def resolve_endpoints() -> Dict[str, str]:
|
|
|
103
102
|
return result
|
|
104
103
|
|
|
105
104
|
|
|
106
|
-
def get_important_image_hashes() ->
|
|
105
|
+
def get_important_image_hashes() -> dict[str, str]:
|
|
107
106
|
result = {}
|
|
108
107
|
for image in DIAGNOSE_IMAGES:
|
|
109
108
|
try:
|
|
@@ -116,17 +115,17 @@ def get_important_image_hashes() -> Dict[str, str]:
|
|
|
116
115
|
return result
|
|
117
116
|
|
|
118
117
|
|
|
119
|
-
def get_service_stats() ->
|
|
118
|
+
def get_service_stats() -> dict[str, str]:
|
|
120
119
|
from localstack.services.plugins import SERVICE_PLUGINS
|
|
121
120
|
|
|
122
121
|
return {service: state.value for service, state in SERVICE_PLUGINS.get_states().items()}
|
|
123
122
|
|
|
124
123
|
|
|
125
|
-
def get_file_tree() ->
|
|
124
|
+
def get_file_tree() -> dict[str, list[str]]:
|
|
126
125
|
return {d: traverse_file_tree(d) for d in INSPECT_DIRECTORIES}
|
|
127
126
|
|
|
128
127
|
|
|
129
|
-
def traverse_file_tree(root: str) ->
|
|
128
|
+
def traverse_file_tree(root: str) -> list[str]:
|
|
130
129
|
try:
|
|
131
130
|
result = []
|
|
132
131
|
if config.in_docker():
|
|
@@ -134,10 +133,10 @@ def traverse_file_tree(root: str) -> List[str]:
|
|
|
134
133
|
result.append(dirpath)
|
|
135
134
|
return result
|
|
136
135
|
except Exception as e:
|
|
137
|
-
return ["traversing files failed
|
|
136
|
+
return [f"traversing files failed {e}"]
|
|
138
137
|
|
|
139
138
|
|
|
140
|
-
def get_docker_image_details() ->
|
|
139
|
+
def get_docker_image_details() -> dict[str, str]:
|
|
141
140
|
try:
|
|
142
141
|
image = DOCKER_CLIENT.inspect_container(get_main_container_name())["Config"]["Image"]
|
|
143
142
|
except ContainerException:
|
localstack/utils/docker_utils.py
CHANGED
|
@@ -2,13 +2,13 @@ import functools
|
|
|
2
2
|
import logging
|
|
3
3
|
import platform
|
|
4
4
|
import random
|
|
5
|
-
from typing import List, Optional, Union
|
|
6
5
|
|
|
7
6
|
from localstack import config
|
|
8
7
|
from localstack.constants import DEFAULT_VOLUME_DIR, DOCKER_IMAGE_NAME
|
|
9
8
|
from localstack.utils.collections import ensure_list
|
|
10
9
|
from localstack.utils.container_utils.container_client import (
|
|
11
10
|
ContainerClient,
|
|
11
|
+
DockerNotAvailable,
|
|
12
12
|
PortMappings,
|
|
13
13
|
VolumeInfo,
|
|
14
14
|
)
|
|
@@ -74,12 +74,12 @@ def get_current_container_id() -> str:
|
|
|
74
74
|
return container_id
|
|
75
75
|
|
|
76
76
|
|
|
77
|
-
def inspect_current_container_mounts() ->
|
|
77
|
+
def inspect_current_container_mounts() -> list[VolumeInfo]:
|
|
78
78
|
return DOCKER_CLIENT.inspect_container_volumes(get_current_container_id())
|
|
79
79
|
|
|
80
80
|
|
|
81
|
-
@functools.lru_cache
|
|
82
|
-
def get_default_volume_dir_mount() ->
|
|
81
|
+
@functools.lru_cache
|
|
82
|
+
def get_default_volume_dir_mount() -> VolumeInfo | None:
|
|
83
83
|
"""
|
|
84
84
|
Returns the volume information of LocalStack's DEFAULT_VOLUME_DIR (/var/lib/localstack), if mounted,
|
|
85
85
|
else it returns None. If we're not currently in docker a VauleError is raised. in a container, a ValueError is
|
|
@@ -132,8 +132,8 @@ def get_host_path_for_path_in_docker(path):
|
|
|
132
132
|
|
|
133
133
|
|
|
134
134
|
def container_ports_can_be_bound(
|
|
135
|
-
ports:
|
|
136
|
-
address:
|
|
135
|
+
ports: IntOrPort | list[IntOrPort],
|
|
136
|
+
address: str | None = None,
|
|
137
137
|
) -> bool:
|
|
138
138
|
"""Determine whether a given list of ports can be bound by Docker containers
|
|
139
139
|
|
|
@@ -153,10 +153,14 @@ def container_ports_can_be_bound(
|
|
|
153
153
|
ports=port_mappings,
|
|
154
154
|
remove=True,
|
|
155
155
|
)
|
|
156
|
+
except DockerNotAvailable as e:
|
|
157
|
+
LOG.warning("Cannot perform port check because Docker is not available.")
|
|
158
|
+
raise e
|
|
156
159
|
except Exception as e:
|
|
157
160
|
if "port is already allocated" not in str(e) and "address already in use" not in str(e):
|
|
158
161
|
LOG.warning(
|
|
159
|
-
"Unexpected error when attempting to determine container port status",
|
|
162
|
+
"Unexpected error when attempting to determine container port status",
|
|
163
|
+
exc_info=LOG.isEnabledFor(logging.DEBUG),
|
|
160
164
|
)
|
|
161
165
|
return False
|
|
162
166
|
# TODO(srw): sometimes the command output from the docker container is "None", particularly when this function is
|
localstack/utils/files.py
CHANGED
|
@@ -6,13 +6,12 @@ import shutil
|
|
|
6
6
|
import stat
|
|
7
7
|
import tempfile
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Dict
|
|
10
9
|
|
|
11
10
|
LOG = logging.getLogger(__name__)
|
|
12
11
|
TMP_FILES = []
|
|
13
12
|
|
|
14
13
|
|
|
15
|
-
def parse_config_file(file_or_str: str, single_section: bool = True) ->
|
|
14
|
+
def parse_config_file(file_or_str: str, single_section: bool = True) -> dict:
|
|
16
15
|
"""Parse the given properties config file/string and return a dict of section->key->value.
|
|
17
16
|
If the config contains a single section, and 'single_section' is True, returns"""
|
|
18
17
|
|
|
@@ -81,9 +80,26 @@ def save_file(file, content, append=False, permissions=None):
|
|
|
81
80
|
f.flush()
|
|
82
81
|
|
|
83
82
|
|
|
84
|
-
def load_file(
|
|
83
|
+
def load_file(
|
|
84
|
+
file_path: str | os.PathLike,
|
|
85
|
+
default: str | bytes | None = None,
|
|
86
|
+
mode: str | None = None,
|
|
87
|
+
strict: bool = False,
|
|
88
|
+
) -> str | bytes | None:
|
|
89
|
+
"""
|
|
90
|
+
Return file contents
|
|
91
|
+
|
|
92
|
+
:param file_path: path of the file
|
|
93
|
+
:param default: if strict=False then return this value if the file does not exist
|
|
94
|
+
:param mode: mode to open the file with (e.g. `r`, `rw`)
|
|
95
|
+
:param strict: raise an error if the file path is not a file
|
|
96
|
+
:return: the file contents
|
|
97
|
+
"""
|
|
85
98
|
if not os.path.isfile(file_path):
|
|
86
|
-
|
|
99
|
+
if strict:
|
|
100
|
+
raise FileNotFoundError(file_path)
|
|
101
|
+
else:
|
|
102
|
+
return default
|
|
87
103
|
if not mode:
|
|
88
104
|
mode = "r"
|
|
89
105
|
with open(file_path, mode) as f:
|
|
@@ -202,7 +218,7 @@ def rm_rf(path: str):
|
|
|
202
218
|
# Running the native command can be an order of magnitude faster in Alpine on Travis-CI
|
|
203
219
|
if is_debian():
|
|
204
220
|
try:
|
|
205
|
-
return run('rm -rf "
|
|
221
|
+
return run(f'rm -rf "{path}"')
|
|
206
222
|
except Exception:
|
|
207
223
|
pass
|
|
208
224
|
# Make sure all files are writeable and dirs executable to remove
|
|
@@ -248,11 +264,7 @@ def cp_r(src: str, dst: str, rm_dest_on_conflict=False, ignore_copystat_errors=F
|
|
|
248
264
|
except Exception as e:
|
|
249
265
|
|
|
250
266
|
def _info(_path):
|
|
251
|
-
return "
|
|
252
|
-
_path,
|
|
253
|
-
os.path.isfile(_path),
|
|
254
|
-
os.path.islink(_path),
|
|
255
|
-
)
|
|
267
|
+
return f"{_path} (file={os.path.isfile(_path)}, symlink={os.path.islink(_path)})"
|
|
256
268
|
|
|
257
269
|
LOG.debug("Error copying files from %s to %s: %s", _info(src), _info(dst), e)
|
|
258
270
|
raise
|
|
@@ -293,7 +305,7 @@ def cleanup_tmp_files():
|
|
|
293
305
|
del TMP_FILES[:]
|
|
294
306
|
|
|
295
307
|
|
|
296
|
-
def new_tmp_file(suffix: str = None, dir: str = None) -> str:
|
|
308
|
+
def new_tmp_file(suffix: str | None = None, dir: str | None = None) -> str:
|
|
297
309
|
"""Return a path to a new temporary file."""
|
|
298
310
|
tmp_file, tmp_path = tempfile.mkstemp(suffix=suffix, dir=dir)
|
|
299
311
|
os.close(tmp_file)
|
|
@@ -301,8 +313,15 @@ def new_tmp_file(suffix: str = None, dir: str = None) -> str:
|
|
|
301
313
|
return tmp_path
|
|
302
314
|
|
|
303
315
|
|
|
304
|
-
def new_tmp_dir(dir: str = None):
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
316
|
+
def new_tmp_dir(dir: str | None = None, mode: int = 0o777) -> str:
|
|
317
|
+
"""
|
|
318
|
+
Create a new temporary directory with the specified permissions. The directory is added to the tracked temporary
|
|
319
|
+
files.
|
|
320
|
+
:param dir: parent directory for the temporary directory to be created. Systems's default otherwise.
|
|
321
|
+
:param mode: file permission for the directory (default: 0o777)
|
|
322
|
+
:return: the absolute path of the created directory
|
|
323
|
+
"""
|
|
324
|
+
folder = tempfile.mkdtemp(dir=dir)
|
|
325
|
+
TMP_FILES.append(folder)
|
|
326
|
+
idempotent_chmod(folder, mode=mode)
|
|
308
327
|
return folder
|
localstack/utils/functions.py
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
import functools
|
|
4
4
|
import inspect
|
|
5
5
|
import logging
|
|
6
|
-
from
|
|
6
|
+
from collections.abc import Callable
|
|
7
|
+
from typing import Any
|
|
7
8
|
|
|
8
9
|
LOG = logging.getLogger(__name__)
|
|
9
10
|
|
|
@@ -19,8 +20,8 @@ def run_safe(_python_lambda, *args, _default=None, **kwargs):
|
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
def call_safe(
|
|
22
|
-
func: Callable, args:
|
|
23
|
-
) ->
|
|
23
|
+
func: Callable, args: tuple = None, kwargs: dict = None, exception_message: str = None
|
|
24
|
+
) -> Any | None:
|
|
24
25
|
"""
|
|
25
26
|
Call the given function with the given arguments, and if it fails, log the given exception_message.
|
|
26
27
|
If logging.DEBUG is set for the logger, then we also log the traceback.
|
|
@@ -32,7 +33,7 @@ def call_safe(
|
|
|
32
33
|
:return: whatever the func returns
|
|
33
34
|
"""
|
|
34
35
|
if exception_message is None:
|
|
35
|
-
exception_message = "error calling function
|
|
36
|
+
exception_message = f"error calling function {func.__name__}"
|
|
36
37
|
if args is None:
|
|
37
38
|
args = ()
|
|
38
39
|
if kwargs is None:
|