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
@@ -5,8 +5,9 @@ import shutil
5
5
  import tempfile
6
6
  import threading
7
7
  from collections import defaultdict
8
+ from collections.abc import Callable
8
9
  from pathlib import Path
9
- from typing import Callable, Dict, Literal, Optional
10
+ from typing import Literal
10
11
 
11
12
  from localstack import config
12
13
  from localstack.aws.api.lambda_ import Architecture, PackageType, Runtime
@@ -23,7 +24,6 @@ from localstack.services.lambda_.invocation.runtime_executor import (
23
24
  LambdaRuntimeException,
24
25
  RuntimeExecutor,
25
26
  )
26
- from localstack.services.lambda_.lambda_debug_mode.ldm import LDM_ENV_VAR_DEBUG_PORT
27
27
  from localstack.services.lambda_.lambda_utils import HINT_LOG
28
28
  from localstack.services.lambda_.networking import (
29
29
  get_all_container_networks_for_lambda,
@@ -146,7 +146,7 @@ class RuntimeImageResolver:
146
146
  def __init__(
147
147
  self, default_resolve_fn: Callable[[Runtime], str] = get_default_image_for_runtime
148
148
  ):
149
- self._mapping = dict()
149
+ self._mapping = {}
150
150
  self._default_resolve_fn = default_resolve_fn
151
151
 
152
152
  def _resolve(self, runtime: Runtime, custom_image_mapping: str = "") -> str:
@@ -275,12 +275,12 @@ class LambdaContainerConfiguration(ContainerConfiguration):
275
275
 
276
276
 
277
277
  class DockerRuntimeExecutor(RuntimeExecutor):
278
- ip: Optional[str]
279
- executor_endpoint: Optional[ExecutorEndpoint]
278
+ ip: str | None
279
+ executor_endpoint: ExecutorEndpoint | None
280
280
  container_name: str
281
281
 
282
282
  def __init__(self, id: str, function_version: FunctionVersion) -> None:
283
- super(DockerRuntimeExecutor, self).__init__(id=id, function_version=function_version)
283
+ super().__init__(id=id, function_version=function_version)
284
284
  self.ip = None
285
285
  self.executor_endpoint = ExecutorEndpoint(self.id)
286
286
  self.container_name = self._generate_container_name()
@@ -376,10 +376,6 @@ class DockerRuntimeExecutor(RuntimeExecutor):
376
376
  container_config.ports = PortMappings()
377
377
  container_config.ports.add(config.LAMBDA_INIT_DELVE_PORT, config.LAMBDA_INIT_DELVE_PORT)
378
378
 
379
- if ldm_debug_port := env_vars.get(LDM_ENV_VAR_DEBUG_PORT):
380
- ldm_debug_port = int(ldm_debug_port)
381
- container_config.ports.add(ldm_debug_port, ldm_debug_port)
382
-
383
379
  if (
384
380
  self.function_version.config.layers
385
381
  and not config.LAMBDA_PREBUILD_IMAGES
@@ -460,7 +456,7 @@ class DockerRuntimeExecutor(RuntimeExecutor):
460
456
  def _get_networks_for_executor(self) -> list[str]:
461
457
  return get_all_container_networks_for_lambda()
462
458
 
463
- def invoke(self, payload: Dict[str, str]):
459
+ def invoke(self, payload: dict[str, str]):
464
460
  LOG.debug(
465
461
  "Sending invoke-payload '%s' to executor '%s'",
466
462
  truncate(json.dumps(payload), config.LAMBDA_TRUNCATE_STDOUT),
@@ -42,7 +42,7 @@ def get_sqs_client(function_version: FunctionVersion, client_config=None):
42
42
  # TODO: remove once DLQ handling is refactored following the removal of the legacy lambda provider
43
43
  class LegacyInvocationException(Exception):
44
44
  def __init__(self, message, log_output=None, result=None):
45
- super(LegacyInvocationException, self).__init__(message)
45
+ super().__init__(message)
46
46
  self.log_output = log_output
47
47
  self.result = result
48
48
 
@@ -2,10 +2,10 @@ import logging
2
2
  import random
3
3
  import string
4
4
  import time
5
+ from collections.abc import Callable
5
6
  from datetime import date, datetime
6
7
  from enum import Enum, auto
7
8
  from threading import RLock, Timer
8
- from typing import Callable, Dict, Optional
9
9
 
10
10
  from localstack import config
11
11
  from localstack.aws.connect import connect_to
@@ -61,8 +61,8 @@ class ExecutionEnvironment:
61
61
  status: RuntimeStatus
62
62
  initialization_type: InitializationType
63
63
  last_returned: datetime
64
- startup_timer: Optional[Timer]
65
- keepalive_timer: Optional[Timer]
64
+ startup_timer: Timer | None
65
+ keepalive_timer: Timer | None
66
66
  on_timeout: Callable[[str, str], None]
67
67
 
68
68
  def __init__(
@@ -91,7 +91,7 @@ class ExecutionEnvironment:
91
91
  def get_log_stream_name(self) -> str:
92
92
  return f"{date.today():%Y/%m/%d}/[{self.function_version.id.qualifier}]{self.id}"
93
93
 
94
- def get_environment_variables(self) -> Dict[str, str]:
94
+ def get_environment_variables(self) -> dict[str, str]:
95
95
  """
96
96
  Returns the environment variable set for the runtime container
97
97
  :return: Dict of environment variables
@@ -3,18 +3,15 @@ import logging
3
3
  import time
4
4
  from concurrent.futures import CancelledError, Future
5
5
  from http import HTTPStatus
6
- from typing import Any, Dict, Optional
6
+ from typing import Any
7
7
 
8
8
  import requests
9
9
  from werkzeug import Request
10
10
 
11
11
  from localstack.http import Response, route
12
12
  from localstack.services.edge import ROUTER
13
+ from localstack.services.lambda_ import ldm
13
14
  from localstack.services.lambda_.invocation.lambda_models import InvocationResult
14
- from localstack.services.lambda_.lambda_debug_mode.ldm import (
15
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS,
16
- LDM,
17
- )
18
15
  from localstack.utils.backoff import ExponentialBackoff
19
16
  from localstack.utils.objects import singleton_factory
20
17
  from localstack.utils.strings import to_str
@@ -121,8 +118,8 @@ class ExecutorEndpoint(Endpoint):
121
118
  def __init__(
122
119
  self,
123
120
  executor_id: str,
124
- container_address: Optional[str] = None,
125
- container_port: Optional[int] = INVOCATION_PORT,
121
+ container_address: str | None = None,
122
+ container_port: int | None = INVOCATION_PORT,
126
123
  ) -> None:
127
124
  self.container_address = container_address
128
125
  self.container_port = container_port
@@ -143,7 +140,7 @@ class ExecutorEndpoint(Endpoint):
143
140
 
144
141
  def invocation_logs(self, request: Request, invoke_id: str) -> Response:
145
142
  logs = request.json
146
- if isinstance(logs, Dict):
143
+ if isinstance(logs, dict):
147
144
  self.logs = logs["logs"]
148
145
  else:
149
146
  LOG.error("Invalid logs from init! Logs: %s", logs)
@@ -186,7 +183,7 @@ class ExecutorEndpoint(Endpoint):
186
183
  if self.invocation_future:
187
184
  self.invocation_future.cancel()
188
185
 
189
- def invoke(self, payload: Dict[str, str]) -> InvocationResult:
186
+ def invoke(self, payload: dict[str, str]) -> InvocationResult:
190
187
  self.invocation_future = Future()
191
188
  self.logs = None
192
189
  if not self.container_address:
@@ -209,9 +206,9 @@ class ExecutorEndpoint(Endpoint):
209
206
  # Note that if timeouts are enforced for the lambda function invoked at this endpoint
210
207
  # (this is needs to be configured in the Lambda Debug Mode Config file), the lambda
211
208
  # function will continue to enforce the expected timeouts.
212
- if LDM.is_enabled():
209
+ if ldm.IS_LDM_ENABLED:
213
210
  # The value is set to a default high value to ensure eventual termination.
214
- timeout_seconds = DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
211
+ timeout_seconds = ldm.DEFAULT_LDM_TIMEOUT_SECONDS
215
212
  else:
216
213
  # Do not wait longer for an invoke than the maximum lambda timeout plus a buffer
217
214
  lambda_max_timeout_seconds = 900
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import threading
3
- from typing import Iterable
3
+ from collections.abc import Iterable
4
4
 
5
5
  from localstack import config
6
6
  from localstack.aws.api.sqs import (
@@ -19,13 +19,9 @@ from localstack.aws.api.sqs import (
19
19
  String,
20
20
  TagMap,
21
21
  )
22
- from localstack.services.sqs.models import SqsQueue, StandardQueue
23
- from localstack.services.sqs.provider import (
24
- QueueUpdateWorker,
25
- _create_message_attribute_hash,
26
- to_sqs_api_message,
27
- )
28
- from localstack.services.sqs.utils import generate_message_id
22
+ from localstack.services.sqs.models import SqsQueue, StandardQueue, to_sqs_api_message
23
+ from localstack.services.sqs.provider import QueueUpdateWorker
24
+ from localstack.services.sqs.utils import create_message_attribute_hash, generate_message_id
29
25
  from localstack.utils.objects import singleton_factory
30
26
  from localstack.utils.strings import md5
31
27
  from localstack.utils.time import now
@@ -189,7 +185,7 @@ class FakeSqsClient:
189
185
  MD5OfBody=md5(MessageBody),
190
186
  Body=MessageBody,
191
187
  Attributes=self._create_message_attributes(MessageSystemAttributes),
192
- MD5OfMessageAttributes=_create_message_attribute_hash(MessageAttributes),
188
+ MD5OfMessageAttributes=create_message_attribute_hash(MessageAttributes),
193
189
  MessageAttributes=MessageAttributes,
194
190
  )
195
191
  queue_item = queue.put(
@@ -204,7 +200,7 @@ class FakeSqsClient:
204
200
  "MD5OfMessageBody": message["MD5OfBody"],
205
201
  "MD5OfMessageAttributes": message.get("MD5OfMessageAttributes"),
206
202
  "SequenceNumber": queue_item.sequence_number,
207
- "MD5OfMessageSystemAttributes": _create_message_attribute_hash(MessageSystemAttributes),
203
+ "MD5OfMessageSystemAttributes": create_message_attribute_hash(MessageSystemAttributes),
208
204
  }
209
205
 
210
206
 
@@ -12,8 +12,9 @@ import threading
12
12
  from abc import ABCMeta, abstractmethod
13
13
  from datetime import datetime
14
14
  from pathlib import Path
15
- from typing import IO, Dict, Literal, Optional, TypedDict
15
+ from typing import IO, Literal, TypedDict
16
16
 
17
+ import boto3
17
18
  from botocore.exceptions import ClientError
18
19
 
19
20
  from localstack import config
@@ -40,7 +41,7 @@ from localstack.aws.api.lambda_ import (
40
41
  TracingMode,
41
42
  )
42
43
  from localstack.aws.connect import connect_to
43
- from localstack.constants import AWS_REGION_US_EAST_1
44
+ from localstack.constants import AWS_REGION_US_EAST_1, INTERNAL_AWS_SECRET_ACCESS_KEY
44
45
  from localstack.services.lambda_.api_utils import qualified_lambda_arn, unqualified_lambda_arn
45
46
  from localstack.utils.archives import unzip
46
47
  from localstack.utils.strings import long_uid, short_uid
@@ -52,8 +53,8 @@ LOG = logging.getLogger(__name__)
52
53
  @dataclasses.dataclass(frozen=True)
53
54
  class VersionState:
54
55
  state: State
55
- code: Optional[StateReasonCode] = None
56
- reason: Optional[str] = None
56
+ code: StateReasonCode | None = None
57
+ reason: str | None = None
57
58
 
58
59
 
59
60
  @dataclasses.dataclass
@@ -66,7 +67,7 @@ class Invocation:
66
67
  # = invocation_id
67
68
  request_id: str
68
69
  trace_context: dict
69
- user_agent: Optional[str] = None
70
+ user_agent: str | None = None
70
71
 
71
72
 
72
73
  InitializationType = Literal["on-demand", "provisioned-concurrency"]
@@ -74,7 +75,7 @@ InitializationType = Literal["on-demand", "provisioned-concurrency"]
74
75
 
75
76
  class ArchiveCode(metaclass=ABCMeta):
76
77
  @abstractmethod
77
- def generate_presigned_url(self, endpoint_url: str | None = None):
78
+ def generate_presigned_url(self, endpoint_url: str):
78
79
  """
79
80
  Generates a presigned url pointing to the code archive
80
81
  """
@@ -168,15 +169,17 @@ class S3Code(ArchiveCode):
168
169
  )
169
170
  target_file.flush()
170
171
 
171
- def generate_presigned_url(self, endpoint_url: str | None = None) -> str:
172
+ def generate_presigned_url(self, endpoint_url: str) -> str:
172
173
  """
173
174
  Generates a presigned url pointing to the code archive
174
175
  """
175
- s3_client = connect_to(
176
+ s3_client = boto3.client(
177
+ "s3",
176
178
  region_name=AWS_REGION_US_EAST_1,
177
179
  aws_access_key_id=config.INTERNAL_RESOURCE_ACCOUNT,
180
+ aws_secret_access_key=INTERNAL_AWS_SECRET_ACCESS_KEY,
178
181
  endpoint_url=endpoint_url,
179
- ).s3
182
+ )
180
183
  params = {"Bucket": self.s3_bucket, "Key": self.s3_key}
181
184
  if self.s3_object_version:
182
185
  params["VersionId"] = self.s3_object_version
@@ -257,8 +260,8 @@ class HotReloadingCode(ArchiveCode):
257
260
  code_sha256: str = "hot-reloading-hash-not-available"
258
261
  code_size: int = 0
259
262
 
260
- def generate_presigned_url(self, endpoint_url: str | None = None) -> str:
261
- return f"Code location: {self.host_path}"
263
+ def generate_presigned_url(self, endpoint_url: str) -> str:
264
+ return f"file://{self.host_path}"
262
265
 
263
266
  def get_unzipped_code_location(self) -> Path:
264
267
  path = os.path.expandvars(self.host_path)
@@ -352,11 +355,11 @@ class FunctionUrlConfig:
352
355
  url: str # full URL (e.g. "https://pfn5bdb2dl5mzkbn6eb2oi3xfe0nthdn.lambda-url.eu-west-3.on.aws/")
353
356
  auth_type: FunctionUrlAuthType
354
357
  creation_time: str # time
355
- last_modified_time: Optional[str] = (
358
+ last_modified_time: str | None = (
356
359
  None # TODO: check if this is the creation time when initially creating
357
360
  )
358
- function_qualifier: Optional[str] = "$LATEST" # only $LATEST or alias name
359
- invoke_mode: Optional[InvokeMode] = None
361
+ function_qualifier: str | None = "$LATEST" # only $LATEST or alias name
362
+ invoke_mode: InvokeMode | None = None
360
363
 
361
364
 
362
365
  @dataclasses.dataclass
@@ -374,12 +377,12 @@ class ProvisionedConcurrencyState:
374
377
  status: ProvisionedConcurrencyStatusEnum = dataclasses.field(
375
378
  default=ProvisionedConcurrencyStatusEnum.IN_PROGRESS
376
379
  )
377
- status_reason: Optional[str] = None
380
+ status_reason: str | None = None
378
381
 
379
382
 
380
383
  @dataclasses.dataclass
381
384
  class AliasRoutingConfig:
382
- version_weights: Dict[str, float]
385
+ version_weights: dict[str, float]
383
386
 
384
387
 
385
388
  @dataclasses.dataclass(frozen=True)
@@ -431,10 +434,10 @@ class EventInvokeConfig:
431
434
  function_name: str
432
435
  qualifier: str
433
436
 
434
- last_modified: Optional[str] = dataclasses.field(compare=False)
435
- destination_config: Optional[DestinationConfig] = None
436
- maximum_retry_attempts: Optional[int] = None
437
- maximum_event_age_in_seconds: Optional[int] = None
437
+ last_modified: str | None = dataclasses.field(compare=False)
438
+ destination_config: DestinationConfig | None = None
439
+ maximum_retry_attempts: int | None = None
440
+ maximum_event_age_in_seconds: int | None = None
438
441
 
439
442
 
440
443
  # Result Models
@@ -484,7 +487,7 @@ class CodeSigningConfig:
484
487
  allowed_publishers: AllowedPublishers
485
488
  policies: CodeSigningPolicies
486
489
  last_modified: str
487
- description: Optional[str] = None
490
+ description: str | None = None
488
491
 
489
492
 
490
493
  @dataclasses.dataclass
@@ -492,7 +495,7 @@ class LayerPolicyStatement:
492
495
  sid: str
493
496
  action: str
494
497
  principal: str
495
- organization_id: Optional[str]
498
+ organization_id: str | None
496
499
 
497
500
 
498
501
  @dataclasses.dataclass
@@ -551,18 +554,18 @@ class VersionFunctionConfiguration:
551
554
  last_modified: str # ISO string
552
555
  state: VersionState
553
556
 
554
- image: Optional[ImageCode] = None
555
- image_config: Optional[ImageConfig] = None
556
- runtime_version_config: Optional[RuntimeVersionConfig] = None
557
- last_update: Optional[UpdateStatus] = None
557
+ image: ImageCode | None = None
558
+ image_config: ImageConfig | None = None
559
+ runtime_version_config: RuntimeVersionConfig | None = None
560
+ last_update: UpdateStatus | None = None
558
561
  revision_id: str = dataclasses.field(init=False, default_factory=long_uid)
559
562
  layers: list[LayerVersion] = dataclasses.field(default_factory=list)
560
563
 
561
- dead_letter_arn: Optional[str] = None
564
+ dead_letter_arn: str | None = None
562
565
 
563
566
  # kms_key_arn: str
564
567
  # file_system_configs: FileSystemConfig
565
- vpc_config: Optional[VpcConfig] = None
568
+ vpc_config: VpcConfig | None = None
566
569
 
567
570
  logging_config: LoggingConfig = dataclasses.field(default_factory=dict)
568
571
 
@@ -580,7 +583,7 @@ class FunctionVersion:
580
583
  @dataclasses.dataclass
581
584
  class Function:
582
585
  function_name: str
583
- code_signing_config_arn: Optional[str] = None
586
+ code_signing_config_arn: str | None = None
584
587
  aliases: dict[str, VersionAlias] = dataclasses.field(default_factory=dict)
585
588
  versions: dict[str, FunctionVersion] = dataclasses.field(default_factory=dict)
586
589
  function_url_configs: dict[str, FunctionUrlConfig] = dataclasses.field(
@@ -592,7 +595,7 @@ class Function:
592
595
  event_invoke_configs: dict[str, EventInvokeConfig] = dataclasses.field(
593
596
  default_factory=dict
594
597
  ) # key is $LATEST(?), version or alias
595
- reserved_concurrent_executions: Optional[int] = None
598
+ reserved_concurrent_executions: int | None = None
596
599
  recursive_loop: RecursiveLoop = RecursiveLoop.Terminate
597
600
  provisioned_concurrency_configs: dict[str, ProvisionedConcurrencyConfiguration] = (
598
601
  dataclasses.field(default_factory=dict)
@@ -11,7 +11,7 @@ from datetime import datetime
11
11
  from hashlib import sha256
12
12
  from pathlib import PurePosixPath, PureWindowsPath
13
13
  from threading import RLock
14
- from typing import TYPE_CHECKING, Optional
14
+ from typing import TYPE_CHECKING
15
15
 
16
16
  from localstack import config
17
17
  from localstack.aws.api.lambda_ import (
@@ -25,6 +25,7 @@ from localstack.aws.api.lambda_ import (
25
25
  )
26
26
  from localstack.aws.connect import connect_to
27
27
  from localstack.constants import AWS_REGION_US_EAST_1
28
+ from localstack.services.lambda_ import hooks as lambda_hooks
28
29
  from localstack.services.lambda_.analytics import (
29
30
  FunctionOperation,
30
31
  FunctionStatus,
@@ -130,6 +131,7 @@ class LambdaService:
130
131
  if not version_manager:
131
132
  raise ValueError(f"Unable to find version manager for {qualified_arn}")
132
133
  self.task_executor.submit(version_manager.stop)
134
+ lambda_hooks.delete_function_version.run(qualified_arn)
133
135
 
134
136
  def get_lambda_version_manager(self, function_arn: str) -> LambdaVersionManager:
135
137
  """
@@ -185,6 +187,7 @@ class LambdaService:
185
187
  assignment_service=self.assignment_service,
186
188
  )
187
189
  self.lambda_starting_versions[qualified_arn] = version_manager
190
+ lambda_hooks.create_function_version.run(function_version.qualified_arn)
188
191
  return self.task_executor.submit(self._start_lambda_version, version_manager)
189
192
 
190
193
  def publish_version(self, function_version: FunctionVersion):
@@ -230,7 +233,7 @@ class LambdaService:
230
233
  request_id: str,
231
234
  payload: bytes | None,
232
235
  trace_context: dict | None = None,
233
- user_agent: Optional[str] = None,
236
+ user_agent: str | None = None,
234
237
  ) -> InvocationResult | None:
235
238
  """
236
239
  Invokes a specific version of a lambda
@@ -475,7 +478,11 @@ class LambdaService:
475
478
  ] = new_version_state
476
479
 
477
480
  except Exception:
478
- LOG.exception("Failed to update function version for arn %s", function_arn)
481
+ LOG.error(
482
+ "Failed to update function version for arn %s",
483
+ function_arn,
484
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
485
+ )
479
486
 
480
487
  def update_alias(self, old_alias: VersionAlias, new_alias: VersionAlias, function: Function):
481
488
  # if pointer changed, need to restart provisioned
@@ -624,7 +631,7 @@ def create_hot_reloading_code(path: str) -> HotReloadingCode:
624
631
  def store_s3_bucket_archive(
625
632
  archive_bucket: str,
626
633
  archive_key: str,
627
- archive_version: Optional[str],
634
+ archive_version: str | None,
628
635
  function_name: str,
629
636
  region_name: str,
630
637
  account_id: str,
@@ -643,7 +650,7 @@ def store_s3_bucket_archive(
643
650
  if archive_bucket == config.BUCKET_MARKER_LOCAL:
644
651
  hotreload_counter.labels(operation="create").increment()
645
652
  return create_hot_reloading_code(path=archive_key)
646
- s3_client: "S3Client" = connect_to().s3
653
+ s3_client: S3Client = connect_to().s3
647
654
  kwargs = {"VersionId": archive_version} if archive_version else {}
648
655
  try:
649
656
  archive_file = s3_client.get_object(Bucket=archive_bucket, Key=archive_key, **kwargs)[
@@ -3,7 +3,6 @@ import logging
3
3
  import threading
4
4
  import time
5
5
  from queue import Queue
6
- from typing import Optional, Union
7
6
 
8
7
  from localstack.aws.connect import connect_to
9
8
  from localstack.utils.aws.client_types import ServicePrincipal
@@ -28,9 +27,9 @@ class LogItem:
28
27
 
29
28
 
30
29
  class LogHandler:
31
- log_queue: "Queue[Union[LogItem, ShutdownPill]]"
30
+ log_queue: "Queue[LogItem | ShutdownPill]"
32
31
  role_arn: str
33
- _thread: Optional[FuncThread]
32
+ _thread: FuncThread | None
34
33
  _shutdown_event: threading.Event
35
34
 
36
35
  def __init__(self, role_arn: str, region: str) -> None:
@@ -2,7 +2,7 @@ import dataclasses
2
2
  import logging
3
3
  from abc import ABC, abstractmethod
4
4
  from pathlib import Path
5
- from typing import Type, TypedDict
5
+ from typing import TypedDict
6
6
 
7
7
  from plux import PluginManager
8
8
 
@@ -133,12 +133,12 @@ class ChmodPath(TypedDict):
133
133
  mode: str
134
134
 
135
135
 
136
- EXECUTOR_PLUGIN_MANAGER: PluginManager[Type[RuntimeExecutor]] = PluginManager(
136
+ EXECUTOR_PLUGIN_MANAGER: PluginManager[type[RuntimeExecutor]] = PluginManager(
137
137
  RuntimeExecutorPlugin.namespace
138
138
  )
139
139
 
140
140
 
141
- def get_runtime_executor() -> Type[RuntimeExecutor]:
141
+ def get_runtime_executor() -> type[RuntimeExecutor]:
142
142
  plugin_name = config.LAMBDA_RUNTIME_EXECUTOR or "docker"
143
143
  if not EXECUTOR_PLUGIN_MANAGER.exists(plugin_name):
144
144
  LOG.warning(
@@ -3,6 +3,7 @@ import logging
3
3
  import threading
4
4
  import time
5
5
  from concurrent.futures import Future
6
+ from concurrent.futures._base import CancelledError
6
7
 
7
8
  from localstack import config
8
9
  from localstack.aws.api.lambda_ import (
@@ -11,6 +12,7 @@ from localstack.aws.api.lambda_ import (
11
12
  State,
12
13
  StateReasonCode,
13
14
  )
15
+ from localstack.services.lambda_ import hooks as lambda_hooks
14
16
  from localstack.services.lambda_.invocation.assignment import AssignmentService
15
17
  from localstack.services.lambda_.invocation.counting_service import CountingService
16
18
  from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
@@ -29,8 +31,8 @@ from localstack.services.lambda_.invocation.metrics import (
29
31
  record_cw_metric_invocation,
30
32
  )
31
33
  from localstack.services.lambda_.invocation.runtime_executor import get_runtime_executor
32
- from localstack.services.lambda_.lambda_debug_mode.ldm import LDM
33
- from localstack.utils.strings import long_uid, truncate
34
+ from localstack.services.lambda_.ldm import LDMProvisioner
35
+ from localstack.utils.strings import long_uid, to_bytes, truncate
34
36
  from localstack.utils.threads import FuncThread, start_thread
35
37
 
36
38
  LOG = logging.getLogger(__name__)
@@ -53,6 +55,8 @@ class LambdaVersionManager:
53
55
  counting_service: CountingService
54
56
  assignment_service: AssignmentService
55
57
 
58
+ ldm_provisioner: LDMProvisioner | None
59
+
56
60
  def __init__(
57
61
  self,
58
62
  function_arn: str,
@@ -80,6 +84,9 @@ class LambdaVersionManager:
80
84
  # https://aws.amazon.com/blogs/compute/coming-soon-expansion-of-aws-lambda-states-to-all-functions/
81
85
  self.state = VersionState(state=State.Pending)
82
86
 
87
+ self.ldm_provisioner = None
88
+ lambda_hooks.inject_ldm_provisioner.run(self)
89
+
83
90
  def start(self) -> VersionState:
84
91
  try:
85
92
  self.log_handler.start_subscriber()
@@ -194,15 +201,31 @@ class LambdaVersionManager:
194
201
 
195
202
  # If the environment has debugging enabled, route the invocation there;
196
203
  # debug environments bypass Lambda service quotas.
197
- if debug_execution_environment := LDM.get_execution_environment(
198
- qualified_lambda_arn=self.function_version.qualified_arn,
199
- user_agent=invocation.user_agent,
204
+ if self.ldm_provisioner and (
205
+ ldm_execution_environment := self.ldm_provisioner.get_execution_environment(
206
+ qualified_lambda_arn=self.function_version.qualified_arn,
207
+ user_agent=invocation.user_agent,
208
+ )
200
209
  ):
201
210
  try:
202
- invocation_result = debug_execution_environment.invoke(invocation)
211
+ invocation_result = ldm_execution_environment.invoke(invocation)
203
212
  invocation_result.executed_version = self.function_version.id.qualifier
204
213
  self.store_logs(
205
- invocation_result=invocation_result, execution_env=debug_execution_environment
214
+ invocation_result=invocation_result, execution_env=ldm_execution_environment
215
+ )
216
+ except CancelledError as e:
217
+ # Timeouts for invocation futures are managed by LDM, a cancelled error here is
218
+ # aligned with the debug container terminating whilst debugging/invocation.
219
+ LOG.debug("LDM invocation future encountered a cancelled error: '%s'", e)
220
+ invocation_result = InvocationResult(
221
+ request_id="",
222
+ payload=to_bytes(
223
+ "The invocation was canceled because the debug configuration "
224
+ "was removed or the operation timed out"
225
+ ),
226
+ is_error=True,
227
+ logs="",
228
+ executed_version=self.function_version.id.qualifier,
206
229
  )
207
230
  except StatusErrorException as e:
208
231
  invocation_result = InvocationResult(
@@ -213,7 +236,7 @@ class LambdaVersionManager:
213
236
  executed_version=self.function_version.id.qualifier,
214
237
  )
215
238
  finally:
216
- debug_execution_environment.release()
239
+ ldm_execution_environment.release()
217
240
  return invocation_result
218
241
 
219
242
  with self.counting_service.get_invocation_lease(
@@ -0,0 +1,14 @@
1
+ import abc
2
+
3
+ from localstack.aws.api.lambda_ import Arn
4
+ from localstack.services.lambda_.invocation.execution_environment import ExecutionEnvironment
5
+
6
+ DEFAULT_LDM_TIMEOUT_SECONDS: int = 3_600
7
+ IS_LDM_ENABLED: bool = False
8
+
9
+
10
+ class LDMProvisioner(abc.ABC):
11
+ @abc.abstractmethod
12
+ def get_execution_environment(
13
+ self, qualified_lambda_arn: Arn, user_agent: str | None
14
+ ) -> ExecutionEnvironment | None: ...
@@ -4,7 +4,6 @@ import os
4
4
  import stat
5
5
  from functools import cache
6
6
  from pathlib import Path
7
- from typing import List
8
7
 
9
8
  from localstack import config
10
9
  from localstack.packages import DownloadInstaller, InstallTarget, Package, PackageInstaller
@@ -13,7 +12,7 @@ from localstack.utils.platform import get_arch
13
12
  """Customized LocalStack version of the AWS Lambda Runtime Interface Emulator (RIE).
14
13
  https://github.com/localstack/lambda-runtime-init/blob/localstack/README-LOCALSTACK.md
15
14
  """
16
- LAMBDA_RUNTIME_DEFAULT_VERSION = "v0.1.34-pre"
15
+ LAMBDA_RUNTIME_DEFAULT_VERSION = "v0.1.36-pre"
17
16
  LAMBDA_RUNTIME_VERSION = config.LAMBDA_INIT_RELEASE_VERSION or LAMBDA_RUNTIME_DEFAULT_VERSION
18
17
  LAMBDA_RUNTIME_INIT_URL = "https://github.com/localstack/lambda-runtime-init/releases/download/{version}/aws-lambda-rie-{arch}"
19
18
 
@@ -35,7 +34,7 @@ class LambdaRuntimePackage(Package):
35
34
  def __init__(self, default_version: str = LAMBDA_RUNTIME_VERSION):
36
35
  super().__init__(name="Lambda", default_version=default_version)
37
36
 
38
- def get_versions(self) -> List[str]:
37
+ def get_versions(self) -> list[str]:
39
38
  return [LAMBDA_RUNTIME_VERSION]
40
39
 
41
40
  def _get_installer(self, version: str) -> PackageInstaller:
@@ -75,7 +74,7 @@ class LambdaJavaPackage(Package):
75
74
  def __init__(self):
76
75
  super().__init__("LambdaJavaLibs", "0.2.22")
77
76
 
78
- def get_versions(self) -> List[str]:
77
+ def get_versions(self) -> list[str]:
79
78
  return ["0.2.22", "0.2.21"]
80
79
 
81
80
  def _get_installer(self, version: str) -> PackageInstaller: