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
localstack/dns/server.py CHANGED
@@ -5,12 +5,13 @@ import os
5
5
  import re
6
6
  import textwrap
7
7
  import threading
8
+ from collections.abc import Iterable
8
9
  from datetime import datetime
9
10
  from functools import cache
10
11
  from ipaddress import IPv4Address, IPv4Interface
11
12
  from pathlib import Path
12
13
  from socket import AddressFamily
13
- from typing import Iterable, Literal, Tuple
14
+ from typing import Literal
14
15
 
15
16
  import psutil
16
17
  from cachetools import TTLCache, cached
@@ -90,7 +91,7 @@ THREAD_LOCAL = threading.local()
90
91
 
91
92
  # Type of the value given by DNSHandler.client_address
92
93
  # in the form (ip, port) e.g. ("127.0.0.1", 58291)
93
- ClientAddress = Tuple[str, int]
94
+ ClientAddress = tuple[str, int]
94
95
 
95
96
  psutil_cache = TTLCache(maxsize=100, ttl=10)
96
97
 
@@ -253,7 +254,7 @@ class NonLoggingHandler(DNSHandler):
253
254
  THREAD_LOCAL.client_address = self.client_address
254
255
  THREAD_LOCAL.server = self.server
255
256
  THREAD_LOCAL.request = self.request
256
- return super(NonLoggingHandler, self).handle(*args, **kwargs)
257
+ return super().handle(*args, **kwargs)
257
258
  except Exception:
258
259
  pass
259
260
 
@@ -444,13 +445,22 @@ class Resolver(DnsServerProtocol):
444
445
  return True
445
446
  return False
446
447
 
448
+ def _find_matching_aliases(self, question: DNSQuestion) -> list[AliasTarget] | None:
449
+ """
450
+ Find aliases matching the question, supporting wildcards.
451
+ """
452
+ qlabel = DNSLabel(to_bytes(question.qname))
453
+ qtype = RecordType[QTYPE[question.qtype]]
454
+ for (label, rtype), targets in self.aliases.items():
455
+ if rtype == qtype and qlabel.matchWildcard(label):
456
+ return targets
457
+ return None
458
+
447
459
  def _resolve_alias(
448
460
  self, request: DNSRecord, reply: DNSRecord, client_address: ClientAddress
449
461
  ) -> bool:
450
462
  if request.q.qtype in (QTYPE.A, QTYPE.AAAA, QTYPE.CNAME):
451
- key = (DNSLabel(to_bytes(request.q.qname)), RecordType[QTYPE[request.q.qtype]])
452
- # check if we have aliases defined for our given qname/qtype pair
453
- if aliases := self.aliases.get(key):
463
+ if aliases := self._find_matching_aliases(request.q):
454
464
  for alias in aliases:
455
465
  # if there is no health check, or the healthcheck is successful, we will consider this alias
456
466
  # take the first alias passing this check
@@ -1,5 +1,4 @@
1
1
  from json import JSONEncoder
2
- from typing import Type
3
2
 
4
3
  from rolo.routing.handler import Handler, ResultValue
5
4
  from rolo.routing.handler import handler_dispatcher as _handler_dispatcher
@@ -14,7 +13,7 @@ __all__ = [
14
13
  ]
15
14
 
16
15
 
17
- def handler_dispatcher(json_encoder: Type[JSONEncoder] = None) -> Dispatcher[Handler]:
16
+ def handler_dispatcher(json_encoder: type[JSONEncoder] = None) -> Dispatcher[Handler]:
18
17
  """
19
18
  Replacement for ``rolo.dispatcher.handler_dispatcher`` that uses by default LocalStack's CustomEncoder for
20
19
  serializing JSON documents.
@@ -1,5 +1,5 @@
1
1
  from json import JSONEncoder
2
- from typing import Any, Type
2
+ from typing import Any
3
3
 
4
4
  from rolo import Response as RoloResponse
5
5
 
@@ -11,7 +11,7 @@ class Response(RoloResponse):
11
11
  An HTTP Response object, which simply extends werkzeug's Response object with a few convenience methods.
12
12
  """
13
13
 
14
- def set_json(self, doc: Any, cls: Type[JSONEncoder] = CustomEncoder):
14
+ def set_json(self, doc: Any, cls: type[JSONEncoder] = CustomEncoder):
15
15
  """
16
16
  Serializes the given dictionary using localstack's ``CustomEncoder`` into a json response, and sets the
17
17
  mimetype automatically to ``application/json``.
localstack/http/router.py CHANGED
@@ -1,6 +1,6 @@
1
+ from collections.abc import Mapping
1
2
  from typing import (
2
3
  Any,
3
- Mapping,
4
4
  TypeVar,
5
5
  )
6
6
 
localstack/http/trace.py CHANGED
@@ -2,7 +2,8 @@ import dataclasses
2
2
  import inspect
3
3
  import logging
4
4
  import time
5
- from typing import Any, Callable
5
+ from collections.abc import Callable
6
+ from typing import Any
6
7
 
7
8
  from rolo import Response
8
9
  from rolo.gateway import ExceptionHandler, Handler, HandlerChain, RequestContext
@@ -3,7 +3,7 @@
3
3
  import logging
4
4
  import re
5
5
  from functools import lru_cache
6
- from typing import Any, Dict
6
+ from typing import Any
7
7
 
8
8
  from localstack.utils.numbers import format_bytes
9
9
  from localstack.utils.strings import to_bytes
@@ -32,7 +32,7 @@ class DefaultFormatter(logging.Formatter):
32
32
  """
33
33
 
34
34
  def __init__(self, fmt=LOG_FORMAT, datefmt=LOG_DATE_FORMAT):
35
- super(DefaultFormatter, self).__init__(fmt=fmt, datefmt=datefmt)
35
+ super().__init__(fmt=fmt, datefmt=datefmt)
36
36
 
37
37
 
38
38
  class AddFormattedAttributes(logging.Filter):
@@ -48,7 +48,7 @@ class AddFormattedAttributes(logging.Filter):
48
48
  max_thread_len: int
49
49
 
50
50
  def __init__(self, max_name_len: int = None, max_thread_len: int = None):
51
- super(AddFormattedAttributes, self).__init__()
51
+ super().__init__()
52
52
  self.max_name_len = max_name_len if max_name_len else MAX_NAME_LEN
53
53
  self.max_thread_len = max_thread_len if max_thread_len else MAX_THREAD_NAME_LEN
54
54
 
@@ -75,7 +75,7 @@ class MaskSensitiveInputFilter(logging.Filter):
75
75
  patterns: list[tuple[re.Pattern[bytes], bytes]]
76
76
 
77
77
  def __init__(self, sensitive_keys: list[str]):
78
- super(MaskSensitiveInputFilter, self).__init__()
78
+ super().__init__()
79
79
 
80
80
  self.patterns = [
81
81
  (re.compile(to_bytes(rf'"{key}":\s*"[^"]+"')), to_bytes(f'"{key}": "******"'))
@@ -173,8 +173,8 @@ class AwsTraceLoggingFormatter(TraceLoggingFormatter):
173
173
  def __init__(self):
174
174
  super().__init__()
175
175
 
176
- def _copy_service_dict(self, service_dict: Dict) -> Dict:
177
- if not isinstance(service_dict, Dict):
176
+ def _copy_service_dict(self, service_dict: dict) -> dict:
177
+ if not isinstance(service_dict, dict):
178
178
  return service_dict
179
179
  result = {}
180
180
  for key, value in service_dict.items():
@@ -3,10 +3,11 @@ import functools
3
3
  import logging
4
4
  import os
5
5
  from collections import defaultdict
6
+ from collections.abc import Callable
6
7
  from enum import Enum
7
8
  from inspect import getmodule
8
- from threading import RLock
9
- from typing import Any, Callable, Generic, List, Optional, ParamSpec, TypeVar
9
+ from threading import Lock, RLock
10
+ from typing import Any, Generic, ParamSpec, TypeVar
10
11
 
11
12
  from plux import Plugin, PluginManager, PluginSpec # type: ignore
12
13
 
@@ -56,7 +57,7 @@ class PackageInstaller(abc.ABC):
56
57
  multiple versions).
57
58
  """
58
59
 
59
- def __init__(self, name: str, version: str, install_lock: Optional[RLock] = None):
60
+ def __init__(self, name: str, version: str, install_lock: Lock | None = None):
60
61
  """
61
62
  :param name: technical package name, f.e. "opensearch"
62
63
  :param version: version of the package to install
@@ -70,7 +71,7 @@ class PackageInstaller(abc.ABC):
70
71
  self.install_lock = install_lock or RLock()
71
72
  self._setup_for_target: dict[InstallTarget, bool] = defaultdict(lambda: False)
72
73
 
73
- def install(self, target: Optional[InstallTarget] = None) -> None:
74
+ def install(self, target: InstallTarget | None = None) -> None:
74
75
  """
75
76
  Performs the package installation.
76
77
 
@@ -210,7 +211,7 @@ class Package(abc.ABC, Generic[T]):
210
211
  """
211
212
  return self.get_installer(version).get_installed_dir()
212
213
 
213
- def install(self, version: str | None = None, target: Optional[InstallTarget] = None) -> None:
214
+ def install(self, version: str | None = None, target: InstallTarget | None = None) -> None:
214
215
  """
215
216
  Installs the package in the given version in the preferred target location.
216
217
  :param version: version of the package to install. If None, the default version of the package will be used.
@@ -219,7 +220,7 @@ class Package(abc.ABC, Generic[T]):
219
220
  """
220
221
  self.get_installer(version).install(target)
221
222
 
222
- @functools.lru_cache()
223
+ @functools.lru_cache
223
224
  def get_installer(self, version: str | None = None) -> T:
224
225
  """
225
226
  Returns the installer instance for a specific version of the package.
@@ -237,7 +238,7 @@ class Package(abc.ABC, Generic[T]):
237
238
  raise NoSuchVersionException(package=self.name, version=version)
238
239
  return self._get_installer(version)
239
240
 
240
- def get_versions(self) -> List[str]:
241
+ def get_versions(self) -> list[str]:
241
242
  """
242
243
  :return: List of all versions available for this package.
243
244
  """
@@ -262,7 +263,7 @@ class MultiPackageInstaller(PackageInstaller):
262
263
  PackageInstaller implementation which composes of multiple package installers.
263
264
  """
264
265
 
265
- def __init__(self, name: str, version: str, package_installer: List[PackageInstaller]):
266
+ def __init__(self, name: str, version: str, package_installer: list[PackageInstaller]):
266
267
  """
267
268
  :param name: of the (multi-)package installer
268
269
  :param version: of this (multi-)package installer
@@ -274,7 +275,7 @@ class MultiPackageInstaller(PackageInstaller):
274
275
  assert len(package_installer) > 0
275
276
  self.package_installer = package_installer
276
277
 
277
- def install(self, target: Optional[InstallTarget] = None) -> None:
278
+ def install(self, target: InstallTarget | None = None) -> None:
278
279
  """
279
280
  Installs the different packages this installer is composed of.
280
281
 
@@ -317,7 +318,7 @@ class PackagesPlugin(Plugin): # type: ignore[misc]
317
318
  self,
318
319
  name: str,
319
320
  scope: str,
320
- get_package: Callable[[], Package[PackageInstaller] | List[Package[PackageInstaller]]],
321
+ get_package: Callable[[], Package[PackageInstaller] | list[Package[PackageInstaller]]],
321
322
  should_load: Callable[[], bool] | None = None,
322
323
  ) -> None:
323
324
  super().__init__()
@@ -356,7 +357,7 @@ class PackagesPluginManager(PluginManager[PackagesPlugin]): # type: ignore[misc
356
357
  )
357
358
 
358
359
  def get_packages(
359
- self, package_names: list[str], version: Optional[str] = None
360
+ self, package_names: list[str], version: str | None = None
360
361
  ) -> list[Package[PackageInstaller]]:
361
362
  # Plugin names are unique, but there could be multiple packages with the same name in different scopes
362
363
  plugin_specs_per_name = defaultdict(list)
@@ -390,7 +391,7 @@ T2 = TypeVar("T2")
390
391
  def package(
391
392
  name: str | None = None,
392
393
  scope: str = "community",
393
- should_load: Optional[Callable[[], bool]] = None,
394
+ should_load: Callable[[], bool] | None = None,
394
395
  ) -> Callable[[Callable[[], Package[Any] | list[Package[Any]]]], PluginSpec]:
395
396
  """
396
397
  Decorator for marking methods that create Package instances as a PackagePlugin.
@@ -4,7 +4,7 @@ import re
4
4
  from abc import ABC
5
5
  from functools import lru_cache
6
6
  from sys import version_info
7
- from typing import Any, Optional, Tuple
7
+ from typing import Any
8
8
 
9
9
  import requests
10
10
 
@@ -190,7 +190,7 @@ class GitHubReleaseInstaller(PermissionDownloadInstaller):
190
190
  f"https://api.github.com/repos/{github_slug}/releases/tags/{self.version}"
191
191
  )
192
192
 
193
- @lru_cache()
193
+ @lru_cache
194
194
  def _get_download_url(self) -> str:
195
195
  asset_name = self._get_github_asset_name()
196
196
  # try to use a token when calling the GH API for increased API rate limits
@@ -238,7 +238,7 @@ class NodePackageInstaller(ExecutableInstaller):
238
238
  self,
239
239
  package_name: str,
240
240
  version: str,
241
- package_spec: Optional[str] = None,
241
+ package_spec: str | None = None,
242
242
  main_module: str = "main.js",
243
243
  ):
244
244
  """
@@ -404,7 +404,7 @@ class MavenPackageInstaller(MavenDownloadInstaller):
404
404
  super()._install(target)
405
405
 
406
406
 
407
- def parse_maven_package_url(package_url: str) -> Tuple[str, str, str]:
407
+ def parse_maven_package_url(package_url: str) -> tuple[str, str, str]:
408
408
  """Example: parse_maven_package_url("pkg:maven/software.amazon.event.ruler/event-ruler@1.7.3")
409
409
  -> software.amazon.event.ruler, event-ruler, 1.7.3
410
410
  """
@@ -1,5 +1,3 @@
1
- from typing import List
2
-
3
1
  from localstack.packages import InstallTarget, Package, PackageInstaller
4
2
  from localstack.utils.run import run
5
3
 
@@ -8,7 +6,7 @@ class DebugPyPackage(Package["DebugPyPackageInstaller"]):
8
6
  def __init__(self) -> None:
9
7
  super().__init__("DebugPy", "latest")
10
8
 
11
- def get_versions(self) -> List[str]:
9
+ def get_versions(self) -> list[str]:
12
10
  return ["latest"]
13
11
 
14
12
  def _get_installer(self, version: str) -> "DebugPyPackageInstaller":
@@ -1,5 +1,4 @@
1
1
  import os
2
- from typing import List
3
2
 
4
3
  from localstack.packages import Package
5
4
  from localstack.packages.core import ArchiveDownloadAndExtractInstaller
@@ -21,7 +20,7 @@ class FfmpegPackage(Package["FfmpegPackageInstaller"]):
21
20
  def _get_installer(self, version: str) -> "FfmpegPackageInstaller":
22
21
  return FfmpegPackageInstaller(version)
23
22
 
24
- def get_versions(self) -> List[str]:
23
+ def get_versions(self) -> list[str]:
25
24
  return ["7.1"]
26
25
 
27
26
 
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  import os
3
- from typing import List
4
3
 
5
4
  import requests
6
5
 
@@ -23,6 +22,7 @@ JAVA_VERSIONS = {
23
22
  "11": "11.0.25+9",
24
23
  "17": "17.0.13+11",
25
24
  "21": "21.0.5+11",
25
+ "24": "24.0.1+9",
26
26
  }
27
27
 
28
28
 
@@ -115,23 +115,49 @@ class JavaPackageInstaller(ArchiveDownloadAndExtractInstaller):
115
115
 
116
116
  # Build a custom JRE with only the necessary bits to minimise disk footprint
117
117
  LOG.debug("Optimising JRE installation")
118
- cmd = (
119
- "bin/jlink --add-modules "
118
+
119
+ base_modules = [
120
120
  # Required modules
121
- "java.base,java.desktop,java.instrument,java.management,"
122
- "java.naming,java.scripting,java.sql,java.xml,jdk.compiler,"
121
+ "java.base",
122
+ "java.desktop",
123
+ "java.instrument",
124
+ "java.management",
125
+ "java.naming",
126
+ "java.scripting",
127
+ "java.sql",
128
+ "java.xml",
129
+ "jdk.compiler",
123
130
  # jdk.unsupported contains sun.misc.Unsafe which is required by some dependencies
124
- "jdk.unsupported,"
131
+ "jdk.unsupported",
125
132
  # Additional cipher suites
126
- "jdk.crypto.cryptoki,"
133
+ "jdk.crypto.cryptoki",
127
134
  # Archive support
128
- "jdk.zipfs,"
135
+ "jdk.zipfs",
129
136
  # Required by MQ broker
130
- "jdk.httpserver,jdk.management,jdk.management.agent,"
137
+ "jdk.httpserver",
138
+ "jdk.management",
139
+ "jdk.management.agent",
131
140
  # Required by Spark and Hadoop
132
- "java.security.jgss,jdk.security.auth,"
141
+ "java.security.jgss",
142
+ "jdk.security.auth",
143
+ # Include required locales
144
+ "jdk.localedata",
145
+ ]
146
+
147
+ # Add version-specific modules, not all versions require/support the same set
148
+ version_specific_modules = {
149
+ "24": ["jdk.incubator.vector"], # Required for Trino latest version
150
+ }
151
+
152
+ modules = base_modules + version_specific_modules.get(self.version, [])
153
+ modules_str = ",".join(modules)
154
+
155
+ cmd = (
156
+ "bin/jlink "
157
+ # Add modules
158
+ f"--add-modules {modules_str} "
133
159
  # Include required locales
134
- "jdk.localedata --include-locales en "
160
+ "--include-locales en "
135
161
  # Supplementary args
136
162
  "--compress 2 --strip-debug --no-header-files --no-man-pages "
137
163
  # Output directory
@@ -198,7 +224,7 @@ class JavaPackage(Package[JavaPackageInstaller]):
198
224
  def __init__(self, default_version: str = DEFAULT_JAVA_VERSION):
199
225
  super().__init__(name="Java", default_version=default_version)
200
226
 
201
- def get_versions(self) -> List[str]:
227
+ def get_versions(self) -> list[str]:
202
228
  return list(JAVA_VERSIONS.keys())
203
229
 
204
230
  def _get_installer(self, version: str) -> JavaPackageInstaller:
@@ -5,14 +5,6 @@ from localstack.packages.api import Package, package
5
5
  if TYPE_CHECKING:
6
6
  from localstack.packages.ffmpeg import FfmpegPackageInstaller
7
7
  from localstack.packages.java import JavaPackageInstaller
8
- from localstack.packages.terraform import TerraformPackageInstaller
9
-
10
-
11
- @package(name="terraform")
12
- def terraform_package() -> Package["TerraformPackageInstaller"]:
13
- from .terraform import terraform_package
14
-
15
- return terraform_package
16
8
 
17
9
 
18
10
  @package(name="ffmpeg")
@@ -11,6 +11,7 @@ TRACKED_ENV_VAR = [
11
11
  "ACTIVATE_PRO",
12
12
  "ALLOW_NONSTANDARD_REGIONS",
13
13
  "BEDROCK_PREWARM",
14
+ "CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES",
14
15
  "CLOUDFRONT_LAMBDA_EDGE",
15
16
  "CONTAINER_RUNTIME",
16
17
  "DEBUG",
@@ -53,6 +54,7 @@ TRACKED_ENV_VAR = [
53
54
  "LAMBDA_RUNTIME_ENVIRONMENT_TIMEOUT",
54
55
  "LEGACY_EDGE_PROXY", # Not functional; deprecated in 1.0.0, removed in 2.0.0
55
56
  "LS_LOG",
57
+ "LOCALSTACK_K8S_DEPLOYMENT_METHOD",
56
58
  "MOCK_UNIMPLEMENTED", # Not functional; deprecated in 1.3.0, removed in 3.0.0
57
59
  "OPENSEARCH_ENDPOINT_STRATEGY",
58
60
  "PERSISTENCE",
@@ -78,6 +80,7 @@ PRESENCE_ENV_VAR = [
78
80
  "HOSTNAME_FROM_LAMBDA",
79
81
  "HOST_TMP_FOLDER", # Not functional; deprecated in 1.0.0, removed in 2.0.0
80
82
  "INIT_SCRIPTS_PATH", # Not functional; deprecated in 1.1.0, removed in 2.0.0
83
+ "KUBERNETES_SERVICE_HOST",
81
84
  "LAMBDA_DEBUG_MODE_CONFIG_PATH",
82
85
  "LEGACY_DIRECTORIES", # Not functional; deprecated in 1.1.0, removed in 2.0.0
83
86
  "LEGACY_INIT_DIR", # Not functional; deprecated in 1.1.0, removed in 2.0.0
@@ -65,7 +65,7 @@ class HookManager(PluginManager):
65
65
  fn_plugin(*args, **kwargs)
66
66
 
67
67
  def __str__(self):
68
- return "HookManager(%s)" % self.namespace
68
+ return f"HookManager({self.namespace})"
69
69
 
70
70
  def __repr__(self):
71
71
  return self.__str__()
@@ -7,7 +7,6 @@ import subprocess
7
7
  import time
8
8
  from enum import Enum
9
9
  from functools import cached_property
10
- from typing import Dict, List, Optional
11
10
 
12
11
  from plux import Plugin, PluginManager
13
12
 
@@ -90,9 +89,9 @@ class ShellScriptRunner(ScriptRunner):
90
89
  suffixes = [".sh"]
91
90
 
92
91
  def run(self, path: str) -> None:
93
- exit_code = subprocess.call(args=[], executable=path)
92
+ exit_code = subprocess.call(args=[path])
94
93
  if exit_code != 0:
95
- raise OSError("Script %s returned a non-zero exit code %s" % (path, exit_code))
94
+ raise OSError(f"Script {path} returned a non-zero exit code {exit_code}")
96
95
 
97
96
 
98
97
  class PythonScriptRunner(ScriptRunner):
@@ -109,7 +108,7 @@ class PythonScriptRunner(ScriptRunner):
109
108
 
110
109
 
111
110
  class InitScriptManager:
112
- _stage_directories: Dict[Stage, str] = {
111
+ _stage_directories: dict[Stage, str] = {
113
112
  Stage.BOOT: "boot.d",
114
113
  Stage.START: "start.d",
115
114
  Stage.READY: "ready.d",
@@ -117,7 +116,7 @@ class InitScriptManager:
117
116
  }
118
117
 
119
118
  script_root: str
120
- stage_completed: Dict[Stage, bool]
119
+ stage_completed: dict[Stage, bool]
121
120
 
122
121
  def __init__(self, script_root: str):
123
122
  self.script_root = script_root
@@ -125,10 +124,10 @@ class InitScriptManager:
125
124
  self.runner_manager: PluginManager[ScriptRunner] = PluginManager(ScriptRunner.namespace)
126
125
 
127
126
  @cached_property
128
- def scripts(self) -> Dict[Stage, List[Script]]:
127
+ def scripts(self) -> dict[Stage, list[Script]]:
129
128
  return self._find_scripts()
130
129
 
131
- def get_script_runner(self, script_file: str) -> Optional[ScriptRunner]:
130
+ def get_script_runner(self, script_file: str) -> ScriptRunner | None:
132
131
  runners = self.runner_manager.load_all()
133
132
  for runner in runners:
134
133
  if runner.should_run(script_file):
@@ -138,7 +137,7 @@ class InitScriptManager:
138
137
  def has_script_runner(self, script_file: str) -> bool:
139
138
  return self.get_script_runner(script_file) is not None
140
139
 
141
- def run_stage(self, stage: Stage) -> List[Script]:
140
+ def run_stage(self, stage: Stage) -> list[Script]:
142
141
  """
143
142
  Runs all scripts in the given stage.
144
143
 
@@ -188,7 +187,7 @@ class InitScriptManager:
188
187
 
189
188
  return scripts
190
189
 
191
- def _find_scripts(self) -> Dict[Stage, List[Script]]:
190
+ def _find_scripts(self) -> dict[Stage, list[Script]]:
192
191
  scripts = {}
193
192
 
194
193
  if self.script_root is None:
@@ -20,13 +20,13 @@ def print_runtime_information(in_docker: bool = False):
20
20
  if in_docker:
21
21
  try:
22
22
  container_name = get_main_container_name()
23
- print("LocalStack Docker container name: %s" % container_name)
23
+ print(f"LocalStack Docker container name: {container_name}")
24
24
  inspect_result = DOCKER_CLIENT.inspect_container(container_name)
25
25
  container_id = inspect_result["Id"]
26
- print("LocalStack Docker container id: %s" % container_id[:12])
26
+ print(f"LocalStack Docker container id: {container_id[:12]}")
27
27
  image_details = DOCKER_CLIENT.inspect_image(inspect_result["Image"])
28
28
  digests = image_details.get("RepoDigests") or ["Unavailable"]
29
- print("LocalStack Docker image sha: %s" % digests[0])
29
+ print(f"LocalStack Docker image sha: {digests[0]}")
30
30
  except ContainerException:
31
31
  print(
32
32
  "LocalStack Docker container info: Failed to inspect the LocalStack docker container. "
@@ -44,10 +44,10 @@ def print_runtime_information(in_docker: bool = False):
44
44
  )
45
45
 
46
46
  if config.LOCALSTACK_BUILD_DATE:
47
- print("LocalStack build date: %s" % config.LOCALSTACK_BUILD_DATE)
47
+ print(f"LocalStack build date: {config.LOCALSTACK_BUILD_DATE}")
48
48
 
49
49
  if config.LOCALSTACK_BUILD_GIT_HASH:
50
- print("LocalStack build git hash: %s" % config.LOCALSTACK_BUILD_GIT_HASH)
50
+ print(f"LocalStack build git hash: {config.LOCALSTACK_BUILD_GIT_HASH}")
51
51
 
52
52
  print()
53
53
 
@@ -38,14 +38,14 @@ def patch_urllib3_connection_pool(**constructor_kwargs):
38
38
  class MyHTTPSConnectionPool(connectionpool.HTTPSConnectionPool):
39
39
  def __init__(self, *args, **kwargs):
40
40
  kwargs.update(constructor_kwargs)
41
- super(MyHTTPSConnectionPool, self).__init__(*args, **kwargs)
41
+ super().__init__(*args, **kwargs)
42
42
 
43
43
  poolmanager.pool_classes_by_scheme["https"] = MyHTTPSConnectionPool
44
44
 
45
45
  class MyHTTPConnectionPool(connectionpool.HTTPConnectionPool):
46
46
  def __init__(self, *args, **kwargs):
47
47
  kwargs.update(constructor_kwargs)
48
- super(MyHTTPConnectionPool, self).__init__(*args, **kwargs)
48
+ super().__init__(*args, **kwargs)
49
49
 
50
50
  poolmanager.pool_classes_by_scheme["http"] = MyHTTPConnectionPool
51
51
  except Exception:
@@ -1,5 +1,6 @@
1
1
  import logging
2
- from typing import Any, Callable
2
+ from collections.abc import Callable
3
+ from typing import Any
3
4
 
4
5
  from localstack.runtime import hooks
5
6
  from localstack.utils.functions import call_safe
@@ -1,6 +1,5 @@
1
1
  import abc
2
2
  import json
3
- from typing import Type
4
3
 
5
4
  from apispec import APISpec
6
5
 
@@ -320,7 +319,7 @@ class _OpenApiOAS30Exporter(_BaseOpenApiExporter):
320
319
 
321
320
 
322
321
  class OpenApiExporter:
323
- exporters: dict[str, Type[_BaseOpenApiExporter]]
322
+ exporters: dict[str, type[_BaseOpenApiExporter]]
324
323
 
325
324
  def __init__(self):
326
325
  self.exporters = {"swagger": _OpenApiSwaggerExporter, "oas30": _OpenApiOAS30Exporter}
@@ -3,7 +3,7 @@ import copy
3
3
  import hashlib
4
4
  import json
5
5
  import logging
6
- from typing import List, Optional, TypedDict, Union
6
+ from typing import TypedDict
7
7
  from urllib import parse as urlparse
8
8
 
9
9
  from jsonpatch import apply_patch
@@ -93,7 +93,7 @@ class OpenAPIExt:
93
93
 
94
94
  class AuthorizerConfig(TypedDict):
95
95
  authorizer: Authorizer
96
- authorization_scopes: Optional[list[str]]
96
+ authorization_scopes: list[str] | None
97
97
 
98
98
 
99
99
  # TODO: make the CRUD operations in this file generic for the different model types (authorizes, validators, ...)
@@ -198,11 +198,11 @@ class OpenAPISpecificationResolver:
198
198
 
199
199
  return cur
200
200
 
201
- def _namespaced_resolution(self, namespace: str, data: Union[dict, list]) -> Union[dict, list]:
201
+ def _namespaced_resolution(self, namespace: str, data: dict | list) -> dict | list:
202
202
  with self._pathctx(namespace):
203
203
  return self._resolve_references(data)
204
204
 
205
- def _resolve_references(self, data) -> Union[dict, list]:
205
+ def _resolve_references(self, data) -> dict | list:
206
206
  if self._is_ref(data):
207
207
  return self._resolve_refpath(data["$ref"])
208
208
 
@@ -367,10 +367,7 @@ def resolve_references(data: dict, rest_api_id, allow_recursive=True) -> dict:
367
367
 
368
368
  def path_based_url(api_id: str, stage_name: str, path: str) -> str:
369
369
  """Return URL for inbound API gateway for given API ID, stage name, and path"""
370
- pattern = "%s/restapis/{api_id}/{stage_name}/%s{path}" % (
371
- config.external_service_url(),
372
- PATH_USER_REQUEST,
373
- )
370
+ pattern = f"{config.external_service_url()}/restapis/{{api_id}}/{{stage_name}}/{PATH_USER_REQUEST}{{path}}"
374
371
  return pattern.format(api_id=api_id, stage_name=stage_name, path=path)
375
372
 
376
373
 
@@ -578,7 +575,7 @@ def import_api_from_openapi_spec(
578
575
 
579
576
  authorizers[security_scheme_name] = authorizer
580
577
 
581
- def get_authorizer(path_payload: dict) -> Optional[AuthorizerConfig]:
578
+ def get_authorizer(path_payload: dict) -> AuthorizerConfig | None:
582
579
  if not (security_schemes := path_payload.get("security")):
583
580
  return None
584
581
 
@@ -605,7 +602,7 @@ def import_api_from_openapi_spec(
605
602
  rel_path = abs_path.removeprefix(base_path)
606
603
  return add_path_methods(rel_path, parts, parent_id=parent_id)
607
604
 
608
- def add_path_methods(rel_path: str, parts: List[str], parent_id=""):
605
+ def add_path_methods(rel_path: str, parts: list[str], parent_id=""):
609
606
  rel_path = rel_path or "/"
610
607
  child_id = ApigwResourceIdentifier(account_id, region_name, parent_id, rel_path).generate()
611
608