localstack-core 4.7.1.dev23__py3-none-any.whl → 4.7.1.dev24__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/core.py +2 -3
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/logs/__init__.py +5 -8
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +7 -9
- localstack/aws/connect.py +40 -39
- localstack/aws/forwarder.py +5 -4
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +1 -2
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/logging.py +1 -2
- localstack/aws/handlers/metric_handler.py +3 -4
- localstack/aws/handlers/service.py +5 -5
- localstack/aws/mocking.py +15 -24
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +16 -17
- localstack/aws/protocol/serializer.py +37 -40
- localstack/aws/protocol/service_router.py +13 -13
- localstack/aws/protocol/validate.py +5 -5
- localstack/aws/scaffold.py +8 -9
- 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 +7 -8
- localstack/aws/spec.py +29 -30
- localstack/cli/localstack.py +6 -6
- localstack/cli/lpm.py +2 -2
- localstack/config.py +14 -15
- localstack/deprecations.py +5 -5
- localstack/dev/run/__main__.py +4 -4
- localstack/dev/run/paths.py +5 -5
- localstack/dns/models.py +2 -1
- localstack/dns/server.py +3 -2
- 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 +3 -3
- localstack/packages/api.py +5 -5
- localstack/packages/core.py +3 -3
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +1 -2
- localstack/packages/terraform.py +1 -2
- localstack/runtime/init.py +6 -7
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +6 -6
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +20 -20
- localstack/services/apigateway/legacy/integration.py +7 -7
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +5 -5
- 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/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +1 -1
- 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 +6 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +9 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- 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 +5 -5
- 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 +2 -2
- 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/cfn_utils.py +1 -1
- localstack/services/cloudformation/deployment_utils.py +2 -2
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +12 -12
- localstack/services/cloudformation/engine/parameters.py +3 -3
- localstack/services/cloudformation/engine/template_deployer.py +9 -10
- localstack/services/cloudformation/engine/transformers.py +5 -4
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +9 -8
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +6 -6
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +9 -9
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +15 -14
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +5 -5
- localstack/services/cloudformation/provider_utils.py +2 -2
- localstack/services/cloudformation/resource_provider.py +10 -9
- 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/scaffolding/__main__.py +8 -7
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/stores.py +2 -3
- localstack/services/cloudformation/v2/entities.py +7 -7
- localstack/services/cloudformation/v2/provider.py +10 -10
- localstack/services/cloudwatch/alarm_scheduler.py +7 -7
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +12 -12
- localstack/services/cloudwatch/provider_v2.py +2 -4
- 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 +1 -2
- localstack/services/dynamodb/provider.py +7 -8
- 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/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +6 -7
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +4 -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 +13 -13
- 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 +17 -17
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +5 -5
- localstack/services/es/provider.py +19 -19
- 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/models.py +25 -25
- localstack/services/events/provider.py +12 -12
- 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 +5 -5
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +10 -10
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +11 -12
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +4 -4
- 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/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +2 -3
- localstack/services/kinesis/packages.py +3 -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 +14 -17
- localstack/services/kms/provider.py +2 -3
- 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 +3 -2
- localstack/services/lambda_/api_utils.py +12 -12
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +1 -1
- 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_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +5 -4
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +5 -5
- localstack/services/lambda_/invocation/internal_sqs_queue.py +1 -1
- localstack/services/lambda_/invocation/lambda_models.py +23 -23
- localstack/services/lambda_/invocation/lambda_service.py +4 -4
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/ldm.py +2 -3
- localstack/services/lambda_/packages.py +2 -3
- localstack/services/lambda_/provider.py +3 -3
- 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 +14 -14
- 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/logs/models.py +1 -3
- localstack/services/logs/provider.py +3 -3
- 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 +3 -3
- localstack/services/opensearch/cluster.py +13 -13
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +1 -2
- localstack/services/opensearch/provider.py +7 -8
- 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 +1 -3
- localstack/services/plugins.py +26 -25
- 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/cors.py +4 -4
- localstack/services/s3/models.py +72 -72
- localstack/services/s3/notifications.py +19 -19
- localstack/services/s3/presigned_url.py +6 -5
- localstack/services/s3/provider.py +13 -14
- 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 +11 -11
- localstack/services/s3/validation.py +1 -1
- localstack/services/s3/website_hosting.py +5 -5
- 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 +9 -11
- 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/provider.py +8 -8
- 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/models.py +25 -25
- localstack/services/sns/provider.py +1 -2
- localstack/services/sns/publisher.py +6 -7
- 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/sqs/models.py +21 -22
- localstack/services/sqs/provider.py +19 -18
- localstack/services/sqs/query_api.py +2 -3
- 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 +4 -4
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +3 -3
- localstack/services/ssm/provider.py +2 -3
- 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/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/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +2 -2
- 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 +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +2 -2
- localstack/services/stepfunctions/asl/component/program/program.py +8 -8
- 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/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +1 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +6 -6
- 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/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 +10 -11
- 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 +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +6 -6
- 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 +15 -15
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +5 -4
- 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 +2 -2
- 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 +2 -4
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +3 -5
- 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 +15 -17
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +9 -9
- 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 +11 -11
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +3 -3
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +5 -4
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +1 -2
- localstack/services/stepfunctions/asl/parse/preprocessor.py +30 -30
- localstack/services/stepfunctions/asl/parse/typed_props.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 +6 -6
- localstack/services/stepfunctions/backend/execution.py +25 -27
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +26 -26
- 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 +5 -5
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/provider.py +27 -37
- 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 +7 -7
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +2 -2
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +16 -15
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +3 -2
- localstack/testing/pytest/container.py +5 -4
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +11 -11
- localstack/testing/pytest/marking.py +6 -6
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/utils.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -3
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +2 -2
- 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/metrics/registry.py +1 -1
- localstack/utils/analytics/publisher.py +4 -4
- localstack/utils/analytics/service_request_aggregator.py +3 -3
- localstack/utils/aws/arns.py +2 -2
- localstack/utils/aws/aws_responses.py +14 -21
- localstack/utils/aws/aws_stack.py +7 -11
- localstack/utils/aws/dead_letter_queue.py +3 -4
- localstack/utils/aws/message_forwarding.py +9 -11
- localstack/utils/aws/request_context.py +4 -4
- localstack/utils/aws/templating.py +3 -3
- localstack/utils/batch_policy.py +2 -2
- localstack/utils/bootstrap.py +19 -20
- localstack/utils/collections.py +16 -23
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +3 -3
- localstack/utils/container_utils/container_client.py +72 -75
- localstack/utils/container_utils/docker_cmd_client.py +33 -33
- localstack/utils/container_utils/docker_sdk_client.py +35 -35
- localstack/utils/crypto.py +2 -3
- localstack/utils/diagnose.py +11 -11
- localstack/utils/docker_utils.py +4 -4
- localstack/utils/files.py +1 -2
- localstack/utils/functions.py +2 -2
- localstack/utils/http.py +6 -6
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +1 -1
- localstack/utils/net.py +10 -9
- localstack/utils/objects.py +10 -10
- localstack/utils/patch.py +5 -5
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +7 -7
- localstack/utils/scheduler.py +3 -2
- localstack/utils/strings.py +2 -2
- localstack/utils/tagging.py +3 -3
- localstack/utils/testutil.py +9 -9
- localstack/utils/threads.py +2 -2
- localstack/utils/xml.py +1 -1
- localstack/version.py +2 -2
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/METADATA +1 -1
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/RECORD +544 -544
- localstack_core-4.7.1.dev24.dist-info/plux.json +1 -0
- localstack_core-4.7.1.dev23.dist-info/plux.json +0 -1
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack +0 -0
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.7.1.dev23.data → localstack_core-4.7.1.dev24.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/WHEEL +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.7.1.dev23.dist-info → localstack_core-4.7.1.dev24.dist-info}/top_level.txt +0 -0
|
@@ -6,9 +6,9 @@ import queue
|
|
|
6
6
|
import re
|
|
7
7
|
import socket
|
|
8
8
|
import threading
|
|
9
|
-
from functools import
|
|
9
|
+
from functools import cache
|
|
10
10
|
from time import sleep
|
|
11
|
-
from typing import Callable,
|
|
11
|
+
from typing import Callable, Optional, Union, cast
|
|
12
12
|
from urllib.parse import quote
|
|
13
13
|
|
|
14
14
|
import docker
|
|
@@ -278,7 +278,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
278
278
|
except APIError as e:
|
|
279
279
|
raise ContainerException() from e
|
|
280
280
|
|
|
281
|
-
def list_containers(self, filter: Union[
|
|
281
|
+
def list_containers(self, filter: Union[list[str], str, None] = None, all=True) -> list[dict]:
|
|
282
282
|
if filter:
|
|
283
283
|
filter = [filter] if isinstance(filter, str) else filter
|
|
284
284
|
filter = dict([f.split("=", 1) for f in filter])
|
|
@@ -344,7 +344,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
344
344
|
# some path in the docker image string indicates a custom repository
|
|
345
345
|
|
|
346
346
|
docker_image = self.registry_resolver_strategy.resolve(docker_image)
|
|
347
|
-
kwargs:
|
|
347
|
+
kwargs: dict[str, Union[str, bool]] = {"platform": platform}
|
|
348
348
|
try:
|
|
349
349
|
if log_handler:
|
|
350
350
|
# Use a lower-level API, as the 'stream' argument is not available in the higher-level `pull`-API
|
|
@@ -466,7 +466,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
466
466
|
except APIError as e:
|
|
467
467
|
raise ContainerException() from e
|
|
468
468
|
|
|
469
|
-
def inspect_container(self, container_name_or_id: str) ->
|
|
469
|
+
def inspect_container(self, container_name_or_id: str) -> dict[str, Union[dict, str]]:
|
|
470
470
|
try:
|
|
471
471
|
return self.client().containers.get(container_name_or_id).attrs
|
|
472
472
|
except NotFound:
|
|
@@ -479,7 +479,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
479
479
|
image_name: str,
|
|
480
480
|
pull: bool = True,
|
|
481
481
|
strip_wellknown_repo_prefixes: bool = True,
|
|
482
|
-
) ->
|
|
482
|
+
) -> dict[str, Union[dict, list, str]]:
|
|
483
483
|
image_name = self.registry_resolver_strategy.resolve(image_name)
|
|
484
484
|
try:
|
|
485
485
|
result = self.client().images.get(image_name).attrs
|
|
@@ -513,7 +513,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
513
513
|
except APIError as e:
|
|
514
514
|
raise ContainerException() from e
|
|
515
515
|
|
|
516
|
-
def inspect_network(self, network_name: str) ->
|
|
516
|
+
def inspect_network(self, network_name: str) -> dict[str, Union[dict, str]]:
|
|
517
517
|
try:
|
|
518
518
|
return self.client().networks.get(network_name).attrs
|
|
519
519
|
except NotFound:
|
|
@@ -525,8 +525,8 @@ class SdkDockerClient(ContainerClient):
|
|
|
525
525
|
self,
|
|
526
526
|
network_name: str,
|
|
527
527
|
container_name_or_id: str,
|
|
528
|
-
aliases: Optional[
|
|
529
|
-
link_local_ips:
|
|
528
|
+
aliases: Optional[list] = None,
|
|
529
|
+
link_local_ips: list[str] = None,
|
|
530
530
|
) -> None:
|
|
531
531
|
LOG.debug(
|
|
532
532
|
"Connecting container '%s' to network '%s' with aliases '%s'",
|
|
@@ -574,7 +574,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
574
574
|
LOG.info("Container has more than one assigned network. Picking the first one...")
|
|
575
575
|
return networks[network_names[0]]["IPAddress"]
|
|
576
576
|
|
|
577
|
-
@
|
|
577
|
+
@cache
|
|
578
578
|
def has_docker(self) -> bool:
|
|
579
579
|
try:
|
|
580
580
|
if not self.docker_client:
|
|
@@ -620,7 +620,7 @@ class SdkDockerClient(ContainerClient):
|
|
|
620
620
|
interactive: bool = False,
|
|
621
621
|
attach: bool = False,
|
|
622
622
|
flags: Optional[str] = None,
|
|
623
|
-
) ->
|
|
623
|
+
) -> tuple[bytes, bytes]:
|
|
624
624
|
LOG.debug("Starting container %s", container_name_or_id)
|
|
625
625
|
try:
|
|
626
626
|
container = self.client().containers.get(container_name_or_id)
|
|
@@ -702,28 +702,28 @@ class SdkDockerClient(ContainerClient):
|
|
|
702
702
|
image_name: str,
|
|
703
703
|
*,
|
|
704
704
|
name: Optional[str] = None,
|
|
705
|
-
entrypoint: Optional[Union[
|
|
705
|
+
entrypoint: Optional[Union[list[str], str]] = None,
|
|
706
706
|
remove: bool = False,
|
|
707
707
|
interactive: bool = False,
|
|
708
708
|
tty: bool = False,
|
|
709
709
|
detach: bool = False,
|
|
710
|
-
command: Optional[Union[
|
|
711
|
-
volumes: Optional[
|
|
710
|
+
command: Optional[Union[list[str], str]] = None,
|
|
711
|
+
volumes: Optional[list[SimpleVolumeBind]] = None,
|
|
712
712
|
ports: Optional[PortMappings] = None,
|
|
713
|
-
exposed_ports: Optional[
|
|
714
|
-
env_vars: Optional[
|
|
713
|
+
exposed_ports: Optional[list[str]] = None,
|
|
714
|
+
env_vars: Optional[dict[str, str]] = None,
|
|
715
715
|
user: Optional[str] = None,
|
|
716
|
-
cap_add: Optional[
|
|
717
|
-
cap_drop: Optional[
|
|
718
|
-
security_opt: Optional[
|
|
716
|
+
cap_add: Optional[list[str]] = None,
|
|
717
|
+
cap_drop: Optional[list[str]] = None,
|
|
718
|
+
security_opt: Optional[list[str]] = None,
|
|
719
719
|
network: Optional[str] = None,
|
|
720
|
-
dns: Optional[Union[str,
|
|
720
|
+
dns: Optional[Union[str, list[str]]] = None,
|
|
721
721
|
additional_flags: Optional[str] = None,
|
|
722
722
|
workdir: Optional[str] = None,
|
|
723
723
|
privileged: Optional[bool] = None,
|
|
724
|
-
labels: Optional[
|
|
724
|
+
labels: Optional[dict[str, str]] = None,
|
|
725
725
|
platform: Optional[DockerPlatform] = None,
|
|
726
|
-
ulimits: Optional[
|
|
726
|
+
ulimits: Optional[list[Ulimit]] = None,
|
|
727
727
|
init: Optional[bool] = None,
|
|
728
728
|
log_config: Optional[LogConfig] = None,
|
|
729
729
|
) -> str:
|
|
@@ -838,26 +838,26 @@ class SdkDockerClient(ContainerClient):
|
|
|
838
838
|
interactive: bool = False,
|
|
839
839
|
tty: bool = False,
|
|
840
840
|
detach: bool = False,
|
|
841
|
-
command: Optional[Union[
|
|
842
|
-
volumes: Optional[
|
|
841
|
+
command: Optional[Union[list[str], str]] = None,
|
|
842
|
+
volumes: Optional[list[SimpleVolumeBind]] = None,
|
|
843
843
|
ports: Optional[PortMappings] = None,
|
|
844
|
-
exposed_ports: Optional[
|
|
845
|
-
env_vars: Optional[
|
|
844
|
+
exposed_ports: Optional[list[str]] = None,
|
|
845
|
+
env_vars: Optional[dict[str, str]] = None,
|
|
846
846
|
user: Optional[str] = None,
|
|
847
|
-
cap_add: Optional[
|
|
848
|
-
cap_drop: Optional[
|
|
849
|
-
security_opt: Optional[
|
|
847
|
+
cap_add: Optional[list[str]] = None,
|
|
848
|
+
cap_drop: Optional[list[str]] = None,
|
|
849
|
+
security_opt: Optional[list[str]] = None,
|
|
850
850
|
network: Optional[str] = None,
|
|
851
851
|
dns: Optional[str] = None,
|
|
852
852
|
additional_flags: Optional[str] = None,
|
|
853
853
|
workdir: Optional[str] = None,
|
|
854
|
-
labels: Optional[
|
|
854
|
+
labels: Optional[dict[str, str]] = None,
|
|
855
855
|
platform: Optional[DockerPlatform] = None,
|
|
856
856
|
privileged: Optional[bool] = None,
|
|
857
|
-
ulimits: Optional[
|
|
857
|
+
ulimits: Optional[list[Ulimit]] = None,
|
|
858
858
|
init: Optional[bool] = None,
|
|
859
859
|
log_config: Optional[LogConfig] = None,
|
|
860
|
-
) ->
|
|
860
|
+
) -> tuple[bytes, bytes]:
|
|
861
861
|
LOG.debug("Running container with image: %s", image_name)
|
|
862
862
|
container = None
|
|
863
863
|
try:
|
|
@@ -903,14 +903,14 @@ class SdkDockerClient(ContainerClient):
|
|
|
903
903
|
def exec_in_container(
|
|
904
904
|
self,
|
|
905
905
|
container_name_or_id: str,
|
|
906
|
-
command: Union[
|
|
906
|
+
command: Union[list[str], str],
|
|
907
907
|
interactive=False,
|
|
908
908
|
detach=False,
|
|
909
|
-
env_vars: Optional[
|
|
909
|
+
env_vars: Optional[dict[str, Optional[str]]] = None,
|
|
910
910
|
stdin: Optional[bytes] = None,
|
|
911
911
|
user: Optional[str] = None,
|
|
912
912
|
workdir: Optional[str] = None,
|
|
913
|
-
) ->
|
|
913
|
+
) -> tuple[bytes, bytes]:
|
|
914
914
|
LOG.debug("Executing command in container %s: %s", container_name_or_id, command)
|
|
915
915
|
try:
|
|
916
916
|
container: Container = self.client().containers.get(container_name_or_id)
|
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
|
|
@@ -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),
|
|
@@ -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,7 @@
|
|
|
3
3
|
import inspect
|
|
4
4
|
import os
|
|
5
5
|
import socket
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional, Union
|
|
7
7
|
|
|
8
8
|
from localstack import config
|
|
9
9
|
from localstack.constants import DEFAULT_VOLUME_DIR
|
|
@@ -41,7 +41,7 @@ ENDPOINT_RESOLVE_LIST = ["localhost.localstack.cloud", "api.localstack.cloud"]
|
|
|
41
41
|
INSPECT_DIRECTORIES = [DEFAULT_VOLUME_DIR, "/tmp"]
|
|
42
42
|
|
|
43
43
|
|
|
44
|
-
def get_localstack_logs() ->
|
|
44
|
+
def get_localstack_logs() -> dict:
|
|
45
45
|
try:
|
|
46
46
|
result = DOCKER_CLIENT.get_container_logs(get_main_container_name())
|
|
47
47
|
except Exception as e:
|
|
@@ -50,7 +50,7 @@ def get_localstack_logs() -> Dict:
|
|
|
50
50
|
return {"docker": result}
|
|
51
51
|
|
|
52
52
|
|
|
53
|
-
def get_localstack_config() ->
|
|
53
|
+
def get_localstack_config() -> dict:
|
|
54
54
|
result = {}
|
|
55
55
|
for k, v in inspect.getmembers(config):
|
|
56
56
|
if k in EXCLUDE_CONFIG_KEYS:
|
|
@@ -77,14 +77,14 @@ def get_localstack_config() -> Dict:
|
|
|
77
77
|
return result
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def inspect_main_container() -> Union[str,
|
|
80
|
+
def inspect_main_container() -> Union[str, dict]:
|
|
81
81
|
try:
|
|
82
82
|
return DOCKER_CLIENT.inspect_container(get_main_container_name())
|
|
83
83
|
except Exception as e:
|
|
84
84
|
return f"inspect failed: {e}"
|
|
85
85
|
|
|
86
86
|
|
|
87
|
-
def get_localstack_version() ->
|
|
87
|
+
def get_localstack_version() -> dict[str, Optional[str]]:
|
|
88
88
|
return {
|
|
89
89
|
"build-date": os.environ.get("LOCALSTACK_BUILD_DATE"),
|
|
90
90
|
"build-git-hash": os.environ.get("LOCALSTACK_BUILD_GIT_HASH"),
|
|
@@ -92,7 +92,7 @@ def get_localstack_version() -> Dict[str, Optional[str]]:
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
def resolve_endpoints() ->
|
|
95
|
+
def resolve_endpoints() -> dict[str, str]:
|
|
96
96
|
result = {}
|
|
97
97
|
for endpoint in ENDPOINT_RESOLVE_LIST:
|
|
98
98
|
try:
|
|
@@ -103,7 +103,7 @@ def resolve_endpoints() -> Dict[str, str]:
|
|
|
103
103
|
return result
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
def get_important_image_hashes() ->
|
|
106
|
+
def get_important_image_hashes() -> dict[str, str]:
|
|
107
107
|
result = {}
|
|
108
108
|
for image in DIAGNOSE_IMAGES:
|
|
109
109
|
try:
|
|
@@ -116,17 +116,17 @@ def get_important_image_hashes() -> Dict[str, str]:
|
|
|
116
116
|
return result
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
def get_service_stats() ->
|
|
119
|
+
def get_service_stats() -> dict[str, str]:
|
|
120
120
|
from localstack.services.plugins import SERVICE_PLUGINS
|
|
121
121
|
|
|
122
122
|
return {service: state.value for service, state in SERVICE_PLUGINS.get_states().items()}
|
|
123
123
|
|
|
124
124
|
|
|
125
|
-
def get_file_tree() ->
|
|
125
|
+
def get_file_tree() -> dict[str, list[str]]:
|
|
126
126
|
return {d: traverse_file_tree(d) for d in INSPECT_DIRECTORIES}
|
|
127
127
|
|
|
128
128
|
|
|
129
|
-
def traverse_file_tree(root: str) ->
|
|
129
|
+
def traverse_file_tree(root: str) -> list[str]:
|
|
130
130
|
try:
|
|
131
131
|
result = []
|
|
132
132
|
if config.in_docker():
|
|
@@ -137,7 +137,7 @@ def traverse_file_tree(root: str) -> List[str]:
|
|
|
137
137
|
return ["traversing files failed %s" % e]
|
|
138
138
|
|
|
139
139
|
|
|
140
|
-
def get_docker_image_details() ->
|
|
140
|
+
def get_docker_image_details() -> dict[str, str]:
|
|
141
141
|
try:
|
|
142
142
|
image = DOCKER_CLIENT.inspect_container(get_main_container_name())["Config"]["Image"]
|
|
143
143
|
except ContainerException:
|
localstack/utils/docker_utils.py
CHANGED
|
@@ -2,7 +2,7 @@ import functools
|
|
|
2
2
|
import logging
|
|
3
3
|
import platform
|
|
4
4
|
import random
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional, Union
|
|
6
6
|
|
|
7
7
|
from localstack import config
|
|
8
8
|
from localstack.constants import DEFAULT_VOLUME_DIR, DOCKER_IMAGE_NAME
|
|
@@ -74,11 +74,11 @@ 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
|
|
81
|
+
@functools.lru_cache
|
|
82
82
|
def get_default_volume_dir_mount() -> Optional[VolumeInfo]:
|
|
83
83
|
"""
|
|
84
84
|
Returns the volume information of LocalStack's DEFAULT_VOLUME_DIR (/var/lib/localstack), if mounted,
|
|
@@ -132,7 +132,7 @@ def get_host_path_for_path_in_docker(path):
|
|
|
132
132
|
|
|
133
133
|
|
|
134
134
|
def container_ports_can_be_bound(
|
|
135
|
-
ports: Union[IntOrPort,
|
|
135
|
+
ports: Union[IntOrPort, list[IntOrPort]],
|
|
136
136
|
address: Optional[str] = None,
|
|
137
137
|
) -> bool:
|
|
138
138
|
"""Determine whether a given list of ports can be bound by Docker containers
|
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
|
|
localstack/utils/functions.py
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import functools
|
|
4
4
|
import inspect
|
|
5
5
|
import logging
|
|
6
|
-
from typing import Any, Callable,
|
|
6
|
+
from typing import Any, Callable, Optional
|
|
7
7
|
|
|
8
8
|
LOG = logging.getLogger(__name__)
|
|
9
9
|
|
|
@@ -19,7 +19,7 @@ def run_safe(_python_lambda, *args, _default=None, **kwargs):
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def call_safe(
|
|
22
|
-
func: Callable, args:
|
|
22
|
+
func: Callable, args: tuple = None, kwargs: dict = None, exception_message: str = None
|
|
23
23
|
) -> Optional[Any]:
|
|
24
24
|
"""
|
|
25
25
|
Call the given function with the given arguments, and if it fails, log the given exception_message.
|
localstack/utils/http.py
CHANGED
|
@@ -2,7 +2,7 @@ import logging
|
|
|
2
2
|
import math
|
|
3
3
|
import os
|
|
4
4
|
import re
|
|
5
|
-
from typing import
|
|
5
|
+
from typing import Optional, Union
|
|
6
6
|
from urllib.parse import parse_qs, parse_qsl, urlencode, urlparse, urlunparse
|
|
7
7
|
|
|
8
8
|
import requests
|
|
@@ -54,7 +54,7 @@ def create_chunked_data(data, chunk_size: int = 80):
|
|
|
54
54
|
return ret
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
def canonicalize_headers(headers: Union[
|
|
57
|
+
def canonicalize_headers(headers: Union[dict, CaseInsensitiveDict]) -> dict:
|
|
58
58
|
if not headers:
|
|
59
59
|
return headers
|
|
60
60
|
|
|
@@ -76,7 +76,7 @@ def add_path_parameters_to_url(uri: str, path_params: list):
|
|
|
76
76
|
return urlunparse(url._replace(path=new_path))
|
|
77
77
|
|
|
78
78
|
|
|
79
|
-
def add_query_params_to_url(uri: str, query_params:
|
|
79
|
+
def add_query_params_to_url(uri: str, query_params: dict) -> str:
|
|
80
80
|
"""
|
|
81
81
|
Add query parameters to the uri.
|
|
82
82
|
:param uri: the base uri it can contains path arguments and query parameters
|
|
@@ -103,7 +103,7 @@ def add_query_params_to_url(uri: str, query_params: Dict) -> str:
|
|
|
103
103
|
|
|
104
104
|
|
|
105
105
|
def make_http_request(
|
|
106
|
-
url: str, data: Union[bytes, str] = None, headers:
|
|
106
|
+
url: str, data: Union[bytes, str] = None, headers: dict[str, str] = None, method: str = "GET"
|
|
107
107
|
) -> Response:
|
|
108
108
|
return requests.request(
|
|
109
109
|
url=url, method=method, headers=headers, data=data, auth=NetrcBypassAuth(), verify=False
|
|
@@ -141,7 +141,7 @@ class _RequestsSafe:
|
|
|
141
141
|
safe_requests = _RequestsSafe()
|
|
142
142
|
|
|
143
143
|
|
|
144
|
-
def parse_request_data(method: str, path: str, data=None, headers=None) ->
|
|
144
|
+
def parse_request_data(method: str, path: str, data=None, headers=None) -> dict:
|
|
145
145
|
"""Extract request data either from query string as well as request body (e.g., for POST)."""
|
|
146
146
|
result = {}
|
|
147
147
|
headers = headers or {}
|
|
@@ -165,7 +165,7 @@ def parse_request_data(method: str, path: str, data=None, headers=None) -> Dict:
|
|
|
165
165
|
return result
|
|
166
166
|
|
|
167
167
|
|
|
168
|
-
def get_proxies() ->
|
|
168
|
+
def get_proxies() -> dict[str, str]:
|
|
169
169
|
proxy_map = {}
|
|
170
170
|
if config.OUTBOUND_HTTP_PROXY:
|
|
171
171
|
proxy_map["http"] = config.OUTBOUND_HTTP_PROXY
|
localstack/utils/iputils.py
CHANGED
localstack/utils/json.py
CHANGED
localstack/utils/net.py
CHANGED
|
@@ -3,8 +3,9 @@ import random
|
|
|
3
3
|
import re
|
|
4
4
|
import socket
|
|
5
5
|
import threading
|
|
6
|
+
from collections.abc import MutableMapping
|
|
6
7
|
from contextlib import closing
|
|
7
|
-
from typing import Any,
|
|
8
|
+
from typing import Any, NamedTuple, Optional, Union
|
|
8
9
|
from urllib.parse import urlparse
|
|
9
10
|
|
|
10
11
|
import dns.resolver
|
|
@@ -56,7 +57,7 @@ def is_port_open(
|
|
|
56
57
|
port_or_url: Union[int, str],
|
|
57
58
|
http_path: str = None,
|
|
58
59
|
expect_success: bool = True,
|
|
59
|
-
protocols: Optional[Union[str,
|
|
60
|
+
protocols: Optional[Union[str, list[str]]] = None,
|
|
60
61
|
quiet: bool = True,
|
|
61
62
|
):
|
|
62
63
|
from localstack.utils.http import safe_requests
|
|
@@ -92,7 +93,7 @@ def is_port_open(
|
|
|
92
93
|
answers = resolver.query("google.com", "A")
|
|
93
94
|
assert len(answers) > 0
|
|
94
95
|
else:
|
|
95
|
-
sock.sendto(
|
|
96
|
+
sock.sendto(b"", (host, port))
|
|
96
97
|
sock.recvfrom(1024)
|
|
97
98
|
except Exception:
|
|
98
99
|
if not quiet:
|
|
@@ -190,7 +191,7 @@ def port_can_be_bound(port: IntOrPort, address: str = "") -> bool:
|
|
|
190
191
|
return False
|
|
191
192
|
|
|
192
193
|
|
|
193
|
-
def get_free_udp_port(blocklist:
|
|
194
|
+
def get_free_udp_port(blocklist: list[int] = None) -> int:
|
|
194
195
|
blocklist = blocklist or []
|
|
195
196
|
for i in range(10):
|
|
196
197
|
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
@@ -202,7 +203,7 @@ def get_free_udp_port(blocklist: List[int] = None) -> int:
|
|
|
202
203
|
raise Exception(f"Unable to determine free UDP port with blocklist {blocklist}")
|
|
203
204
|
|
|
204
205
|
|
|
205
|
-
def get_free_tcp_port(blocklist:
|
|
206
|
+
def get_free_tcp_port(blocklist: list[int] = None) -> int:
|
|
206
207
|
"""
|
|
207
208
|
Tries to bind a socket to port 0 and returns the port that was assigned by the system. If the port is
|
|
208
209
|
in the given ``blocklist``, or the port is marked as reserved in ``dynamic_port_range``, the procedure
|
|
@@ -272,7 +273,7 @@ def resolve_hostname(hostname: str) -> Optional[str]:
|
|
|
272
273
|
"""Resolve the given hostname and return its IP address, or None if it cannot be resolved."""
|
|
273
274
|
try:
|
|
274
275
|
return socket.gethostbyname(hostname)
|
|
275
|
-
except
|
|
276
|
+
except OSError:
|
|
276
277
|
return None
|
|
277
278
|
|
|
278
279
|
|
|
@@ -280,7 +281,7 @@ def is_ip_address(addr: str) -> bool:
|
|
|
280
281
|
try:
|
|
281
282
|
socket.inet_aton(addr)
|
|
282
283
|
return True
|
|
283
|
-
except
|
|
284
|
+
except OSError:
|
|
284
285
|
return False
|
|
285
286
|
|
|
286
287
|
|
|
@@ -468,9 +469,9 @@ def get_docker_host_from_container() -> str:
|
|
|
468
469
|
if config.is_in_docker:
|
|
469
470
|
try:
|
|
470
471
|
result = socket.gethostbyname("host.docker.internal")
|
|
471
|
-
except
|
|
472
|
+
except OSError:
|
|
472
473
|
result = socket.gethostbyname("host.containers.internal")
|
|
473
|
-
except
|
|
474
|
+
except OSError:
|
|
474
475
|
# TODO if neither host resolves, we might be in linux. We could just use the default gateway then
|
|
475
476
|
pass
|
|
476
477
|
return result
|
localstack/utils/objects.py
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import functools
|
|
2
2
|
import re
|
|
3
3
|
import threading
|
|
4
|
-
from typing import Any, Callable,
|
|
4
|
+
from typing import Any, Callable, Generic, Optional, TypeVar, Union
|
|
5
5
|
|
|
6
6
|
from .collections import ensure_list
|
|
7
7
|
from .strings import first_char_to_lower, first_char_to_upper
|
|
8
8
|
|
|
9
|
-
ComplexType = Union[
|
|
9
|
+
ComplexType = Union[list, dict, object]
|
|
10
10
|
|
|
11
11
|
_T = TypeVar("_T")
|
|
12
12
|
|
|
@@ -83,7 +83,7 @@ class SubtypesInstanceManager:
|
|
|
83
83
|
"""Simple instance manager base class that scans the subclasses of a base type for concrete named
|
|
84
84
|
implementations, and lazily creates and returns (singleton) instances on demand."""
|
|
85
85
|
|
|
86
|
-
_instances:
|
|
86
|
+
_instances: dict[str, "SubtypesInstanceManager"]
|
|
87
87
|
|
|
88
88
|
@classmethod
|
|
89
89
|
def get(cls, subtype_name: str, raise_if_missing: bool = True):
|
|
@@ -104,7 +104,7 @@ class SubtypesInstanceManager:
|
|
|
104
104
|
return instance
|
|
105
105
|
|
|
106
106
|
@classmethod
|
|
107
|
-
def instances(cls) ->
|
|
107
|
+
def instances(cls) -> dict[str, "SubtypesInstanceManager"]:
|
|
108
108
|
base_type = cls.get_base_type()
|
|
109
109
|
if not hasattr(base_type, "_instances"):
|
|
110
110
|
base_type._instances = {}
|
|
@@ -116,13 +116,13 @@ class SubtypesInstanceManager:
|
|
|
116
116
|
raise NotImplementedError
|
|
117
117
|
|
|
118
118
|
@classmethod
|
|
119
|
-
def get_base_type(cls) ->
|
|
119
|
+
def get_base_type(cls) -> type:
|
|
120
120
|
"""Get the base class for which instances are being managed - can be customized by subtypes."""
|
|
121
121
|
return cls
|
|
122
122
|
|
|
123
123
|
|
|
124
124
|
# this requires that all subclasses have been imported before(!)
|
|
125
|
-
def get_all_subclasses(clazz:
|
|
125
|
+
def get_all_subclasses(clazz: type) -> set[type]:
|
|
126
126
|
"""Recursively get all subclasses of the given class."""
|
|
127
127
|
result = set()
|
|
128
128
|
subs = clazz.__subclasses__()
|
|
@@ -132,7 +132,7 @@ def get_all_subclasses(clazz: Type) -> Set[Type]:
|
|
|
132
132
|
return result
|
|
133
133
|
|
|
134
134
|
|
|
135
|
-
def fully_qualified_class_name(klass:
|
|
135
|
+
def fully_qualified_class_name(klass: type) -> str:
|
|
136
136
|
return f"{klass.__module__}.{klass.__name__}"
|
|
137
137
|
|
|
138
138
|
|
|
@@ -156,7 +156,7 @@ def recurse_object(obj: ComplexType, func: Callable, path: str = "") -> ComplexT
|
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
def keys_to(
|
|
159
|
-
obj: ComplexType, op: Callable[[str], str], skip_children_of:
|
|
159
|
+
obj: ComplexType, op: Callable[[str], str], skip_children_of: list[str] = None
|
|
160
160
|
) -> ComplexType:
|
|
161
161
|
"""Recursively changes all dict keys to apply op. Skip children
|
|
162
162
|
of any elements whose names are contained in skip_children_of (e.g., ['Tags'])"""
|
|
@@ -175,11 +175,11 @@ def keys_to(
|
|
|
175
175
|
return result
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
def keys_to_lower(obj: ComplexType, skip_children_of:
|
|
178
|
+
def keys_to_lower(obj: ComplexType, skip_children_of: list[str] = None) -> ComplexType:
|
|
179
179
|
return keys_to(obj, first_char_to_lower, skip_children_of)
|
|
180
180
|
|
|
181
181
|
|
|
182
|
-
def keys_to_upper(obj: ComplexType, skip_children_of:
|
|
182
|
+
def keys_to_upper(obj: ComplexType, skip_children_of: list[str] = None) -> ComplexType:
|
|
183
183
|
return keys_to(obj, first_char_to_upper, skip_children_of)
|
|
184
184
|
|
|
185
185
|
|
localstack/utils/patch.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import functools
|
|
2
2
|
import inspect
|
|
3
3
|
import types
|
|
4
|
-
from typing import Any, Callable
|
|
4
|
+
from typing import Any, Callable
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def get_defining_object(method):
|
|
@@ -71,7 +71,7 @@ def create_patch_proxy(target: Callable, new: Callable):
|
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
class Patch:
|
|
74
|
-
applied_patches:
|
|
74
|
+
applied_patches: list["Patch"] = []
|
|
75
75
|
"""Bookkeeping for patches that are applied. You can use this to debug patches. For instance,
|
|
76
76
|
you could write something like::
|
|
77
77
|
|
|
@@ -120,7 +120,7 @@ class Patch:
|
|
|
120
120
|
return self
|
|
121
121
|
|
|
122
122
|
@staticmethod
|
|
123
|
-
def extend_class(target:
|
|
123
|
+
def extend_class(target: type, fn: Callable):
|
|
124
124
|
def _getattr(obj, name):
|
|
125
125
|
if name != fn.__name__:
|
|
126
126
|
raise AttributeError(f"`{target.__name__}` object has no attribute `{name}`")
|
|
@@ -164,9 +164,9 @@ class Patch:
|
|
|
164
164
|
|
|
165
165
|
|
|
166
166
|
class Patches:
|
|
167
|
-
patches:
|
|
167
|
+
patches: list[Patch]
|
|
168
168
|
|
|
169
|
-
def __init__(self, patches:
|
|
169
|
+
def __init__(self, patches: list[Patch] = None) -> None:
|
|
170
170
|
super().__init__()
|
|
171
171
|
|
|
172
172
|
self.patches = []
|
localstack/utils/platform.py
CHANGED
|
@@ -14,14 +14,14 @@ def is_windows() -> bool:
|
|
|
14
14
|
return "windows" == platform.system().lower()
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
@lru_cache
|
|
17
|
+
@lru_cache
|
|
18
18
|
def is_debian() -> bool:
|
|
19
19
|
from localstack.utils.files import load_file
|
|
20
20
|
|
|
21
21
|
return "Debian" in load_file("/etc/issue", "")
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
@lru_cache
|
|
24
|
+
@lru_cache
|
|
25
25
|
def is_redhat() -> bool:
|
|
26
26
|
from localstack.utils.files import load_file
|
|
27
27
|
|