localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- localstack/aws/api/apigateway/__init__.py +87 -110
- localstack/aws/api/cloudformation/__init__.py +18 -4
- localstack/aws/api/cloudwatch/__init__.py +41 -1
- localstack/aws/api/config/__init__.py +4 -0
- localstack/aws/api/core.py +8 -5
- localstack/aws/api/dynamodb/__init__.py +30 -0
- localstack/aws/api/ec2/__init__.py +1545 -66
- localstack/aws/api/events/__init__.py +12 -16
- localstack/aws/api/iam/__init__.py +7 -0
- localstack/aws/api/kinesis/__init__.py +19 -0
- localstack/aws/api/kms/__init__.py +6 -0
- localstack/aws/api/lambda_/__init__.py +36 -23
- localstack/aws/api/logs/__init__.py +20 -8
- localstack/aws/api/opensearch/__init__.py +16 -0
- localstack/aws/api/pipes/__init__.py +24 -32
- localstack/aws/api/redshift/__init__.py +9 -3
- localstack/aws/api/route53/__init__.py +5 -0
- localstack/aws/api/s3/__init__.py +12 -0
- localstack/aws/api/s3control/__init__.py +56 -0
- localstack/aws/api/scheduler/__init__.py +14 -16
- localstack/aws/api/ssm/__init__.py +2 -0
- localstack/aws/api/stepfunctions/__init__.py +88 -114
- localstack/aws/api/support/__init__.py +8 -9
- localstack/aws/api/transcribe/__init__.py +17 -0
- localstack/aws/chain.py +2 -2
- localstack/aws/client.py +14 -11
- localstack/aws/connect.py +42 -41
- localstack/aws/forwarder.py +57 -9
- localstack/aws/gateway.py +1 -3
- localstack/aws/handlers/analytics.py +2 -3
- localstack/aws/handlers/cors.py +4 -5
- localstack/aws/handlers/internal_requests.py +6 -1
- localstack/aws/handlers/logging.py +13 -4
- localstack/aws/handlers/metric_handler.py +44 -5
- localstack/aws/handlers/service.py +48 -28
- localstack/aws/mocking.py +18 -27
- localstack/aws/patches.py +2 -2
- localstack/aws/protocol/op_router.py +11 -10
- localstack/aws/protocol/parser.py +475 -49
- localstack/aws/protocol/serializer.py +723 -106
- localstack/aws/protocol/service_router.py +133 -33
- localstack/aws/protocol/validate.py +6 -6
- localstack/aws/scaffold.py +9 -10
- localstack/aws/serving/edge.py +5 -6
- localstack/aws/serving/hypercorn.py +2 -2
- localstack/aws/serving/twisted.py +1 -2
- localstack/aws/serving/werkzeug.py +2 -2
- localstack/aws/skeleton.py +12 -11
- localstack/aws/spec-patches.json +58 -0
- localstack/aws/spec.py +66 -46
- localstack/cli/exceptions.py +1 -1
- localstack/cli/localstack.py +11 -11
- localstack/cli/lpm.py +4 -5
- localstack/cli/plugins.py +1 -1
- localstack/cli/profiles.py +1 -2
- localstack/config.py +44 -30
- localstack/constants.py +4 -29
- localstack/deprecations.py +5 -5
- localstack/dev/kubernetes/__main__.py +130 -7
- localstack/dev/run/__main__.py +5 -5
- localstack/dev/run/configurators.py +1 -4
- localstack/dev/run/paths.py +6 -6
- localstack/dns/models.py +2 -1
- localstack/dns/plugins.py +5 -1
- localstack/dns/server.py +16 -6
- localstack/http/dispatcher.py +1 -2
- localstack/http/response.py +2 -2
- localstack/http/router.py +1 -1
- localstack/http/trace.py +2 -1
- localstack/logging/format.py +6 -6
- localstack/packages/api.py +13 -12
- localstack/packages/core.py +4 -4
- localstack/packages/debugpy.py +1 -3
- localstack/packages/ffmpeg.py +1 -2
- localstack/packages/java.py +38 -12
- localstack/packages/plugins.py +0 -8
- localstack/runtime/analytics.py +3 -0
- localstack/runtime/hooks.py +1 -1
- localstack/runtime/init.py +8 -9
- localstack/runtime/main.py +5 -5
- localstack/runtime/patches.py +2 -2
- localstack/runtime/shutdown.py +2 -1
- localstack/services/apigateway/exporter.py +1 -2
- localstack/services/apigateway/helpers.py +7 -10
- localstack/services/apigateway/legacy/context.py +21 -21
- localstack/services/apigateway/legacy/helpers.py +27 -28
- localstack/services/apigateway/legacy/integration.py +11 -10
- localstack/services/apigateway/legacy/invocations.py +6 -5
- localstack/services/apigateway/legacy/provider.py +148 -68
- localstack/services/apigateway/legacy/router_asf.py +2 -2
- localstack/services/apigateway/legacy/templates.py +6 -6
- localstack/services/apigateway/models.py +16 -16
- localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
- localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
- localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
- localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
- localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
- localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
- localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
- localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
- localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
- localstack/services/apigateway/next_gen/provider.py +5 -0
- localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
- localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
- localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
- localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
- localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
- localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
- localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
- localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
- localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
- localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
- localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
- localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
- localstack/services/cloudformation/api_utils.py +4 -8
- localstack/services/cloudformation/cfn_utils.py +2 -2
- localstack/services/cloudformation/deployment_utils.py +14 -12
- localstack/services/cloudformation/engine/changes.py +3 -3
- localstack/services/cloudformation/engine/entities.py +27 -17
- localstack/services/cloudformation/engine/parameters.py +4 -4
- localstack/services/cloudformation/engine/template_deployer.py +15 -14
- localstack/services/cloudformation/engine/template_utils.py +34 -12
- localstack/services/cloudformation/engine/transformers.py +11 -8
- localstack/services/cloudformation/engine/types.py +5 -4
- localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
- localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
- localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
- localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
- localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
- localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
- localstack/services/cloudformation/engine/v2/resolving.py +102 -0
- localstack/services/cloudformation/engine/yaml_parser.py +9 -2
- localstack/services/cloudformation/provider.py +11 -6
- localstack/services/cloudformation/provider_utils.py +34 -4
- localstack/services/cloudformation/resource_provider.py +31 -21
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
- localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
- localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
- localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
- localstack/services/cloudformation/resources.py +24149 -0
- localstack/services/cloudformation/scaffolding/__main__.py +13 -12
- localstack/services/cloudformation/scaffolding/propgen.py +2 -2
- localstack/services/cloudformation/service_models.py +2 -2
- localstack/services/cloudformation/stores.py +33 -22
- localstack/services/cloudformation/v2/entities.py +103 -88
- localstack/services/cloudformation/v2/provider.py +872 -131
- localstack/services/cloudformation/v2/types.py +38 -0
- localstack/services/cloudformation/v2/utils.py +4 -1
- localstack/services/cloudwatch/alarm_scheduler.py +11 -8
- localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
- localstack/services/cloudwatch/models.py +5 -7
- localstack/services/cloudwatch/provider.py +30 -25
- localstack/services/cloudwatch/provider_v2.py +27 -32
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
- localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
- localstack/services/dynamodb/packages.py +3 -3
- localstack/services/dynamodb/provider.py +159 -18
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
- localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
- localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
- localstack/services/dynamodb/server.py +2 -2
- localstack/services/dynamodb/utils.py +13 -14
- localstack/services/dynamodb/v2/provider.py +157 -18
- localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
- localstack/services/dynamodbstreams/models.py +1 -3
- localstack/services/ec2/patches.py +26 -5
- localstack/services/ec2/provider.py +3 -3
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
- localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
- localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
- localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
- localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
- localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
- localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
- localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
- localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
- localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
- localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
- localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
- localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
- localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
- localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
- localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
- localstack/services/edge.py +6 -6
- localstack/services/es/provider.py +21 -21
- localstack/services/events/archive.py +2 -2
- localstack/services/events/connection.py +5 -5
- localstack/services/events/event_bus.py +9 -9
- localstack/services/events/event_rule_engine.py +31 -13
- localstack/services/events/models.py +29 -30
- localstack/services/events/provider.py +29 -26
- localstack/services/events/replay.py +3 -3
- localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
- localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_connection.py +27 -27
- localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
- localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
- localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
- localstack/services/events/resource_providers/aws_events_rule.py +82 -82
- localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
- localstack/services/events/rule.py +15 -15
- localstack/services/events/target.py +21 -13
- localstack/services/events/utils.py +7 -7
- localstack/services/events/v1/models.py +1 -3
- localstack/services/events/v1/provider.py +15 -15
- localstack/services/firehose/models.py +1 -3
- localstack/services/firehose/provider.py +25 -16
- localstack/services/iam/iam_patches.py +5 -6
- localstack/services/iam/provider.py +14 -119
- localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
- localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
- localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
- localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
- localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
- localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
- localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
- localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
- localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
- localstack/services/iam/resources/policy_simulator.py +133 -0
- localstack/services/kinesis/kinesis_mock_server.py +7 -8
- localstack/services/kinesis/models.py +17 -5
- localstack/services/kinesis/packages.py +3 -3
- localstack/services/kinesis/provider.py +86 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
- localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
- localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
- localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
- localstack/services/kms/models.py +21 -18
- localstack/services/kms/provider.py +62 -26
- localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
- localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
- localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
- localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
- localstack/services/kms/utils.py +4 -3
- localstack/services/lambda_/api_utils.py +19 -16
- localstack/services/lambda_/custom_endpoints.py +2 -2
- localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
- localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
- localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
- localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
- localstack/services/lambda_/hooks.py +6 -1
- localstack/services/lambda_/invocation/assignment.py +1 -2
- localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
- localstack/services/lambda_/invocation/event_manager.py +1 -1
- localstack/services/lambda_/invocation/execution_environment.py +4 -4
- localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
- localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
- localstack/services/lambda_/invocation/lambda_models.py +33 -30
- localstack/services/lambda_/invocation/lambda_service.py +12 -5
- localstack/services/lambda_/invocation/logs.py +2 -3
- localstack/services/lambda_/invocation/runtime_executor.py +3 -3
- localstack/services/lambda_/invocation/version_manager.py +31 -8
- localstack/services/lambda_/ldm.py +14 -0
- localstack/services/lambda_/packages.py +3 -4
- localstack/services/lambda_/provider.py +9 -26
- localstack/services/lambda_/provider_utils.py +1 -1
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
- localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
- localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
- localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
- localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
- localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
- localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
- localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
- localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
- localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
- localstack/services/lambda_/runtimes.py +1 -3
- localstack/services/lambda_/urlrouter.py +14 -1
- localstack/services/logs/models.py +1 -3
- localstack/services/logs/provider.py +39 -22
- localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
- localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
- localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
- localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
- localstack/services/moto.py +5 -4
- localstack/services/opensearch/cluster.py +28 -20
- localstack/services/opensearch/cluster_manager.py +13 -14
- localstack/services/opensearch/models.py +1 -3
- localstack/services/opensearch/packages.py +27 -9
- localstack/services/opensearch/provider.py +15 -10
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
- localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
- localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
- localstack/services/opensearch/versions.py +57 -10
- localstack/services/plugins.py +37 -32
- localstack/services/providers.py +10 -2
- localstack/services/redshift/provider.py +0 -21
- localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
- localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
- localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
- localstack/services/route53/models.py +1 -3
- localstack/services/route53/provider.py +1 -2
- localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
- localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
- localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
- localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
- localstack/services/route53resolver/models.py +8 -10
- localstack/services/route53resolver/provider.py +12 -12
- localstack/services/s3/codec.py +2 -2
- localstack/services/s3/constants.py +5 -2
- localstack/services/s3/cors.py +8 -8
- localstack/services/s3/models.py +73 -73
- localstack/services/s3/notifications.py +74 -58
- localstack/services/s3/presigned_url.py +41 -59
- localstack/services/s3/provider.py +86 -29
- localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
- localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
- localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
- localstack/services/s3/storage/core.py +4 -3
- localstack/services/s3/storage/ephemeral.py +7 -6
- localstack/services/s3/utils.py +51 -31
- localstack/services/s3/validation.py +47 -33
- localstack/services/s3/website_hosting.py +9 -7
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
- localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
- localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
- localstack/services/secretsmanager/provider.py +10 -12
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
- localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
- localstack/services/ses/models.py +8 -1
- localstack/services/ses/provider.py +128 -55
- localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
- localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
- localstack/services/sns/constants.py +7 -1
- localstack/services/sns/executor.py +9 -2
- localstack/services/sns/models.py +25 -25
- localstack/services/sns/provider.py +9 -7
- localstack/services/sns/publisher.py +37 -23
- localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
- localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
- localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
- localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
- localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
- localstack/services/sns/v2/models.py +167 -0
- localstack/services/sns/v2/provider.py +867 -0
- localstack/services/sns/v2/utils.py +130 -0
- localstack/services/sqs/constants.py +2 -2
- localstack/services/sqs/developer_api.py +205 -0
- localstack/services/sqs/models.py +71 -36
- localstack/services/sqs/provider.py +56 -332
- localstack/services/sqs/query_api.py +8 -5
- localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
- localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
- localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
- localstack/services/sqs/utils.py +123 -4
- localstack/services/ssm/provider.py +3 -4
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
- localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
- localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
- localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
- localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
- localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
- localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
- localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
- localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
- localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
- localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
- localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
- localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
- localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
- localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
- localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
- localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
- localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
- localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
- localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
- localstack/services/stepfunctions/asl/component/program/program.py +9 -9
- localstack/services/stepfunctions/asl/component/program/states.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state.py +10 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
- localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
- localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
- localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
- localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
- localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
- localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
- localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
- localstack/services/stepfunctions/asl/eval/environment.py +22 -24
- localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
- localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
- localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
- localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
- localstack/services/stepfunctions/asl/eval/states.py +12 -12
- localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
- localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
- localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
- localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
- localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
- localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
- localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
- localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
- localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
- localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
- localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
- localstack/services/stepfunctions/backend/activity.py +4 -4
- localstack/services/stepfunctions/backend/alias.py +8 -8
- localstack/services/stepfunctions/backend/execution.py +29 -30
- localstack/services/stepfunctions/backend/execution_worker.py +7 -7
- localstack/services/stepfunctions/backend/state_machine.py +28 -28
- localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
- localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
- localstack/services/stepfunctions/mocking/mock_config.py +9 -9
- localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
- localstack/services/stepfunctions/packages.py +14 -5
- localstack/services/stepfunctions/provider.py +34 -44
- localstack/services/stepfunctions/quotas.py +2 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
- localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
- localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
- localstack/services/stores.py +8 -8
- localstack/services/transcribe/packages.py +1 -3
- localstack/services/transcribe/provider.py +8 -3
- localstack/state/codecs.py +61 -0
- localstack/state/core.py +11 -5
- localstack/state/inspect.py +4 -4
- localstack/state/pickle.py +36 -23
- localstack/testing/aws/asf_utils.py +3 -2
- localstack/testing/aws/cloudformation_utils.py +1 -1
- localstack/testing/aws/lambda_utils.py +15 -14
- localstack/testing/aws/util.py +3 -2
- localstack/testing/pytest/cloudformation/fixtures.py +68 -18
- localstack/testing/pytest/container.py +5 -5
- localstack/testing/pytest/filters.py +1 -3
- localstack/testing/pytest/fixtures.py +188 -49
- localstack/testing/pytest/in_memory_localstack.py +1 -3
- localstack/testing/pytest/marking.py +42 -15
- localstack/testing/pytest/path_filter.py +1 -1
- localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
- localstack/testing/pytest/stepfunctions/utils.py +11 -10
- localstack/testing/pytest/util.py +1 -1
- localstack/testing/pytest/validation_tracking.py +3 -4
- localstack/testing/scenario/provisioning.py +11 -10
- localstack/testing/snapshots/transformer_utility.py +8 -3
- localstack/testing/testselection/matching.py +2 -2
- localstack/testing/testselection/opt_out.py +1 -1
- localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
- localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
- localstack/testing/testselection/testselection.py +2 -2
- localstack/utils/analytics/cli.py +2 -3
- localstack/utils/analytics/client.py +5 -5
- localstack/utils/analytics/events.py +2 -2
- localstack/utils/analytics/metadata.py +6 -4
- localstack/utils/analytics/metrics/counter.py +11 -18
- localstack/utils/analytics/metrics/registry.py +2 -2
- localstack/utils/analytics/publisher.py +4 -5
- localstack/utils/analytics/service_providers.py +19 -0
- localstack/utils/analytics/service_request_aggregator.py +4 -4
- localstack/utils/archives.py +12 -12
- localstack/utils/asyncio.py +2 -2
- localstack/utils/aws/arns.py +26 -31
- localstack/utils/aws/aws_responses.py +21 -28
- localstack/utils/aws/aws_stack.py +7 -12
- localstack/utils/aws/dead_letter_queue.py +4 -9
- localstack/utils/aws/message_forwarding.py +8 -11
- localstack/utils/aws/request_context.py +5 -6
- localstack/utils/aws/resources.py +1 -1
- localstack/utils/aws/templating.py +4 -4
- localstack/utils/batch_policy.py +4 -4
- localstack/utils/bootstrap.py +37 -30
- localstack/utils/catalog/catalog.py +139 -0
- localstack/utils/catalog/catalog_loader.py +119 -0
- localstack/utils/catalog/common.py +58 -0
- localstack/utils/catalog/plugins.py +28 -0
- localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
- localstack/utils/collections.py +33 -27
- localstack/utils/config_listener.py +2 -2
- localstack/utils/container_networking.py +5 -6
- localstack/utils/container_utils/container_client.py +156 -160
- localstack/utils/container_utils/docker_cmd_client.py +97 -81
- localstack/utils/container_utils/docker_sdk_client.py +75 -72
- localstack/utils/crypto.py +12 -13
- localstack/utils/diagnose.py +11 -12
- localstack/utils/docker_utils.py +11 -7
- localstack/utils/files.py +34 -15
- localstack/utils/functions.py +5 -4
- localstack/utils/http.py +14 -14
- localstack/utils/iputils.py +2 -1
- localstack/utils/json.py +21 -7
- localstack/utils/kinesis/kinesis_connector.py +2 -1
- localstack/utils/net.py +25 -17
- localstack/utils/no_exit_argument_parser.py +2 -2
- localstack/utils/numbers.py +9 -2
- localstack/utils/objects.py +15 -14
- localstack/utils/patch.py +14 -7
- localstack/utils/platform.py +2 -2
- localstack/utils/run.py +15 -14
- localstack/utils/scheduler.py +13 -12
- localstack/utils/server/tcp_proxy.py +2 -2
- localstack/utils/serving.py +3 -4
- localstack/utils/strings.py +15 -16
- localstack/utils/sync.py +126 -1
- localstack/utils/tagging.py +10 -8
- localstack/utils/testutil.py +17 -17
- localstack/utils/threads.py +3 -3
- localstack/utils/time.py +12 -4
- localstack/utils/urls.py +1 -3
- localstack/utils/xml.py +1 -1
- localstack/utils/xray/traceid.py +1 -1
- localstack/version.py +16 -3
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
- localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
- localstack/packages/terraform.py +0 -47
- localstack/services/cloudformation/deploy.html +0 -144
- localstack/services/cloudformation/deploy_ui.py +0 -47
- localstack/services/cloudformation/plugins.py +0 -12
- localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
- localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
- localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
- localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
- localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
- /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
|
@@ -1,21 +1,36 @@
|
|
|
1
1
|
import copy
|
|
2
|
+
import json
|
|
2
3
|
import logging
|
|
3
4
|
import os
|
|
4
|
-
|
|
5
|
+
import re
|
|
6
|
+
from typing import Any, Final, TypedDict
|
|
5
7
|
|
|
6
8
|
import boto3
|
|
9
|
+
import jsonpath_ng
|
|
10
|
+
from botocore.exceptions import ClientError, ParamValidationError
|
|
7
11
|
from samtranslator.translator.transform import transform as transform_sam
|
|
8
12
|
|
|
13
|
+
from localstack.aws.connect import connect_to
|
|
14
|
+
from localstack.services.cloudformation.engine.parameters import StackParameter
|
|
9
15
|
from localstack.services.cloudformation.engine.policy_loader import create_policy_loader
|
|
16
|
+
from localstack.services.cloudformation.engine.template_preparer import parse_template
|
|
10
17
|
from localstack.services.cloudformation.engine.transformers import (
|
|
11
18
|
FailedTransformationException,
|
|
12
|
-
|
|
19
|
+
ResolveRefsRecursivelyContext,
|
|
20
|
+
apply_language_extensions_transform,
|
|
13
21
|
)
|
|
14
22
|
from localstack.services.cloudformation.engine.v2.change_set_model import (
|
|
15
23
|
ChangeType,
|
|
24
|
+
FnTransform,
|
|
16
25
|
Maybe,
|
|
26
|
+
NodeForEach,
|
|
17
27
|
NodeGlobalTransform,
|
|
18
|
-
|
|
28
|
+
NodeIntrinsicFunction,
|
|
29
|
+
NodeIntrinsicFunctionFnTransform,
|
|
30
|
+
NodeProperties,
|
|
31
|
+
NodeProperty,
|
|
32
|
+
NodeResource,
|
|
33
|
+
NodeResources,
|
|
19
34
|
NodeTransform,
|
|
20
35
|
Nothing,
|
|
21
36
|
Scope,
|
|
@@ -24,19 +39,39 @@ from localstack.services.cloudformation.engine.v2.change_set_model import (
|
|
|
24
39
|
from localstack.services.cloudformation.engine.v2.change_set_model_preproc import (
|
|
25
40
|
ChangeSetModelPreproc,
|
|
26
41
|
PreprocEntityDelta,
|
|
42
|
+
PreprocProperties,
|
|
27
43
|
)
|
|
44
|
+
from localstack.services.cloudformation.engine.validations import ValidationError
|
|
28
45
|
from localstack.services.cloudformation.stores import get_cloudformation_store
|
|
29
46
|
from localstack.services.cloudformation.v2.entities import ChangeSet
|
|
47
|
+
from localstack.services.cloudformation.v2.types import EngineParameter, engine_parameter_value
|
|
48
|
+
from localstack.utils import testutil
|
|
49
|
+
from localstack.utils.strings import long_uid
|
|
30
50
|
|
|
31
51
|
LOG = logging.getLogger(__name__)
|
|
32
52
|
|
|
33
53
|
SERVERLESS_TRANSFORM = "AWS::Serverless-2016-10-31"
|
|
34
54
|
EXTENSIONS_TRANSFORM = "AWS::LanguageExtensions"
|
|
35
55
|
SECRETSMANAGER_TRANSFORM = "AWS::SecretsManager-2020-07-23"
|
|
56
|
+
INCLUDE_TRANSFORM = "AWS::Include"
|
|
36
57
|
|
|
37
58
|
_SCOPE_TRANSFORM_TEMPLATE_OUTCOME: Final[Scope] = Scope("TRANSFORM_TEMPLATE_OUTCOME")
|
|
38
59
|
|
|
39
60
|
|
|
61
|
+
def engine_parameters_to_stack_parameters(
|
|
62
|
+
engine_parameters: dict[str, EngineParameter],
|
|
63
|
+
) -> dict[str, StackParameter]:
|
|
64
|
+
out = {}
|
|
65
|
+
for name, engine_param in engine_parameters.items():
|
|
66
|
+
out[name] = StackParameter(
|
|
67
|
+
ParameterKey=name,
|
|
68
|
+
ParameterValue=engine_parameter_value(engine_param),
|
|
69
|
+
ResolvedValue=engine_param.get("resolved_value"),
|
|
70
|
+
ParameterType=engine_param["type_"],
|
|
71
|
+
)
|
|
72
|
+
return out
|
|
73
|
+
|
|
74
|
+
|
|
40
75
|
# TODO: evaluate the use of subtypes to represent and validate types of transforms
|
|
41
76
|
class GlobalTransform:
|
|
42
77
|
name: str
|
|
@@ -51,12 +86,12 @@ class TransformPreprocParameter(TypedDict):
|
|
|
51
86
|
# TODO: expand
|
|
52
87
|
ParameterKey: str
|
|
53
88
|
ParameterValue: Any
|
|
54
|
-
ParameterType:
|
|
89
|
+
ParameterType: str | None
|
|
55
90
|
|
|
56
91
|
|
|
57
92
|
class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
58
|
-
_before_parameters: Final[dict]
|
|
59
|
-
_after_parameters: Final[dict]
|
|
93
|
+
_before_parameters: Final[dict[str, EngineParameter] | None]
|
|
94
|
+
_after_parameters: Final[dict[str, EngineParameter] | None]
|
|
60
95
|
_before_template: Final[Maybe[dict]]
|
|
61
96
|
_after_template: Final[Maybe[dict]]
|
|
62
97
|
|
|
@@ -65,8 +100,8 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
65
100
|
change_set: ChangeSet,
|
|
66
101
|
before_parameters: dict,
|
|
67
102
|
after_parameters: dict,
|
|
68
|
-
before_template:
|
|
69
|
-
after_template:
|
|
103
|
+
before_template: dict | None,
|
|
104
|
+
after_template: dict | None,
|
|
70
105
|
):
|
|
71
106
|
super().__init__(change_set=change_set)
|
|
72
107
|
self._before_parameters = before_parameters
|
|
@@ -74,44 +109,13 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
74
109
|
self._before_template = before_template or Nothing
|
|
75
110
|
self._after_template = after_template or Nothing
|
|
76
111
|
|
|
77
|
-
def
|
|
78
|
-
self
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
# Enable compatability with v1 util.
|
|
83
|
-
# TODO: port v1's SSM parameter resolution
|
|
84
|
-
|
|
85
|
-
parameter_value_delta = super().visit_node_parameter(node_parameter=node_parameter)
|
|
86
|
-
parameter_value_before = parameter_value_delta.before
|
|
87
|
-
parameter_value_after = parameter_value_delta.after
|
|
88
|
-
|
|
89
|
-
parameter_type_delta = self.visit(node_parameter.type_)
|
|
90
|
-
parameter_type_before = parameter_type_delta.before
|
|
91
|
-
parameter_type_after = parameter_type_delta.after
|
|
92
|
-
|
|
93
|
-
parameter_key = node_parameter.name
|
|
94
|
-
|
|
95
|
-
before = Nothing
|
|
96
|
-
if not is_nothing(parameter_value_before):
|
|
97
|
-
before = TransformPreprocParameter(
|
|
98
|
-
ParameterKey=parameter_key,
|
|
99
|
-
ParameterValue=parameter_value_before,
|
|
100
|
-
ParameterType=parameter_type_before
|
|
101
|
-
if not is_nothing(parameter_type_before)
|
|
102
|
-
else None,
|
|
103
|
-
)
|
|
104
|
-
after = Nothing
|
|
105
|
-
if not is_nothing(parameter_value_after):
|
|
106
|
-
after = TransformPreprocParameter(
|
|
107
|
-
ParameterKey=parameter_key,
|
|
108
|
-
ParameterValue=parameter_value_after,
|
|
109
|
-
ParameterType=parameter_type_after
|
|
110
|
-
if not is_nothing(parameter_type_after)
|
|
111
|
-
else None,
|
|
112
|
-
)
|
|
112
|
+
def transform(self) -> tuple[dict, dict]:
|
|
113
|
+
self._setup_runtime_cache()
|
|
114
|
+
self._execute_local_transforms()
|
|
115
|
+
transformed_before_template, transformed_after_template = self._execute_global_transforms()
|
|
116
|
+
self._save_runtime_cache()
|
|
113
117
|
|
|
114
|
-
return
|
|
118
|
+
return transformed_before_template, transformed_after_template
|
|
115
119
|
|
|
116
120
|
# Ported from v1:
|
|
117
121
|
@staticmethod
|
|
@@ -138,68 +142,92 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
138
142
|
if region_before is not None:
|
|
139
143
|
os.environ["AWS_DEFAULT_REGION"] = region_before
|
|
140
144
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
).
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return transformed_template # noqa
|
|
145
|
+
def _compute_include_transform(self, parameters: dict, fragment: dict) -> dict:
|
|
146
|
+
location = parameters.get("Location")
|
|
147
|
+
if not location or not location.startswith("s3://"):
|
|
148
|
+
raise FailedTransformationException(
|
|
149
|
+
transformation=INCLUDE_TRANSFORM,
|
|
150
|
+
message=f"Unexpected Location parameter for AWS::Include transformer: {location}",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
s3_client = connect_to(
|
|
154
|
+
aws_access_key_id=self._change_set.account_id, region_name=self._change_set.region_name
|
|
155
|
+
).s3
|
|
156
|
+
bucket, _, path = location.removeprefix("s3://").partition("/")
|
|
157
|
+
try:
|
|
158
|
+
content = testutil.download_s3_object(s3_client, bucket, path)
|
|
159
|
+
except ClientError:
|
|
160
|
+
raise FailedTransformationException(
|
|
161
|
+
transformation=INCLUDE_TRANSFORM,
|
|
162
|
+
message=f"Error downloading S3 object '{bucket}/{path}'",
|
|
163
|
+
)
|
|
164
|
+
try:
|
|
165
|
+
template_to_include = parse_template(content)
|
|
166
|
+
except Exception as e:
|
|
167
|
+
raise FailedTransformationException(transformation=INCLUDE_TRANSFORM, message=str(e))
|
|
168
|
+
|
|
169
|
+
return {**fragment, **template_to_include}
|
|
167
170
|
|
|
168
171
|
def _apply_global_transform(
|
|
169
|
-
self,
|
|
172
|
+
self,
|
|
173
|
+
global_transform: GlobalTransform,
|
|
174
|
+
template: dict,
|
|
175
|
+
parameters: dict[str, EngineParameter],
|
|
170
176
|
) -> dict:
|
|
171
177
|
transform_name = global_transform.name
|
|
172
178
|
if transform_name == EXTENSIONS_TRANSFORM:
|
|
173
|
-
|
|
174
|
-
|
|
179
|
+
resources = template["Resources"]
|
|
180
|
+
mappings = template.get("Mappings", {})
|
|
181
|
+
conditions = template.get("Conditions", {})
|
|
182
|
+
|
|
183
|
+
resolve_context = ResolveRefsRecursivelyContext(
|
|
184
|
+
self._change_set.account_id,
|
|
185
|
+
self._change_set.region_name,
|
|
186
|
+
self._change_set.stack.stack_name,
|
|
187
|
+
resources,
|
|
188
|
+
mappings,
|
|
189
|
+
conditions,
|
|
190
|
+
parameters=engine_parameters_to_stack_parameters(parameters),
|
|
191
|
+
)
|
|
192
|
+
transformed_template = apply_language_extensions_transform(template, resolve_context)
|
|
175
193
|
elif transform_name == SERVERLESS_TRANSFORM:
|
|
194
|
+
# serverless transform just requires the key/value pairs
|
|
195
|
+
serverless_parameters = {}
|
|
196
|
+
for name, param in parameters.items():
|
|
197
|
+
serverless_parameters[name] = param.get("resolved_value") or engine_parameter_value(
|
|
198
|
+
param
|
|
199
|
+
)
|
|
176
200
|
transformed_template = self._apply_global_serverless_transformation(
|
|
177
201
|
region_name=self._change_set.region_name,
|
|
178
202
|
template=template,
|
|
179
|
-
parameters=
|
|
203
|
+
parameters=serverless_parameters,
|
|
180
204
|
)
|
|
181
205
|
elif transform_name == SECRETSMANAGER_TRANSFORM:
|
|
182
206
|
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-secretsmanager.html
|
|
183
207
|
LOG.warning("%s is not yet supported. Ignoring.", SECRETSMANAGER_TRANSFORM)
|
|
184
208
|
transformed_template = template
|
|
209
|
+
elif transform_name == INCLUDE_TRANSFORM:
|
|
210
|
+
transformed_template = self._compute_include_transform(
|
|
211
|
+
parameters=global_transform.parameters,
|
|
212
|
+
fragment=template,
|
|
213
|
+
)
|
|
185
214
|
else:
|
|
186
|
-
transformed_template = self.
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
global_transform
|
|
190
|
-
|
|
191
|
-
|
|
215
|
+
transformed_template = self._invoke_macro(
|
|
216
|
+
name=global_transform.name,
|
|
217
|
+
parameters=global_transform.parameters
|
|
218
|
+
if not is_nothing(global_transform.parameters)
|
|
219
|
+
else {},
|
|
220
|
+
fragment=template,
|
|
221
|
+
allow_string=False,
|
|
192
222
|
)
|
|
193
223
|
return transformed_template
|
|
194
224
|
|
|
195
|
-
def
|
|
196
|
-
self._setup_runtime_cache()
|
|
197
|
-
|
|
225
|
+
def _execute_local_transforms(self):
|
|
198
226
|
node_template = self._change_set.update_model.node_template
|
|
227
|
+
self.visit_node_resources(node_template.resources)
|
|
199
228
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
parameters_after = parameters_delta.after
|
|
229
|
+
def _execute_global_transforms(self) -> tuple[dict, dict]:
|
|
230
|
+
node_template = self._change_set.update_model.node_template
|
|
203
231
|
|
|
204
232
|
transform_delta: PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]] = (
|
|
205
233
|
self.visit_node_transform(node_template.transform)
|
|
@@ -209,31 +237,36 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
209
237
|
|
|
210
238
|
transformed_before_template = self._before_template
|
|
211
239
|
if transform_before and not is_nothing(self._before_template):
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
240
|
+
if _SCOPE_TRANSFORM_TEMPLATE_OUTCOME in self._before_cache:
|
|
241
|
+
transformed_before_template = self._before_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME]
|
|
242
|
+
else:
|
|
215
243
|
for before_global_transform in transform_before:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
244
|
+
if not is_nothing(before_global_transform.name):
|
|
245
|
+
transformed_before_template = self._apply_global_transform(
|
|
246
|
+
global_transform=before_global_transform,
|
|
247
|
+
parameters=self._before_parameters,
|
|
248
|
+
template=transformed_before_template,
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
# Macro transformations won't remove the transform from the template
|
|
252
|
+
if "Transform" in transformed_before_template:
|
|
253
|
+
transformed_before_template.pop("Transform")
|
|
221
254
|
self._before_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = transformed_before_template
|
|
222
255
|
|
|
223
256
|
transformed_after_template = self._after_template
|
|
224
257
|
if transform_after and not is_nothing(self._after_template):
|
|
225
|
-
transformed_after_template = self.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
for after_global_transform in transform_after:
|
|
258
|
+
transformed_after_template = self._after_template
|
|
259
|
+
for after_global_transform in transform_after:
|
|
260
|
+
if not is_nothing(after_global_transform.name):
|
|
229
261
|
transformed_after_template = self._apply_global_transform(
|
|
230
262
|
global_transform=after_global_transform,
|
|
231
|
-
parameters=
|
|
263
|
+
parameters=self._after_parameters,
|
|
232
264
|
template=transformed_after_template,
|
|
233
265
|
)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
266
|
+
# Macro transformations won't remove the transform from the template
|
|
267
|
+
if "Transform" in transformed_after_template:
|
|
268
|
+
transformed_after_template.pop("Transform")
|
|
269
|
+
self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = transformed_after_template
|
|
237
270
|
|
|
238
271
|
return transformed_before_template, transformed_after_template
|
|
239
272
|
|
|
@@ -257,9 +290,12 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
257
290
|
self, node_transform: NodeTransform
|
|
258
291
|
) -> PreprocEntityDelta[list[GlobalTransform], list[GlobalTransform]]:
|
|
259
292
|
change_type = node_transform.change_type
|
|
260
|
-
before =
|
|
261
|
-
after =
|
|
293
|
+
before = [] if change_type != ChangeType.CREATED else Nothing
|
|
294
|
+
after = [] if change_type != ChangeType.REMOVED else Nothing
|
|
262
295
|
for change_set_entity in node_transform.global_transforms:
|
|
296
|
+
if not isinstance(change_set_entity.name.value, str):
|
|
297
|
+
raise ValidationError("Key Name of transform definition must be a string.")
|
|
298
|
+
|
|
263
299
|
delta: PreprocEntityDelta[GlobalTransform, GlobalTransform] = self.visit(
|
|
264
300
|
change_set_entity=change_set_entity
|
|
265
301
|
)
|
|
@@ -270,3 +306,242 @@ class ChangeSetModelTransform(ChangeSetModelPreproc):
|
|
|
270
306
|
if not is_nothing(after) and not is_nothing(delta_after):
|
|
271
307
|
after.append(delta_after)
|
|
272
308
|
return PreprocEntityDelta(before=before, after=after)
|
|
309
|
+
|
|
310
|
+
def _compute_fn_transform(
|
|
311
|
+
self, macro_definition: Any, siblings: Any, allow_string: False
|
|
312
|
+
) -> Any:
|
|
313
|
+
def _normalize_transform(obj):
|
|
314
|
+
transforms = []
|
|
315
|
+
|
|
316
|
+
if isinstance(obj, str):
|
|
317
|
+
transforms.append({"Name": obj, "Parameters": {}})
|
|
318
|
+
|
|
319
|
+
if isinstance(obj, dict):
|
|
320
|
+
transforms.append(obj)
|
|
321
|
+
|
|
322
|
+
if isinstance(obj, list):
|
|
323
|
+
for v in obj:
|
|
324
|
+
if isinstance(v, str):
|
|
325
|
+
transforms.append({"Name": v, "Parameters": {}})
|
|
326
|
+
|
|
327
|
+
if isinstance(v, dict):
|
|
328
|
+
if not v.get("Parameters"):
|
|
329
|
+
v["Parameters"] = {}
|
|
330
|
+
transforms.append(v)
|
|
331
|
+
|
|
332
|
+
return transforms
|
|
333
|
+
|
|
334
|
+
normalized_transforms = _normalize_transform(macro_definition)
|
|
335
|
+
transform_output = copy.deepcopy(siblings)
|
|
336
|
+
for transform in normalized_transforms:
|
|
337
|
+
transform_name = transform["Name"]
|
|
338
|
+
if transform_name == INCLUDE_TRANSFORM:
|
|
339
|
+
transform_output = self._compute_include_transform(
|
|
340
|
+
parameters=transform["Parameters"], fragment=transform_output
|
|
341
|
+
)
|
|
342
|
+
else:
|
|
343
|
+
transform_output: dict | str = self._invoke_macro(
|
|
344
|
+
fragment=transform_output,
|
|
345
|
+
name=transform["Name"],
|
|
346
|
+
parameters=transform.get("Parameters", {}),
|
|
347
|
+
allow_string=allow_string,
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
if isinstance(transform_output, dict) and FnTransform in transform_output:
|
|
351
|
+
transform_output.pop(FnTransform)
|
|
352
|
+
|
|
353
|
+
return transform_output
|
|
354
|
+
|
|
355
|
+
def _replace_at_jsonpath(self, template: dict, path: str, result: Any):
|
|
356
|
+
pattern = jsonpath_ng.parse(path)
|
|
357
|
+
result_template = pattern.update(template, result)
|
|
358
|
+
|
|
359
|
+
return result_template
|
|
360
|
+
|
|
361
|
+
def visit_node_for_each(self, node_foreach: NodeForEach) -> PreprocEntityDelta:
|
|
362
|
+
return PreprocEntityDelta()
|
|
363
|
+
|
|
364
|
+
def visit_node_intrinsic_function_fn_transform(
|
|
365
|
+
self, node_intrinsic_function: NodeIntrinsicFunctionFnTransform
|
|
366
|
+
) -> PreprocEntityDelta:
|
|
367
|
+
arguments_delta = self.visit(node_intrinsic_function.arguments)
|
|
368
|
+
parent_json_path = node_intrinsic_function.scope.parent.jsonpath
|
|
369
|
+
|
|
370
|
+
# Only when a FnTransform is used as Property value the macro function is allowed to return a str
|
|
371
|
+
property_value_regex = r"\.(Properties)"
|
|
372
|
+
allow_string = False
|
|
373
|
+
if re.search(property_value_regex, parent_json_path):
|
|
374
|
+
allow_string = True
|
|
375
|
+
|
|
376
|
+
if not is_nothing(arguments_delta.before):
|
|
377
|
+
before = self._compute_fn_transform(
|
|
378
|
+
arguments_delta.before,
|
|
379
|
+
node_intrinsic_function.before_siblings,
|
|
380
|
+
allow_string=allow_string,
|
|
381
|
+
)
|
|
382
|
+
updated_before_template = self._replace_at_jsonpath(
|
|
383
|
+
self._before_template, parent_json_path, before
|
|
384
|
+
)
|
|
385
|
+
self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = updated_before_template
|
|
386
|
+
else:
|
|
387
|
+
before = Nothing
|
|
388
|
+
|
|
389
|
+
if not is_nothing(arguments_delta.after):
|
|
390
|
+
after = self._compute_fn_transform(
|
|
391
|
+
arguments_delta.after,
|
|
392
|
+
node_intrinsic_function.after_siblings,
|
|
393
|
+
allow_string=allow_string,
|
|
394
|
+
)
|
|
395
|
+
updated_after_template = self._replace_at_jsonpath(
|
|
396
|
+
self._after_template, parent_json_path, after
|
|
397
|
+
)
|
|
398
|
+
self._after_cache[_SCOPE_TRANSFORM_TEMPLATE_OUTCOME] = updated_after_template
|
|
399
|
+
else:
|
|
400
|
+
after = Nothing
|
|
401
|
+
|
|
402
|
+
self._save_runtime_cache()
|
|
403
|
+
return PreprocEntityDelta(before=before, after=after)
|
|
404
|
+
|
|
405
|
+
def visit_node_properties(
|
|
406
|
+
self, node_properties: NodeProperties
|
|
407
|
+
) -> PreprocEntityDelta[PreprocProperties, PreprocProperties]:
|
|
408
|
+
if not is_nothing(node_properties.fn_transform):
|
|
409
|
+
self.visit_node_intrinsic_function_fn_transform(node_properties.fn_transform)
|
|
410
|
+
|
|
411
|
+
return super().visit_node_properties(node_properties=node_properties)
|
|
412
|
+
|
|
413
|
+
def visit_node_resource(self, node_resource: NodeResource) -> PreprocEntityDelta:
|
|
414
|
+
if not is_nothing(node_resource.fn_transform):
|
|
415
|
+
self.visit_node_intrinsic_function_fn_transform(
|
|
416
|
+
node_intrinsic_function=node_resource.fn_transform
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
try:
|
|
420
|
+
if delta := super().visit_node_resource(node_resource):
|
|
421
|
+
return delta
|
|
422
|
+
return super().visit_node_properties(node_resource.properties)
|
|
423
|
+
except RuntimeError:
|
|
424
|
+
return super().visit_node_properties(node_resource.properties)
|
|
425
|
+
|
|
426
|
+
def visit_node_resources(self, node_resources: NodeResources) -> PreprocEntityDelta:
|
|
427
|
+
if not is_nothing(node_resources.fn_transform):
|
|
428
|
+
self.visit_node_intrinsic_function_fn_transform(
|
|
429
|
+
node_intrinsic_function=node_resources.fn_transform
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
return super().visit_node_resources(node_resources=node_resources)
|
|
433
|
+
|
|
434
|
+
def _invoke_macro(self, name: str, parameters: dict, fragment: dict, allow_string=False):
|
|
435
|
+
account_id = self._change_set.account_id
|
|
436
|
+
region_name = self._change_set.region_name
|
|
437
|
+
macro_definition = get_cloudformation_store(
|
|
438
|
+
account_id=account_id, region_name=region_name
|
|
439
|
+
).macros.get(name)
|
|
440
|
+
|
|
441
|
+
if not macro_definition:
|
|
442
|
+
raise FailedTransformationException(name, f"Transformation {name} is not supported.")
|
|
443
|
+
|
|
444
|
+
simplified_parameters = {}
|
|
445
|
+
if resolved_parameters := self._change_set.resolved_parameters:
|
|
446
|
+
for key, resolved_parameter in resolved_parameters.items():
|
|
447
|
+
final_value = engine_parameter_value(resolved_parameter)
|
|
448
|
+
simplified_parameters[key] = (
|
|
449
|
+
final_value.split(",")
|
|
450
|
+
if resolved_parameter["type_"] == "CommaDelimitedList"
|
|
451
|
+
else final_value
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
transformation_id = f"{account_id}::{name}"
|
|
455
|
+
event = {
|
|
456
|
+
"region": region_name,
|
|
457
|
+
"accountId": account_id,
|
|
458
|
+
"fragment": fragment,
|
|
459
|
+
"transformId": transformation_id,
|
|
460
|
+
"params": parameters,
|
|
461
|
+
"requestId": long_uid(),
|
|
462
|
+
"templateParameterValues": simplified_parameters,
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
client = connect_to(aws_access_key_id=account_id, region_name=region_name).lambda_
|
|
466
|
+
try:
|
|
467
|
+
invocation = client.invoke(
|
|
468
|
+
FunctionName=macro_definition["FunctionName"], Payload=json.dumps(event)
|
|
469
|
+
)
|
|
470
|
+
except ClientError:
|
|
471
|
+
LOG.error(
|
|
472
|
+
"client error executing lambda function '%s' with payload '%s'",
|
|
473
|
+
macro_definition["FunctionName"],
|
|
474
|
+
json.dumps(event),
|
|
475
|
+
)
|
|
476
|
+
raise
|
|
477
|
+
if invocation.get("StatusCode") != 200 or invocation.get("FunctionError") == "Unhandled":
|
|
478
|
+
raise FailedTransformationException(
|
|
479
|
+
transformation=name,
|
|
480
|
+
message=f"Received malformed response from transform {transformation_id}. Rollback requested by user.",
|
|
481
|
+
)
|
|
482
|
+
result = json.loads(invocation["Payload"].read())
|
|
483
|
+
|
|
484
|
+
if result.get("status") != "success":
|
|
485
|
+
error_message = result.get("errorMessage")
|
|
486
|
+
message = (
|
|
487
|
+
f"Transform {transformation_id} failed with: {error_message}. Rollback requested by user."
|
|
488
|
+
if error_message
|
|
489
|
+
else f"Transform {transformation_id} failed without an error message.. Rollback requested by user."
|
|
490
|
+
)
|
|
491
|
+
raise FailedTransformationException(transformation=name, message=message)
|
|
492
|
+
|
|
493
|
+
if not isinstance(result.get("fragment"), dict) and not allow_string:
|
|
494
|
+
raise FailedTransformationException(
|
|
495
|
+
transformation=name,
|
|
496
|
+
message="Template format error: unsupported structure.. Rollback requested by user.",
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
return result.get("fragment")
|
|
500
|
+
|
|
501
|
+
def visit_node_intrinsic_function_fn_get_att(
|
|
502
|
+
self, node_intrinsic_function: NodeIntrinsicFunction
|
|
503
|
+
) -> PreprocEntityDelta:
|
|
504
|
+
try:
|
|
505
|
+
return super().visit_node_intrinsic_function_fn_get_att(node_intrinsic_function)
|
|
506
|
+
except RuntimeError:
|
|
507
|
+
return self.visit(node_intrinsic_function.arguments)
|
|
508
|
+
|
|
509
|
+
def visit_node_intrinsic_function_fn_sub(
|
|
510
|
+
self, node_intrinsic_function: NodeIntrinsicFunction
|
|
511
|
+
) -> PreprocEntityDelta:
|
|
512
|
+
try:
|
|
513
|
+
# If an argument is a Parameter it should be resolved, any other case, ignore it
|
|
514
|
+
return super().visit_node_intrinsic_function_fn_sub(node_intrinsic_function)
|
|
515
|
+
except RuntimeError:
|
|
516
|
+
return self.visit(node_intrinsic_function.arguments)
|
|
517
|
+
|
|
518
|
+
def visit_node_intrinsic_function_fn_split(
|
|
519
|
+
self, node_intrinsic_function: NodeIntrinsicFunction
|
|
520
|
+
) -> PreprocEntityDelta:
|
|
521
|
+
try:
|
|
522
|
+
# If an argument is a Parameter it should be resolved, any other case, ignore it
|
|
523
|
+
return super().visit_node_intrinsic_function_fn_split(node_intrinsic_function)
|
|
524
|
+
except RuntimeError:
|
|
525
|
+
return self.visit(node_intrinsic_function.arguments)
|
|
526
|
+
|
|
527
|
+
def visit_node_intrinsic_function_fn_select(
|
|
528
|
+
self, node_intrinsic_function: NodeIntrinsicFunction
|
|
529
|
+
) -> PreprocEntityDelta:
|
|
530
|
+
try:
|
|
531
|
+
# If an argument is a Parameter it should be resolved, any other case, ignore it
|
|
532
|
+
return super().visit_node_intrinsic_function_fn_select(node_intrinsic_function)
|
|
533
|
+
except RuntimeError:
|
|
534
|
+
return self.visit(node_intrinsic_function.arguments)
|
|
535
|
+
|
|
536
|
+
def visit_node_property(self, node_property: NodeProperty) -> PreprocEntityDelta:
|
|
537
|
+
try:
|
|
538
|
+
return super().visit_node_property(node_property)
|
|
539
|
+
except ParamValidationError:
|
|
540
|
+
return self.visit(node_property.value)
|
|
541
|
+
|
|
542
|
+
# ignore errors from dynamic replacements
|
|
543
|
+
def _maybe_perform_dynamic_replacements(self, delta: PreprocEntityDelta) -> PreprocEntityDelta:
|
|
544
|
+
try:
|
|
545
|
+
return super()._maybe_perform_dynamic_replacements(delta)
|
|
546
|
+
except Exception:
|
|
547
|
+
return delta
|