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.
Files changed (672) hide show
  1. localstack/aws/api/apigateway/__init__.py +87 -110
  2. localstack/aws/api/cloudformation/__init__.py +18 -4
  3. localstack/aws/api/cloudwatch/__init__.py +41 -1
  4. localstack/aws/api/config/__init__.py +4 -0
  5. localstack/aws/api/core.py +8 -5
  6. localstack/aws/api/dynamodb/__init__.py +30 -0
  7. localstack/aws/api/ec2/__init__.py +1545 -66
  8. localstack/aws/api/events/__init__.py +12 -16
  9. localstack/aws/api/iam/__init__.py +7 -0
  10. localstack/aws/api/kinesis/__init__.py +19 -0
  11. localstack/aws/api/kms/__init__.py +6 -0
  12. localstack/aws/api/lambda_/__init__.py +36 -23
  13. localstack/aws/api/logs/__init__.py +20 -8
  14. localstack/aws/api/opensearch/__init__.py +16 -0
  15. localstack/aws/api/pipes/__init__.py +24 -32
  16. localstack/aws/api/redshift/__init__.py +9 -3
  17. localstack/aws/api/route53/__init__.py +5 -0
  18. localstack/aws/api/s3/__init__.py +12 -0
  19. localstack/aws/api/s3control/__init__.py +56 -0
  20. localstack/aws/api/scheduler/__init__.py +14 -16
  21. localstack/aws/api/ssm/__init__.py +2 -0
  22. localstack/aws/api/stepfunctions/__init__.py +88 -114
  23. localstack/aws/api/support/__init__.py +8 -9
  24. localstack/aws/api/transcribe/__init__.py +17 -0
  25. localstack/aws/chain.py +2 -2
  26. localstack/aws/client.py +14 -11
  27. localstack/aws/connect.py +42 -41
  28. localstack/aws/forwarder.py +57 -9
  29. localstack/aws/gateway.py +1 -3
  30. localstack/aws/handlers/analytics.py +2 -3
  31. localstack/aws/handlers/cors.py +4 -5
  32. localstack/aws/handlers/internal_requests.py +6 -1
  33. localstack/aws/handlers/logging.py +13 -4
  34. localstack/aws/handlers/metric_handler.py +44 -5
  35. localstack/aws/handlers/service.py +48 -28
  36. localstack/aws/mocking.py +18 -27
  37. localstack/aws/patches.py +2 -2
  38. localstack/aws/protocol/op_router.py +11 -10
  39. localstack/aws/protocol/parser.py +475 -49
  40. localstack/aws/protocol/serializer.py +723 -106
  41. localstack/aws/protocol/service_router.py +133 -33
  42. localstack/aws/protocol/validate.py +6 -6
  43. localstack/aws/scaffold.py +9 -10
  44. localstack/aws/serving/edge.py +5 -6
  45. localstack/aws/serving/hypercorn.py +2 -2
  46. localstack/aws/serving/twisted.py +1 -2
  47. localstack/aws/serving/werkzeug.py +2 -2
  48. localstack/aws/skeleton.py +12 -11
  49. localstack/aws/spec-patches.json +58 -0
  50. localstack/aws/spec.py +66 -46
  51. localstack/cli/exceptions.py +1 -1
  52. localstack/cli/localstack.py +11 -11
  53. localstack/cli/lpm.py +4 -5
  54. localstack/cli/plugins.py +1 -1
  55. localstack/cli/profiles.py +1 -2
  56. localstack/config.py +44 -30
  57. localstack/constants.py +4 -29
  58. localstack/deprecations.py +5 -5
  59. localstack/dev/kubernetes/__main__.py +130 -7
  60. localstack/dev/run/__main__.py +5 -5
  61. localstack/dev/run/configurators.py +1 -4
  62. localstack/dev/run/paths.py +6 -6
  63. localstack/dns/models.py +2 -1
  64. localstack/dns/plugins.py +5 -1
  65. localstack/dns/server.py +16 -6
  66. localstack/http/dispatcher.py +1 -2
  67. localstack/http/response.py +2 -2
  68. localstack/http/router.py +1 -1
  69. localstack/http/trace.py +2 -1
  70. localstack/logging/format.py +6 -6
  71. localstack/packages/api.py +13 -12
  72. localstack/packages/core.py +4 -4
  73. localstack/packages/debugpy.py +1 -3
  74. localstack/packages/ffmpeg.py +1 -2
  75. localstack/packages/java.py +38 -12
  76. localstack/packages/plugins.py +0 -8
  77. localstack/runtime/analytics.py +3 -0
  78. localstack/runtime/hooks.py +1 -1
  79. localstack/runtime/init.py +8 -9
  80. localstack/runtime/main.py +5 -5
  81. localstack/runtime/patches.py +2 -2
  82. localstack/runtime/shutdown.py +2 -1
  83. localstack/services/apigateway/exporter.py +1 -2
  84. localstack/services/apigateway/helpers.py +7 -10
  85. localstack/services/apigateway/legacy/context.py +21 -21
  86. localstack/services/apigateway/legacy/helpers.py +27 -28
  87. localstack/services/apigateway/legacy/integration.py +11 -10
  88. localstack/services/apigateway/legacy/invocations.py +6 -5
  89. localstack/services/apigateway/legacy/provider.py +148 -68
  90. localstack/services/apigateway/legacy/router_asf.py +2 -2
  91. localstack/services/apigateway/legacy/templates.py +6 -6
  92. localstack/services/apigateway/models.py +16 -16
  93. localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
  94. localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
  95. localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
  96. localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
  97. localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
  98. localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
  99. localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
  100. localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
  101. localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
  102. localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
  103. localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
  104. localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
  105. localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
  106. localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
  107. localstack/services/apigateway/next_gen/provider.py +5 -0
  108. localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
  109. localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
  110. localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
  111. localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
  112. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
  113. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
  114. localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
  115. localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
  116. localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
  117. localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
  118. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
  119. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
  120. localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
  121. localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
  122. localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
  123. localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
  124. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
  125. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
  126. localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
  127. localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
  128. localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
  129. localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
  130. localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
  131. localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
  132. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
  133. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
  134. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
  135. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
  136. localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
  137. localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
  138. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
  139. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
  140. localstack/services/cloudformation/api_utils.py +4 -8
  141. localstack/services/cloudformation/cfn_utils.py +2 -2
  142. localstack/services/cloudformation/deployment_utils.py +14 -12
  143. localstack/services/cloudformation/engine/changes.py +3 -3
  144. localstack/services/cloudformation/engine/entities.py +27 -17
  145. localstack/services/cloudformation/engine/parameters.py +4 -4
  146. localstack/services/cloudformation/engine/template_deployer.py +15 -14
  147. localstack/services/cloudformation/engine/template_utils.py +34 -12
  148. localstack/services/cloudformation/engine/transformers.py +11 -8
  149. localstack/services/cloudformation/engine/types.py +5 -4
  150. localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
  151. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
  152. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
  153. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
  154. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
  155. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
  156. localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
  157. localstack/services/cloudformation/engine/v2/resolving.py +102 -0
  158. localstack/services/cloudformation/engine/yaml_parser.py +9 -2
  159. localstack/services/cloudformation/provider.py +11 -6
  160. localstack/services/cloudformation/provider_utils.py +34 -4
  161. localstack/services/cloudformation/resource_provider.py +31 -21
  162. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
  163. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
  164. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
  165. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
  166. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
  167. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
  168. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
  169. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
  170. localstack/services/cloudformation/resources.py +24149 -0
  171. localstack/services/cloudformation/scaffolding/__main__.py +13 -12
  172. localstack/services/cloudformation/scaffolding/propgen.py +2 -2
  173. localstack/services/cloudformation/service_models.py +2 -2
  174. localstack/services/cloudformation/stores.py +33 -22
  175. localstack/services/cloudformation/v2/entities.py +103 -88
  176. localstack/services/cloudformation/v2/provider.py +872 -131
  177. localstack/services/cloudformation/v2/types.py +38 -0
  178. localstack/services/cloudformation/v2/utils.py +4 -1
  179. localstack/services/cloudwatch/alarm_scheduler.py +11 -8
  180. localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
  181. localstack/services/cloudwatch/models.py +5 -7
  182. localstack/services/cloudwatch/provider.py +30 -25
  183. localstack/services/cloudwatch/provider_v2.py +27 -32
  184. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
  185. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
  186. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
  187. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
  188. localstack/services/dynamodb/packages.py +3 -3
  189. localstack/services/dynamodb/provider.py +159 -18
  190. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
  191. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
  192. localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
  193. localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
  194. localstack/services/dynamodb/server.py +2 -2
  195. localstack/services/dynamodb/utils.py +13 -14
  196. localstack/services/dynamodb/v2/provider.py +157 -18
  197. localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
  198. localstack/services/dynamodbstreams/models.py +1 -3
  199. localstack/services/ec2/patches.py +26 -5
  200. localstack/services/ec2/provider.py +3 -3
  201. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
  202. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
  203. localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
  204. localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
  205. localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
  206. localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
  207. localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
  208. localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
  209. localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
  210. localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
  211. localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
  212. localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
  213. localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
  214. localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
  215. localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
  216. localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
  217. localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
  218. localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
  219. localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
  220. localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
  221. localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
  222. localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
  223. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
  224. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
  225. localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
  226. localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
  227. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
  228. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
  229. localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
  230. localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
  231. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
  232. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
  233. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
  234. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
  235. localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
  236. localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
  237. localstack/services/edge.py +6 -6
  238. localstack/services/es/provider.py +21 -21
  239. localstack/services/events/archive.py +2 -2
  240. localstack/services/events/connection.py +5 -5
  241. localstack/services/events/event_bus.py +9 -9
  242. localstack/services/events/event_rule_engine.py +31 -13
  243. localstack/services/events/models.py +29 -30
  244. localstack/services/events/provider.py +29 -26
  245. localstack/services/events/replay.py +3 -3
  246. localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
  247. localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
  248. localstack/services/events/resource_providers/aws_events_connection.py +27 -27
  249. localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
  250. localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
  251. localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
  252. localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
  253. localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
  254. localstack/services/events/resource_providers/aws_events_rule.py +82 -82
  255. localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
  256. localstack/services/events/rule.py +15 -15
  257. localstack/services/events/target.py +21 -13
  258. localstack/services/events/utils.py +7 -7
  259. localstack/services/events/v1/models.py +1 -3
  260. localstack/services/events/v1/provider.py +15 -15
  261. localstack/services/firehose/models.py +1 -3
  262. localstack/services/firehose/provider.py +25 -16
  263. localstack/services/iam/iam_patches.py +5 -6
  264. localstack/services/iam/provider.py +14 -119
  265. localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
  266. localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
  267. localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
  268. localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
  269. localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
  270. localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
  271. localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
  272. localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
  273. localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
  274. localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
  275. localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
  276. localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
  277. localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
  278. localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
  279. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
  280. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
  281. localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
  282. localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
  283. localstack/services/iam/resources/policy_simulator.py +133 -0
  284. localstack/services/kinesis/kinesis_mock_server.py +7 -8
  285. localstack/services/kinesis/models.py +17 -5
  286. localstack/services/kinesis/packages.py +3 -3
  287. localstack/services/kinesis/provider.py +86 -3
  288. localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
  289. localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
  290. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
  291. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
  292. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
  293. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
  294. localstack/services/kms/models.py +21 -18
  295. localstack/services/kms/provider.py +62 -26
  296. localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
  297. localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
  298. localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
  299. localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
  300. localstack/services/kms/utils.py +4 -3
  301. localstack/services/lambda_/api_utils.py +19 -16
  302. localstack/services/lambda_/custom_endpoints.py +2 -2
  303. localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
  304. localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
  305. localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
  306. localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
  307. localstack/services/lambda_/hooks.py +6 -1
  308. localstack/services/lambda_/invocation/assignment.py +1 -2
  309. localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
  310. localstack/services/lambda_/invocation/event_manager.py +1 -1
  311. localstack/services/lambda_/invocation/execution_environment.py +4 -4
  312. localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
  313. localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
  314. localstack/services/lambda_/invocation/lambda_models.py +33 -30
  315. localstack/services/lambda_/invocation/lambda_service.py +12 -5
  316. localstack/services/lambda_/invocation/logs.py +2 -3
  317. localstack/services/lambda_/invocation/runtime_executor.py +3 -3
  318. localstack/services/lambda_/invocation/version_manager.py +31 -8
  319. localstack/services/lambda_/ldm.py +14 -0
  320. localstack/services/lambda_/packages.py +3 -4
  321. localstack/services/lambda_/provider.py +9 -26
  322. localstack/services/lambda_/provider_utils.py +1 -1
  323. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
  324. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
  325. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
  326. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
  327. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
  328. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
  329. localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
  330. localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
  331. localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
  332. localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
  333. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
  334. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
  335. localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
  336. localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
  337. localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
  338. localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
  339. localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
  340. localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
  341. localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
  342. localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
  343. localstack/services/lambda_/runtimes.py +1 -3
  344. localstack/services/lambda_/urlrouter.py +14 -1
  345. localstack/services/logs/models.py +1 -3
  346. localstack/services/logs/provider.py +39 -22
  347. localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
  348. localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
  349. localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
  350. localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
  351. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
  352. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
  353. localstack/services/moto.py +5 -4
  354. localstack/services/opensearch/cluster.py +28 -20
  355. localstack/services/opensearch/cluster_manager.py +13 -14
  356. localstack/services/opensearch/models.py +1 -3
  357. localstack/services/opensearch/packages.py +27 -9
  358. localstack/services/opensearch/provider.py +15 -10
  359. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
  360. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
  361. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
  362. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
  363. localstack/services/opensearch/versions.py +57 -10
  364. localstack/services/plugins.py +37 -32
  365. localstack/services/providers.py +10 -2
  366. localstack/services/redshift/provider.py +0 -21
  367. localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
  368. localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
  369. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
  370. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
  371. localstack/services/route53/models.py +1 -3
  372. localstack/services/route53/provider.py +1 -2
  373. localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
  374. localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
  375. localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
  376. localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
  377. localstack/services/route53resolver/models.py +8 -10
  378. localstack/services/route53resolver/provider.py +12 -12
  379. localstack/services/s3/codec.py +2 -2
  380. localstack/services/s3/constants.py +5 -2
  381. localstack/services/s3/cors.py +8 -8
  382. localstack/services/s3/models.py +73 -73
  383. localstack/services/s3/notifications.py +74 -58
  384. localstack/services/s3/presigned_url.py +41 -59
  385. localstack/services/s3/provider.py +86 -29
  386. localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
  387. localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
  388. localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
  389. localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
  390. localstack/services/s3/storage/core.py +4 -3
  391. localstack/services/s3/storage/ephemeral.py +7 -6
  392. localstack/services/s3/utils.py +51 -31
  393. localstack/services/s3/validation.py +47 -33
  394. localstack/services/s3/website_hosting.py +9 -7
  395. localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
  396. localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
  397. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
  398. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
  399. localstack/services/secretsmanager/provider.py +10 -12
  400. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
  401. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
  402. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
  403. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
  404. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
  405. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
  406. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
  407. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
  408. localstack/services/ses/models.py +8 -1
  409. localstack/services/ses/provider.py +128 -55
  410. localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
  411. localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
  412. localstack/services/sns/constants.py +7 -1
  413. localstack/services/sns/executor.py +9 -2
  414. localstack/services/sns/models.py +25 -25
  415. localstack/services/sns/provider.py +9 -7
  416. localstack/services/sns/publisher.py +37 -23
  417. localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
  418. localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
  419. localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
  420. localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
  421. localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
  422. localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
  423. localstack/services/sns/v2/models.py +167 -0
  424. localstack/services/sns/v2/provider.py +867 -0
  425. localstack/services/sns/v2/utils.py +130 -0
  426. localstack/services/sqs/constants.py +2 -2
  427. localstack/services/sqs/developer_api.py +205 -0
  428. localstack/services/sqs/models.py +71 -36
  429. localstack/services/sqs/provider.py +56 -332
  430. localstack/services/sqs/query_api.py +8 -5
  431. localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
  432. localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
  433. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
  434. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
  435. localstack/services/sqs/utils.py +123 -4
  436. localstack/services/ssm/provider.py +3 -4
  437. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
  438. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
  439. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
  440. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
  441. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
  442. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
  443. localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
  444. localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
  445. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
  446. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
  447. localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
  448. localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
  449. localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
  450. localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
  451. localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
  452. localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
  453. localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
  454. localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
  455. localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
  456. localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
  457. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
  458. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
  459. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
  460. localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
  461. localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
  462. localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
  463. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
  464. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
  465. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
  466. localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
  467. localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
  468. localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
  469. localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
  470. localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
  471. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
  472. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
  473. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
  474. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
  475. localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
  476. localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
  477. localstack/services/stepfunctions/asl/component/program/program.py +9 -9
  478. localstack/services/stepfunctions/asl/component/program/states.py +1 -1
  479. localstack/services/stepfunctions/asl/component/state/state.py +10 -11
  480. localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
  481. localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
  482. localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
  483. localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
  484. localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
  485. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
  486. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
  487. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
  488. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
  489. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
  490. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
  491. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
  492. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
  493. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
  494. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
  495. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
  496. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
  497. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
  498. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
  499. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
  500. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
  501. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
  502. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
  503. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
  504. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
  505. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
  506. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
  507. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
  508. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
  509. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
  510. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
  511. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
  512. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
  513. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
  514. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
  515. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
  516. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
  517. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
  518. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
  519. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
  520. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
  521. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
  522. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
  523. localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
  524. localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
  525. localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
  526. localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
  527. localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
  528. localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
  529. localstack/services/stepfunctions/asl/eval/environment.py +22 -24
  530. localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
  531. localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
  532. localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
  533. localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
  534. localstack/services/stepfunctions/asl/eval/states.py +12 -12
  535. localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
  536. localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
  537. localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
  538. localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
  539. localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
  540. localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
  541. localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
  542. localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
  543. localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
  544. localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
  545. localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
  546. localstack/services/stepfunctions/backend/activity.py +4 -4
  547. localstack/services/stepfunctions/backend/alias.py +8 -8
  548. localstack/services/stepfunctions/backend/execution.py +29 -30
  549. localstack/services/stepfunctions/backend/execution_worker.py +7 -7
  550. localstack/services/stepfunctions/backend/state_machine.py +28 -28
  551. localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
  552. localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
  553. localstack/services/stepfunctions/mocking/mock_config.py +9 -9
  554. localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
  555. localstack/services/stepfunctions/packages.py +14 -5
  556. localstack/services/stepfunctions/provider.py +34 -44
  557. localstack/services/stepfunctions/quotas.py +2 -3
  558. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
  559. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
  560. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
  561. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
  562. localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
  563. localstack/services/stores.py +8 -8
  564. localstack/services/transcribe/packages.py +1 -3
  565. localstack/services/transcribe/provider.py +8 -3
  566. localstack/state/codecs.py +61 -0
  567. localstack/state/core.py +11 -5
  568. localstack/state/inspect.py +4 -4
  569. localstack/state/pickle.py +36 -23
  570. localstack/testing/aws/asf_utils.py +3 -2
  571. localstack/testing/aws/cloudformation_utils.py +1 -1
  572. localstack/testing/aws/lambda_utils.py +15 -14
  573. localstack/testing/aws/util.py +3 -2
  574. localstack/testing/pytest/cloudformation/fixtures.py +68 -18
  575. localstack/testing/pytest/container.py +5 -5
  576. localstack/testing/pytest/filters.py +1 -3
  577. localstack/testing/pytest/fixtures.py +188 -49
  578. localstack/testing/pytest/in_memory_localstack.py +1 -3
  579. localstack/testing/pytest/marking.py +42 -15
  580. localstack/testing/pytest/path_filter.py +1 -1
  581. localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
  582. localstack/testing/pytest/stepfunctions/utils.py +11 -10
  583. localstack/testing/pytest/util.py +1 -1
  584. localstack/testing/pytest/validation_tracking.py +3 -4
  585. localstack/testing/scenario/provisioning.py +11 -10
  586. localstack/testing/snapshots/transformer_utility.py +8 -3
  587. localstack/testing/testselection/matching.py +2 -2
  588. localstack/testing/testselection/opt_out.py +1 -1
  589. localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
  590. localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
  591. localstack/testing/testselection/testselection.py +2 -2
  592. localstack/utils/analytics/cli.py +2 -3
  593. localstack/utils/analytics/client.py +5 -5
  594. localstack/utils/analytics/events.py +2 -2
  595. localstack/utils/analytics/metadata.py +6 -4
  596. localstack/utils/analytics/metrics/counter.py +11 -18
  597. localstack/utils/analytics/metrics/registry.py +2 -2
  598. localstack/utils/analytics/publisher.py +4 -5
  599. localstack/utils/analytics/service_providers.py +19 -0
  600. localstack/utils/analytics/service_request_aggregator.py +4 -4
  601. localstack/utils/archives.py +12 -12
  602. localstack/utils/asyncio.py +2 -2
  603. localstack/utils/aws/arns.py +26 -31
  604. localstack/utils/aws/aws_responses.py +21 -28
  605. localstack/utils/aws/aws_stack.py +7 -12
  606. localstack/utils/aws/dead_letter_queue.py +4 -9
  607. localstack/utils/aws/message_forwarding.py +8 -11
  608. localstack/utils/aws/request_context.py +5 -6
  609. localstack/utils/aws/resources.py +1 -1
  610. localstack/utils/aws/templating.py +4 -4
  611. localstack/utils/batch_policy.py +4 -4
  612. localstack/utils/bootstrap.py +37 -30
  613. localstack/utils/catalog/catalog.py +139 -0
  614. localstack/utils/catalog/catalog_loader.py +119 -0
  615. localstack/utils/catalog/common.py +58 -0
  616. localstack/utils/catalog/plugins.py +28 -0
  617. localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
  618. localstack/utils/collections.py +33 -27
  619. localstack/utils/config_listener.py +2 -2
  620. localstack/utils/container_networking.py +5 -6
  621. localstack/utils/container_utils/container_client.py +156 -160
  622. localstack/utils/container_utils/docker_cmd_client.py +97 -81
  623. localstack/utils/container_utils/docker_sdk_client.py +75 -72
  624. localstack/utils/crypto.py +12 -13
  625. localstack/utils/diagnose.py +11 -12
  626. localstack/utils/docker_utils.py +11 -7
  627. localstack/utils/files.py +34 -15
  628. localstack/utils/functions.py +5 -4
  629. localstack/utils/http.py +14 -14
  630. localstack/utils/iputils.py +2 -1
  631. localstack/utils/json.py +21 -7
  632. localstack/utils/kinesis/kinesis_connector.py +2 -1
  633. localstack/utils/net.py +25 -17
  634. localstack/utils/no_exit_argument_parser.py +2 -2
  635. localstack/utils/numbers.py +9 -2
  636. localstack/utils/objects.py +15 -14
  637. localstack/utils/patch.py +14 -7
  638. localstack/utils/platform.py +2 -2
  639. localstack/utils/run.py +15 -14
  640. localstack/utils/scheduler.py +13 -12
  641. localstack/utils/server/tcp_proxy.py +2 -2
  642. localstack/utils/serving.py +3 -4
  643. localstack/utils/strings.py +15 -16
  644. localstack/utils/sync.py +126 -1
  645. localstack/utils/tagging.py +10 -8
  646. localstack/utils/testutil.py +17 -17
  647. localstack/utils/threads.py +3 -3
  648. localstack/utils/time.py +12 -4
  649. localstack/utils/urls.py +1 -3
  650. localstack/utils/xml.py +1 -1
  651. localstack/utils/xray/traceid.py +1 -1
  652. localstack/version.py +16 -3
  653. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
  654. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
  655. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
  656. localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
  657. localstack/packages/terraform.py +0 -47
  658. localstack/services/cloudformation/deploy.html +0 -144
  659. localstack/services/cloudformation/deploy_ui.py +0 -47
  660. localstack/services/cloudformation/plugins.py +0 -12
  661. localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
  662. localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
  663. localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
  664. localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
  665. localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
  666. /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
  667. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
  668. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
  669. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
  670. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
  671. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
  672. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,7 @@ import tempfile
8
8
  import time
9
9
  import zipfile
10
10
  from subprocess import Popen
11
- from typing import IO, Literal, Optional, Union
11
+ from typing import IO, Literal
12
12
 
13
13
  from localstack.constants import MAVEN_REPO_URL
14
14
  from localstack.utils.files import load_file, mkdir, new_tmp_file, rm_rf, save_file
@@ -22,7 +22,7 @@ from .strings import truncate
22
22
  LOG = logging.getLogger(__name__)
23
23
 
24
24
 
25
- StrPath = Union[str, os.PathLike]
25
+ StrPath = str | os.PathLike
26
26
 
27
27
 
28
28
  def is_zip_file(content):
@@ -30,13 +30,13 @@ def is_zip_file(content):
30
30
  return zipfile.is_zipfile(stream)
31
31
 
32
32
 
33
- def get_unzipped_size(zip_file: Union[str, IO[bytes]]):
33
+ def get_unzipped_size(zip_file: str | IO[bytes]):
34
34
  """Returns the size of the unzipped file."""
35
35
  with zipfile.ZipFile(zip_file, "r") as zip_ref:
36
36
  return sum(f.file_size for f in zip_ref.infolist())
37
37
 
38
38
 
39
- def unzip(path: str, target_dir: str, overwrite: bool = True) -> Optional[Union[str, Popen]]:
39
+ def unzip(path: str, target_dir: str, overwrite: bool = True) -> str | Popen | None:
40
40
  from localstack.utils.platform import is_debian
41
41
 
42
42
  use_native_cmd = is_debian() or is_command_available("unzip")
@@ -99,7 +99,7 @@ def create_zip_file_python(
99
99
  base_dir: StrPath,
100
100
  zip_file: StrPath,
101
101
  mode: Literal["r", "w", "x", "a"] = "w",
102
- content_root: Optional[str] = None,
102
+ content_root: str | None = None,
103
103
  ):
104
104
  with zipfile.ZipFile(zip_file, mode) as zip_file:
105
105
  for root, dirs, files in os.walk(base_dir):
@@ -122,7 +122,7 @@ def add_file_to_jar(class_file, class_url, target_jar, base_dir=None):
122
122
 
123
123
 
124
124
  def update_jar_manifest(
125
- jar_file_name: str, parent_dir: str, search: Union[str, re.Pattern], replace: str
125
+ jar_file_name: str, parent_dir: str, search: str | re.Pattern, replace: str
126
126
  ):
127
127
  manifest_file_path = "META-INF/MANIFEST.MF"
128
128
  jar_path = os.path.join(parent_dir, jar_file_name)
@@ -174,10 +174,10 @@ def upgrade_jar_file(base_dir: str, file_glob: str, maven_asset: str):
174
174
  def download_and_extract(
175
175
  archive_url: str,
176
176
  target_dir: str,
177
- retries: Optional[int] = 0,
178
- sleep: Optional[int] = 3,
179
- tmp_archive: Optional[str] = None,
180
- checksum_url: Optional[str] = None,
177
+ retries: int | None = 0,
178
+ sleep: int | None = 3,
179
+ tmp_archive: str | None = None,
180
+ checksum_url: str | None = None,
181
181
  ) -> None:
182
182
  """
183
183
  Download and extract an archive to a target directory with optional checksum verification.
@@ -233,7 +233,7 @@ def download_and_extract(
233
233
  rm_rf(tmp_archive)
234
234
  raise e
235
235
 
236
- if ext == ".zip":
236
+ if ext in (".zip", ".whl"):
237
237
  unzip(tmp_archive, target_dir)
238
238
  elif ext in (
239
239
  ".bz2",
@@ -250,7 +250,7 @@ def download_and_extract_with_retry(
250
250
  archive_url,
251
251
  tmp_archive,
252
252
  target_dir,
253
- checksum_url: Optional[str] = None,
253
+ checksum_url: str | None = None,
254
254
  ):
255
255
  try:
256
256
  download_and_extract(
@@ -40,12 +40,12 @@ class AdaptiveThreadPool(DaemonAwareThreadPool):
40
40
 
41
41
  def __init__(self, core_size=None):
42
42
  self.core_size = core_size or self.DEFAULT_CORE_POOL_SIZE
43
- super(AdaptiveThreadPool, self).__init__(max_workers=self.core_size)
43
+ super().__init__(max_workers=self.core_size)
44
44
 
45
45
  def submit(self, fn, *args, **kwargs):
46
46
  # if idle threads are available, don't spin new threads
47
47
  if self.has_idle_threads():
48
- return super(AdaptiveThreadPool, self).submit(fn, *args, **kwargs)
48
+ return super().submit(fn, *args, **kwargs)
49
49
 
50
50
  def _run(*tmpargs):
51
51
  return fn(*args, **kwargs)
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import re
3
3
  from functools import cache
4
- from typing import Optional, TypedDict
4
+ from typing import TypedDict
5
5
 
6
6
  from botocore.utils import ArnParser, InvalidArnException
7
7
 
@@ -27,7 +27,7 @@ PARTITION_NAMES = list(REGION_PREFIX_TO_PARTITION.values()) + [DEFAULT_PARTITION
27
27
  ARN_PARTITION_REGEX = r"^arn:(" + "|".join(sorted(PARTITION_NAMES)) + ")"
28
28
 
29
29
 
30
- def get_partition(region: Optional[str]) -> str:
30
+ def get_partition(region: str | None) -> str:
31
31
  if not region:
32
32
  return DEFAULT_PARTITION
33
33
  if region in PARTITION_NAMES:
@@ -65,28 +65,28 @@ def parse_arn(arn: str) -> ArnData:
65
65
  return _arn_parser.parse_arn(arn)
66
66
 
67
67
 
68
- def extract_account_id_from_arn(arn: str) -> Optional[str]:
68
+ def extract_account_id_from_arn(arn: str) -> str | None:
69
69
  try:
70
70
  return parse_arn(arn).get("account")
71
71
  except InvalidArnException:
72
72
  return None
73
73
 
74
74
 
75
- def extract_region_from_arn(arn: str) -> Optional[str]:
75
+ def extract_region_from_arn(arn: str) -> str | None:
76
76
  try:
77
77
  return parse_arn(arn).get("region")
78
78
  except InvalidArnException:
79
79
  return None
80
80
 
81
81
 
82
- def extract_service_from_arn(arn: str) -> Optional[str]:
82
+ def extract_service_from_arn(arn: str) -> str | None:
83
83
  try:
84
84
  return parse_arn(arn).get("service")
85
85
  except InvalidArnException:
86
86
  return None
87
87
 
88
88
 
89
- def extract_resource_from_arn(arn: str) -> Optional[str]:
89
+ def extract_resource_from_arn(arn: str) -> str | None:
90
90
  try:
91
91
  return parse_arn(arn).get("resource")
92
92
  except InvalidArnException:
@@ -98,8 +98,10 @@ def extract_resource_from_arn(arn: str) -> Optional[str]:
98
98
  #
99
99
 
100
100
 
101
- def _resource_arn(name: str, pattern: str, account_id: str, region_name: str) -> str:
102
- if ":" in name:
101
+ def _resource_arn(
102
+ name: str, pattern: str, account_id: str, region_name: str, allow_colons=False
103
+ ) -> str:
104
+ if ":" in name and not allow_colons:
103
105
  return name
104
106
  if len(pattern.split("%s")) == 4:
105
107
  return pattern % (get_partition(region_name), account_id, name)
@@ -120,7 +122,7 @@ def iam_role_arn(role_name: str, account_id: str, region_name: str) -> str:
120
122
  return role_name
121
123
  if re.match(f"{ARN_PARTITION_REGEX}:iam::", role_name):
122
124
  return role_name
123
- return "arn:%s:iam::%s:role/%s" % (get_partition(region_name), account_id, role_name)
125
+ return f"arn:{get_partition(region_name)}:iam::{account_id}:role/{role_name}"
124
126
 
125
127
 
126
128
  def iam_resource_arn(resource: str, account_id: str, role: str = None) -> str:
@@ -155,14 +157,14 @@ def secretsmanager_secret_arn(
155
157
  def cloudformation_stack_arn(
156
158
  stack_name: str, stack_id: str, account_id: str, region_name: str
157
159
  ) -> str:
158
- pattern = "arn:%s:cloudformation:%s:%s:stack/%s/{stack_id}".format(stack_id=stack_id)
160
+ pattern = f"arn:%s:cloudformation:%s:%s:stack/%s/{stack_id}"
159
161
  return _resource_arn(stack_name, pattern, account_id=account_id, region_name=region_name)
160
162
 
161
163
 
162
164
  def cloudformation_change_set_arn(
163
165
  change_set_name: str, change_set_id: str, account_id: str, region_name: str
164
166
  ) -> str:
165
- pattern = "arn:%s:cloudformation:%s:%s:changeSet/%s/{cs_id}".format(cs_id=change_set_id)
167
+ pattern = f"arn:%s:cloudformation:%s:%s:changeSet/%s/{change_set_id}"
166
168
  return _resource_arn(change_set_name, pattern, account_id=account_id, region_name=region_name)
167
169
 
168
170
 
@@ -180,13 +182,7 @@ def dynamodb_table_arn(table_name: str, account_id: str, region_name: str) -> st
180
182
  def dynamodb_stream_arn(
181
183
  table_name: str, latest_stream_label: str, account_id: str, region_name: str
182
184
  ) -> str:
183
- return "arn:%s:dynamodb:%s:%s:table/%s/stream/%s" % (
184
- get_partition(region_name),
185
- region_name,
186
- account_id,
187
- table_name,
188
- latest_stream_label,
189
- )
185
+ return f"arn:{get_partition(region_name)}:dynamodb:{region_name}:{account_id}:table/{table_name}/stream/{latest_stream_label}"
190
186
 
191
187
 
192
188
  #
@@ -291,7 +287,7 @@ def lambda_event_source_mapping_arn(uuid: str, account_id: str, region_name: str
291
287
  def lambda_function_or_layer_arn(
292
288
  type: str,
293
289
  entity_name: str,
294
- version: Optional[str],
290
+ version: str | None,
295
291
  account_id: str,
296
292
  region_name: str,
297
293
  ) -> str:
@@ -453,7 +449,7 @@ def s3_bucket_arn(bucket_name_or_arn: str, region="us-east-1") -> str:
453
449
 
454
450
  def sqs_queue_arn(queue_name: str, account_id: str, region_name: str) -> str:
455
451
  queue_name = queue_name.split("/")[-1]
456
- return "arn:%s:sqs:%s:%s:%s" % (get_partition(region_name), region_name, account_id, queue_name)
452
+ return f"arn:{get_partition(region_name)}:sqs:{region_name}:{account_id}:{queue_name}"
457
453
 
458
454
 
459
455
  #
@@ -462,20 +458,13 @@ def sqs_queue_arn(queue_name: str, account_id: str, region_name: str) -> str:
462
458
 
463
459
 
464
460
  def apigateway_restapi_arn(api_id: str, account_id: str, region_name: str) -> str:
465
- return "arn:%s:apigateway:%s:%s:/restapis/%s" % (
466
- get_partition(region_name),
467
- region_name,
468
- account_id,
469
- api_id,
461
+ return (
462
+ f"arn:{get_partition(region_name)}:apigateway:{region_name}:{account_id}:/restapis/{api_id}"
470
463
  )
471
464
 
472
465
 
473
466
  def apigateway_invocations_arn(lambda_uri: str, region_name: str) -> str:
474
- return "arn:%s:apigateway:%s:lambda:path/2015-03-31/functions/%s/invocations" % (
475
- get_partition(region_name),
476
- region_name,
477
- lambda_uri,
478
- )
467
+ return f"arn:{get_partition(region_name)}:apigateway:{region_name}:lambda:path/2015-03-31/functions/{lambda_uri}/invocations"
479
468
 
480
469
 
481
470
  #
@@ -487,6 +476,12 @@ def sns_topic_arn(topic_name: str, account_id: str, region_name: str) -> str:
487
476
  return f"arn:{get_partition(region_name)}:sns:{region_name}:{account_id}:{topic_name}"
488
477
 
489
478
 
479
+ def sns_platform_application_arn(
480
+ platform_application_name: str, platform: str, account_id: str, region_name: str
481
+ ) -> str:
482
+ return f"arn:{get_partition(region_name)}:sns:{region_name}:{account_id}:app/{platform}/{platform_application_name}"
483
+
484
+
490
485
  #
491
486
  # ECR
492
487
  #
@@ -555,7 +550,7 @@ def lambda_function_name(name_or_arn: str) -> str:
555
550
  if ":" in name_or_arn:
556
551
  arn = parse_arn(name_or_arn)
557
552
  if arn["service"] != "lambda":
558
- raise ValueError("arn is not a lambda arn %s" % name_or_arn)
553
+ raise ValueError(f"arn is not a lambda arn {name_or_arn}")
559
554
 
560
555
  return parse_arn(name_or_arn)["resource"].split(":")[1]
561
556
  else:
@@ -3,7 +3,7 @@ import datetime
3
3
  import json
4
4
  import re
5
5
  from binascii import crc32
6
- from typing import Any, Dict, Optional, Union
6
+ from typing import Any
7
7
  from urllib.parse import parse_qs
8
8
 
9
9
  import xmltodict
@@ -36,21 +36,19 @@ def requests_error_response_json(message, code=500, error_type="InternalFailure"
36
36
 
37
37
  def requests_error_response_xml(
38
38
  message: str,
39
- code: Optional[int] = 400,
40
- code_string: Optional[str] = "InvalidParameter",
41
- service: Optional[str] = None,
42
- xmlns: Optional[str] = None,
39
+ code: int | None = 400,
40
+ code_string: str | None = "InvalidParameter",
41
+ service: str | None = None,
42
+ xmlns: str | None = None,
43
43
  ):
44
44
  response = RequestsResponse()
45
- xmlns = xmlns or "http://%s.amazonaws.com/doc/2010-03-31/" % service
46
- response._content = """<ErrorResponse xmlns="{xmlns}"><Error>
45
+ xmlns = xmlns or f"http://{service}.amazonaws.com/doc/2010-03-31/"
46
+ response._content = f"""<ErrorResponse xmlns="{xmlns}"><Error>
47
47
  <Type>Sender</Type>
48
48
  <Code>{code_string}</Code>
49
49
  <Message>{message}</Message>
50
- </Error><RequestId>{req_id}</RequestId>
51
- </ErrorResponse>""".format(
52
- xmlns=xmlns, message=message, code_string=code_string, req_id=short_uid()
53
- )
50
+ </Error><RequestId>{short_uid()}</RequestId>
51
+ </ErrorResponse>"""
54
52
  response.status_code = code
55
53
  return response
56
54
 
@@ -65,18 +63,13 @@ def requests_error_response_xml_signature_calculation(
65
63
  aws_access_token="temp",
66
64
  ):
67
65
  response = RequestsResponse()
68
- response_template = """<?xml version="1.0" encoding="UTF-8"?>
66
+ response_template = f"""<?xml version="1.0" encoding="UTF-8"?>
69
67
  <Error>
70
68
  <Code>{code_string}</Code>
71
69
  <Message>{message}</Message>
72
- <RequestId>{req_id}</RequestId>
73
- <HostId>{host_id}</HostId>
74
- </Error>""".format(
75
- message=message,
76
- code_string=code_string,
77
- req_id=short_uid(),
78
- host_id=short_uid(),
79
- )
70
+ <RequestId>{short_uid()}</RequestId>
71
+ <HostId>{short_uid()}</HostId>
72
+ </Error>"""
80
73
 
81
74
  parsed_response = xmltodict.parse(response_template)
82
75
  response.status_code = code
@@ -94,8 +87,8 @@ def requests_error_response_xml_signature_calculation(
94
87
  server_time = datetime.datetime.utcnow().isoformat()[:-4]
95
88
  expires_isoformat = datetime.datetime.fromtimestamp(int(expires)).isoformat()[:-4]
96
89
  parsed_response["Error"]["Code"] = code_string
97
- parsed_response["Error"]["Expires"] = "{}Z".format(expires_isoformat)
98
- parsed_response["Error"]["ServerTime"] = "{}Z".format(server_time)
90
+ parsed_response["Error"]["Expires"] = f"{expires_isoformat}Z"
91
+ parsed_response["Error"]["ServerTime"] = f"{server_time}Z"
99
92
  set_response_content(response, xmltodict.unparse(parsed_response))
100
93
 
101
94
  if not signature and not expires and code_string == "AccessDenied":
@@ -106,8 +99,8 @@ def requests_error_response_xml_signature_calculation(
106
99
 
107
100
 
108
101
  def requests_error_response(
109
- req_headers: Dict,
110
- message: Union[str, bytes],
102
+ req_headers: dict,
103
+ message: str | bytes,
111
104
  code: int = 500,
112
105
  error_type: str = "InternalFailure",
113
106
  service: str = None,
@@ -121,7 +114,7 @@ def requests_error_response(
121
114
  )
122
115
 
123
116
 
124
- def is_json_request(req_headers: Dict) -> bool:
117
+ def is_json_request(req_headers: dict) -> bool:
125
118
  ctype = req_headers.get("Content-Type", "")
126
119
  accept = req_headers.get("Accept", "")
127
120
  return "json" in ctype or "json" in accept
@@ -186,7 +179,7 @@ def set_response_content(response, content, headers=None):
186
179
  response.headers["Content-Length"] = str(len(response._content))
187
180
 
188
181
 
189
- def create_sqs_system_attributes(headers: Dict[str, str]) -> Dict[str, Any]:
182
+ def create_sqs_system_attributes(headers: dict[str, str]) -> dict[str, Any]:
190
183
  system_attributes = {}
191
184
  if "X-Amzn-Trace-Id" in headers:
192
185
  system_attributes["AWSTraceHeader"] = {
@@ -196,7 +189,7 @@ def create_sqs_system_attributes(headers: Dict[str, str]) -> Dict[str, Any]:
196
189
  return system_attributes
197
190
 
198
191
 
199
- def parse_query_string(url_or_qs: str, multi_values=False) -> Dict[str, str]:
192
+ def parse_query_string(url_or_qs: str, multi_values=False) -> dict[str, str]:
200
193
  url_or_qs = str(url_or_qs or "").strip()
201
194
  # we match if the `url_or_qs` passed is maybe a URL
202
195
  if regex_url_start.match(url_or_qs) and "?" not in url_or_qs:
@@ -208,7 +201,7 @@ def parse_query_string(url_or_qs: str, multi_values=False) -> Dict[str, str]:
208
201
  return result
209
202
 
210
203
 
211
- def calculate_crc32(content: Union[str, bytes]) -> int:
204
+ def calculate_crc32(content: str | bytes) -> int:
212
205
  return crc32(to_bytes(content)) & 0xFFFFFFFF
213
206
 
214
207
 
@@ -2,7 +2,6 @@ import logging
2
2
  import re
3
3
  import socket
4
4
  from functools import lru_cache
5
- from typing import List, Union
6
5
 
7
6
  import boto3
8
7
 
@@ -20,7 +19,7 @@ LOG = logging.getLogger(__name__)
20
19
  CACHE_S3_HOSTNAME_DNS_STATUS = None
21
20
 
22
21
 
23
- @lru_cache()
22
+ @lru_cache
24
23
  def get_valid_regions():
25
24
  session = boto3.Session()
26
25
  valid_regions = set()
@@ -32,7 +31,7 @@ def get_valid_regions():
32
31
 
33
32
  # FIXME: AWS recommends use of SSM parameter store to determine per region availability
34
33
  # https://github.com/aws/aws-sdk/issues/206#issuecomment-1471354853
35
- @lru_cache()
34
+ @lru_cache
36
35
  def get_valid_regions_for_service(service_name):
37
36
  session = boto3.Session()
38
37
  regions = list(session.get_available_regions(service_name))
@@ -46,7 +45,7 @@ def get_boto3_region() -> str:
46
45
  return boto3.session.Session().region_name
47
46
 
48
47
 
49
- def get_local_service_url(service_name_or_port: Union[str, int]) -> str:
48
+ def get_local_service_url(service_name_or_port: str | int) -> str:
50
49
  """Return the local service URL for the given service name or port."""
51
50
  # TODO(srw): we don't need to differentiate on service name any more, so remove the argument
52
51
  if isinstance(service_name_or_port, int):
@@ -60,7 +59,7 @@ def get_s3_hostname():
60
59
  try:
61
60
  assert socket.gethostbyname(S3_VIRTUAL_HOSTNAME)
62
61
  CACHE_S3_HOSTNAME_DNS_STATUS = True
63
- except socket.error:
62
+ except OSError:
64
63
  CACHE_S3_HOSTNAME_DNS_STATUS = False
65
64
  if CACHE_S3_HOSTNAME_DNS_STATUS:
66
65
  return S3_VIRTUAL_HOSTNAME
@@ -68,7 +67,7 @@ def get_s3_hostname():
68
67
 
69
68
 
70
69
  def fix_account_id_in_arns(
71
- response, replacement: str, colon_delimiter: str = ":", existing: Union[str, List[str]] = None
70
+ response, replacement: str, colon_delimiter: str = ":", existing: str | list[str] = None
72
71
  ):
73
72
  """Fix the account ID in the ARNs returned in the given Flask response or string"""
74
73
  from moto.core import DEFAULT_ACCOUNT_ID
@@ -78,13 +77,9 @@ def fix_account_id_in_arns(
78
77
  is_str_obj = is_string_or_bytes(response)
79
78
  content = to_str(response if is_str_obj else response._content)
80
79
 
81
- replacement = r"arn{col}aws{col}\1{col}\2{col}{acc}{col}".format(
82
- col=colon_delimiter, acc=replacement
83
- )
80
+ replacement = rf"arn{colon_delimiter}aws{colon_delimiter}\1{colon_delimiter}\2{colon_delimiter}{replacement}{colon_delimiter}"
84
81
  for acc_id in existing:
85
- regex = r"arn{col}aws{col}([^:%]+){col}([^:%]*){col}{acc}{col}".format(
86
- col=colon_delimiter, acc=acc_id
87
- )
82
+ regex = rf"arn{colon_delimiter}aws{colon_delimiter}([^:%]+){colon_delimiter}([^:%]*){colon_delimiter}{acc_id}{colon_delimiter}"
88
83
  content = re.sub(regex, replacement, content)
89
84
 
90
85
  if not is_str_obj:
@@ -1,7 +1,6 @@
1
1
  import json
2
2
  import logging
3
3
  import uuid
4
- from typing import Dict, List
5
4
 
6
5
  from localstack.aws.connect import connect_to
7
6
  from localstack.utils.aws import arns
@@ -34,7 +33,7 @@ def sns_error_to_dead_letter_queue(
34
33
  return _send_to_dead_letter_queue(sns_subscriber["SubscriptionArn"], target_arn, event, error)
35
34
 
36
35
 
37
- def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: Dict, error, role: str = None):
36
+ def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: dict, error, role: str = None):
38
37
  if not dlq_arn:
39
38
  return
40
39
  LOG.info("Sending failed execution %s to dead letter queue %s", source_arn, dlq_arn)
@@ -60,11 +59,7 @@ def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: Dict, error
60
59
  except Exception as e:
61
60
  error = e
62
61
  if error or not result_code or result_code >= 400:
63
- msg = "Unable to send message to dead letter queue %s (code %s): %s" % (
64
- queue_url,
65
- result_code,
66
- error,
67
- )
62
+ msg = f"Unable to send message to dead letter queue {queue_url} (code {result_code}): {error}"
68
63
  if "InvalidMessageContents" in str(error):
69
64
  msg += f" - messages: {messages}"
70
65
  LOG.info(msg)
@@ -84,7 +79,7 @@ def _send_to_dead_letter_queue(source_arn: str, dlq_arn: str, event: Dict, error
84
79
  return dlq_arn
85
80
 
86
81
 
87
- def _prepare_messages_to_dlq(source_arn: str, event: Dict, error) -> List[Dict]:
82
+ def _prepare_messages_to_dlq(source_arn: str, event: dict, error) -> list[dict]:
88
83
  messages = []
89
84
  custom_attrs = {
90
85
  "RequestID": {"DataType": "String", "StringValue": str(uuid.uuid4())},
@@ -136,7 +131,7 @@ def _prepare_messages_to_dlq(source_arn: str, event: Dict, error) -> List[Dict]:
136
131
  return messages
137
132
 
138
133
 
139
- def message_attributes_to_upper(message_attrs: Dict) -> Dict:
134
+ def message_attributes_to_upper(message_attrs: dict) -> dict:
140
135
  """Convert message attribute details (first characters) to upper case (e.g., StringValue, DataType)."""
141
136
  message_attrs = message_attrs or {}
142
137
  for _, attr in message_attrs.items():
@@ -3,7 +3,6 @@ import json
3
3
  import logging
4
4
  import re
5
5
  import uuid
6
- from typing import Dict, Optional
7
6
 
8
7
  from moto.events.models import events_backends
9
8
 
@@ -31,10 +30,10 @@ AUTH_OAUTH = "OAUTH_CLIENT_CREDENTIALS"
31
30
  # TODO: refactor/split this. too much here is service specific
32
31
  def send_event_to_target(
33
32
  target_arn: str,
34
- event: Dict,
35
- target_attributes: Dict = None,
33
+ event: dict,
34
+ target_attributes: dict = None,
36
35
  asynchronous: bool = True,
37
- target: Dict = None,
36
+ target: dict = None,
38
37
  role: str = None,
39
38
  source_arn: str = None,
40
39
  source_service: str = None,
@@ -155,7 +154,7 @@ def send_event_to_target(
155
154
  LOG.warning('Unsupported Events rule target ARN: "%s"', target_arn)
156
155
 
157
156
 
158
- def auth_keys_from_connection(connection: Dict):
157
+ def auth_keys_from_connection(connection: dict):
159
158
  headers = {}
160
159
 
161
160
  auth_type = connection.get("AuthorizationType").upper()
@@ -164,9 +163,7 @@ def auth_keys_from_connection(connection: Dict):
164
163
  basic_auth_parameters = auth_parameters.get("BasicAuthParameters", {})
165
164
  username = basic_auth_parameters.get("Username", "")
166
165
  password = basic_auth_parameters.get("Password", "")
167
- auth = "Basic " + to_str(
168
- base64.b64encode("{}:{}".format(username, password).encode("ascii"))
169
- )
166
+ auth = "Basic " + to_str(base64.b64encode(f"{username}:{password}".encode("ascii")))
170
167
  headers.update({"authorization": auth})
171
168
 
172
169
  if auth_type == AUTH_API_KEY:
@@ -206,7 +203,7 @@ def auth_keys_from_connection(connection: Dict):
206
203
 
207
204
  token_type = oauth_data.get("token_type", "")
208
205
  access_token = oauth_data.get("access_token", "")
209
- auth_header = "{} {}".format(token_type, access_token)
206
+ auth_header = f"{token_type} {access_token}"
210
207
  headers.update({"authorization": auth_header})
211
208
 
212
209
  return headers
@@ -216,7 +213,7 @@ def list_of_parameters_to_object(items):
216
213
  return {item.get("Key"): item.get("Value") for item in items}
217
214
 
218
215
 
219
- def send_event_to_api_destination(target_arn, event, http_parameters: Optional[Dict] = None):
216
+ def send_event_to_api_destination(target_arn, event, http_parameters: dict | None = None):
220
217
  """Send an event to an EventBridge API destination
221
218
  See https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-api-destinations.html"""
222
219
 
@@ -291,7 +288,7 @@ def add_api_destination_authorization(destination, headers, event):
291
288
  return endpoint
292
289
 
293
290
 
294
- def add_target_http_parameters(http_parameters: Dict, endpoint: str, headers: Dict, body):
291
+ def add_target_http_parameters(http_parameters: dict, endpoint: str, headers: dict, body):
295
292
  endpoint = add_path_parameters_to_url(endpoint, http_parameters.get("PathParameterValues", []))
296
293
 
297
294
  # The request should prioritze connection header/query parameters over target params if there is an overlap
@@ -4,7 +4,6 @@ This module has utilities relating to creating/parsing AWS requests.
4
4
 
5
5
  import logging
6
6
  import re
7
- from typing import Dict, Optional
8
7
 
9
8
  from rolo import Request as RoloRequest
10
9
 
@@ -30,7 +29,7 @@ def get_account_id_from_request(request: RoloRequest) -> str:
30
29
  return get_account_id_from_access_key_id(access_key_id)
31
30
 
32
31
 
33
- def extract_region_from_auth_header(headers) -> Optional[str]:
32
+ def extract_region_from_auth_header(headers) -> str | None:
34
33
  auth = headers.get("Authorization") or ""
35
34
  region = re.sub(r".*Credential=[^/]+/[^/]+/([^/]+)/.*", r"\1", auth)
36
35
  if region == auth:
@@ -38,12 +37,12 @@ def extract_region_from_auth_header(headers) -> Optional[str]:
38
37
  return region
39
38
 
40
39
 
41
- def extract_account_id_from_auth_header(headers) -> Optional[str]:
40
+ def extract_account_id_from_auth_header(headers) -> str | None:
42
41
  if access_key_id := extract_access_key_id_from_auth_header(headers):
43
42
  return get_account_id_from_access_key_id(access_key_id)
44
43
 
45
44
 
46
- def extract_access_key_id_from_auth_header(headers: Dict[str, str]) -> Optional[str]:
45
+ def extract_access_key_id_from_auth_header(headers: dict[str, str]) -> str | None:
47
46
  auth = headers.get("Authorization") or ""
48
47
 
49
48
  if auth.startswith("AWS4-"):
@@ -67,7 +66,7 @@ def extract_region_from_headers(headers) -> str:
67
66
  return extract_region_from_auth_header(headers) or AWS_REGION_US_EAST_1
68
67
 
69
68
 
70
- def extract_service_name_from_auth_header(headers: Dict) -> Optional[str]:
69
+ def extract_service_name_from_auth_header(headers: dict) -> str | None:
71
70
  try:
72
71
  auth_header = headers.get("authorization", "")
73
72
  credential_scope = auth_header.split(",")[0].split()[1]
@@ -79,7 +78,7 @@ def extract_service_name_from_auth_header(headers: Dict) -> Optional[str]:
79
78
 
80
79
  def mock_aws_request_headers(
81
80
  service: str, aws_access_key_id: str, region_name: str, internal: bool = False
82
- ) -> Dict[str, str]:
81
+ ) -> dict[str, str]:
83
82
  """
84
83
  Returns a mock set of headers that resemble SigV4 signing method.
85
84
  """
@@ -86,7 +86,7 @@ def create_api_gateway(
86
86
  resources = resources or []
87
87
  stage_name = stage_name or "testing"
88
88
  usage_plan_name = usage_plan_name or "Basic Usage"
89
- description = description or 'Test description for API "%s"' % name
89
+ description = description or f'Test description for API "{name}"'
90
90
 
91
91
  LOG.info('Creating API resources under API Gateway "%s".', name)
92
92
  api = client.create_rest_api(name=name, description=description)
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  import re
3
- from typing import Any, Dict
3
+ from typing import Any
4
4
 
5
5
  import airspeed
6
6
 
@@ -44,7 +44,7 @@ class VelocityUtil:
44
44
  class VtlTemplate:
45
45
  """Utility class for rendering Velocity templates"""
46
46
 
47
- def render_vtl(self, template: str, variables: Dict, as_json=False) -> str | dict:
47
+ def render_vtl(self, template: str, variables: dict, as_json=False) -> str | dict:
48
48
  """
49
49
  Render the given VTL template against the dict of variables. Note that this is a
50
50
  potentially mutating operation which may change the values of `variables` in-place.
@@ -66,7 +66,7 @@ class VtlTemplate:
66
66
  empty_placeholder = " __pLaCe-HoLdEr__ "
67
67
  template = re.sub(
68
68
  r"([^\s]+)#\$({)?(.*)",
69
- r"\1#%s$\2\3" % empty_placeholder,
69
+ rf"\1#{empty_placeholder}$\2\3",
70
70
  template,
71
71
  count=re.MULTILINE,
72
72
  )
@@ -125,7 +125,7 @@ class VtlTemplate:
125
125
  rendered_template = json.loads(rendered_template)
126
126
  return rendered_template
127
127
 
128
- def prepare_namespace(self, variables: Dict[str, Any], source: str = "") -> Dict:
128
+ def prepare_namespace(self, variables: dict[str, Any], source: str = "") -> dict:
129
129
  namespace = dict(variables or {})
130
130
  namespace.setdefault("context", {})
131
131
  if not namespace.get("util"):