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
@@ -10,7 +10,6 @@ import struct
10
10
  import uuid
11
11
  from collections import namedtuple
12
12
  from dataclasses import dataclass
13
- from typing import Dict, Optional, Tuple
14
13
 
15
14
  from cryptography.exceptions import InvalidSignature, InvalidTag, UnsupportedAlgorithm
16
15
  from cryptography.hazmat.backends import default_backend
@@ -91,9 +90,7 @@ KEY_ID_LEN = 36
91
90
  # Moto uses IV_LEN of 12, as it is fine for GCM encryption mode, but we use CBC, so have to set it to 16.
92
91
  IV_LEN = 16
93
92
  TAG_LEN = 16
94
- CIPHERTEXT_HEADER_FORMAT = ">{key_id_len}s{iv_len}s{tag_len}s".format(
95
- key_id_len=KEY_ID_LEN, iv_len=IV_LEN, tag_len=TAG_LEN
96
- )
93
+ CIPHERTEXT_HEADER_FORMAT = f">{KEY_ID_LEN}s{IV_LEN}s{TAG_LEN}s"
97
94
  HEADER_LEN = KEY_ID_LEN + IV_LEN + TAG_LEN
98
95
  Ciphertext = namedtuple("Ciphertext", ("key_id", "iv", "ciphertext", "tag"))
99
96
 
@@ -138,7 +135,7 @@ def deserialize_ciphertext_blob(ciphertext_blob: bytes) -> Ciphertext:
138
135
  return Ciphertext(key_id=key_id.decode("utf-8"), iv=iv, ciphertext=ciphertext, tag=tag)
139
136
 
140
137
 
141
- def _serialize_encryption_context(encryption_context: Optional[EncryptionContextType]) -> bytes:
138
+ def _serialize_encryption_context(encryption_context: EncryptionContextType | None) -> bytes:
142
139
  if encryption_context:
143
140
  aad = io.BytesIO()
144
141
  for key, value in sorted(encryption_context.items(), key=lambda x: x[0]):
@@ -173,8 +170,8 @@ class KmsCryptoKey:
173
170
  by AWS and is not used by AWS.
174
171
  """
175
172
 
176
- public_key: Optional[bytes]
177
- private_key: Optional[bytes]
173
+ public_key: bytes | None
174
+ private_key: bytes | None
178
175
  key_material: bytes
179
176
  key_spec: str
180
177
 
@@ -217,7 +214,7 @@ class KmsCryptoKey:
217
214
 
218
215
  raise UnsupportedOperationException(f"KeySpec {key_spec} is not supported")
219
216
 
220
- def __init__(self, key_spec: str, key_material: Optional[bytes] = None):
217
+ def __init__(self, key_spec: str, key_material: bytes | None = None):
221
218
  self.private_key = None
222
219
  self.public_key = None
223
220
  # Technically, key_material, being a symmetric encryption key, is only relevant for
@@ -251,7 +248,13 @@ class KmsCryptoKey:
251
248
  self._serialize_key(key)
252
249
 
253
250
  def load_key_material(self, material: bytes):
254
- if self.key_spec == "SYMMETRIC_DEFAULT":
251
+ if self.key_spec in [
252
+ KeySpec.SYMMETRIC_DEFAULT,
253
+ KeySpec.HMAC_224,
254
+ KeySpec.HMAC_256,
255
+ KeySpec.HMAC_384,
256
+ KeySpec.HMAC_512,
257
+ ]:
255
258
  self.key_material = material
256
259
  else:
257
260
  key = crypto_serialization.load_der_private_key(material, password=None)
@@ -280,7 +283,7 @@ class KmsCryptoKey:
280
283
  class KmsKey:
281
284
  metadata: KeyMetadata
282
285
  crypto_key: KmsCryptoKey
283
- tags: Dict[str, str]
286
+ tags: dict[str, str]
284
287
  policy: str
285
288
  is_key_rotation_enabled: bool
286
289
  rotation_period_in_days: int
@@ -752,7 +755,7 @@ class KmsGrant:
752
755
  # keys. But, based on our understanding of AWS documentation for CreateGrant, ListGrants operations etc,
753
756
  # AWS has some set of fields for grants like it has for keys. So we are going to call them `metadata` here for
754
757
  # consistency.
755
- metadata: Dict
758
+ metadata: dict
756
759
  # Tokens are not a part of metadata, as their use is more limited and specific than for the rest of the
757
760
  # metadata: https://docs.aws.amazon.com/kms/latest/developerguide/grant-manage.html#using-grant-token
758
761
  # Tokens are used to refer to a grant in a short period right after the grant gets created. Normally it might
@@ -797,7 +800,7 @@ class KmsGrant:
797
800
  class KmsAlias:
798
801
  # Like with grants (see comment for KmsGrant), there is no mention of some specific object modeling metadata
799
802
  # for KMS aliases. But there is data that is some metadata, so we model it in a way similar to KeyMetadata for keys.
800
- metadata: Dict
803
+ metadata: dict
801
804
 
802
805
  def __init__(
803
806
  self,
@@ -827,25 +830,25 @@ class KeyImportState:
827
830
 
828
831
  class KmsStore(BaseStore):
829
832
  # maps key ids to keys
830
- keys: Dict[str, KmsKey] = LocalAttribute(default=dict)
833
+ keys: dict[str, KmsKey] = LocalAttribute(default=dict)
831
834
 
832
835
  # According to AWS documentation on grants https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html
833
836
  # "Cross-account use: Yes. You can retire a grant on a KMS key in a different AWS account."
834
837
 
835
838
  # maps grant ids to grants
836
- grants: Dict[str, KmsGrant] = LocalAttribute(default=dict)
839
+ grants: dict[str, KmsGrant] = LocalAttribute(default=dict)
837
840
 
838
841
  # maps from (grant names (used for idempotency), key id) to grant ids
839
- grant_names: Dict[Tuple[str, str], str] = LocalAttribute(default=dict)
842
+ grant_names: dict[tuple[str, str], str] = LocalAttribute(default=dict)
840
843
 
841
844
  # maps grant tokens to grant ids
842
- grant_tokens: Dict[str, str] = LocalAttribute(default=dict)
845
+ grant_tokens: dict[str, str] = LocalAttribute(default=dict)
843
846
 
844
847
  # maps key alias names to aliases
845
- aliases: Dict[str, KmsAlias] = LocalAttribute(default=dict)
848
+ aliases: dict[str, KmsAlias] = LocalAttribute(default=dict)
846
849
 
847
850
  # maps import tokens to import data
848
- imports: Dict[str, KeyImportState] = LocalAttribute(default=dict)
851
+ imports: dict[str, KeyImportState] = LocalAttribute(default=dict)
849
852
 
850
853
 
851
854
  kms_stores = AccountRegionBundle("kms", KmsStore)
@@ -3,10 +3,10 @@ import copy
3
3
  import datetime
4
4
  import logging
5
5
  import os
6
- from typing import Dict, Tuple
7
6
 
8
7
  from cryptography.exceptions import InvalidTag
9
- from cryptography.hazmat.primitives import hashes
8
+ from cryptography.hazmat.backends import default_backend
9
+ from cryptography.hazmat.primitives import hashes, keywrap
10
10
  from cryptography.hazmat.primitives.asymmetric import padding
11
11
 
12
12
  from localstack.aws.api import CommonServiceException, RequestContext, handler
@@ -85,6 +85,7 @@ from localstack.aws.api.kms import (
85
85
  MacAlgorithmSpec,
86
86
  MarkerType,
87
87
  MultiRegionKey,
88
+ MultiRegionKeyType,
88
89
  NotFoundException,
89
90
  NullableBooleanType,
90
91
  OriginType,
@@ -358,7 +359,7 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
358
359
  return store.aliases.get(alias_name)
359
360
 
360
361
  @staticmethod
361
- def _parse_key_id(key_id_or_arn: str, context: RequestContext) -> Tuple[str, str, str]:
362
+ def _parse_key_id(key_id_or_arn: str, context: RequestContext) -> tuple[str, str, str]:
362
363
  """
363
364
  Return locator attributes (account ID, region_name, key ID) of a given KMS key.
364
365
 
@@ -490,24 +491,32 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
490
491
  self, context: RequestContext, request: ReplicateKeyRequest
491
492
  ) -> ReplicateKeyResponse:
492
493
  account_id = context.account_id
493
- key = self._get_kms_key(account_id, context.region, request.get("KeyId"))
494
- key_id = key.metadata.get("KeyId")
495
- if not key.metadata.get("MultiRegion"):
494
+ primary_key = self._get_kms_key(account_id, context.region, request.get("KeyId"))
495
+ key_id = primary_key.metadata.get("KeyId")
496
+ key_arn = primary_key.metadata.get("Arn")
497
+ if not primary_key.metadata.get("MultiRegion"):
496
498
  raise UnsupportedOperationException(
497
499
  f"Unable to replicate a non-MultiRegion key {key_id}"
498
500
  )
499
501
  replica_region = request.get("ReplicaRegion")
500
502
  replicate_to_store = kms_stores[account_id][replica_region]
503
+
504
+ if (
505
+ primary_key.metadata.get("MultiRegionConfiguration", {}).get("MultiRegionKeyType")
506
+ != MultiRegionKeyType.PRIMARY
507
+ ):
508
+ raise UnsupportedOperationException(f"{key_arn} is not a multi-region primary key.")
509
+
501
510
  if key_id in replicate_to_store.keys:
502
511
  raise AlreadyExistsException(
503
512
  f"Unable to replicate key {key_id} to region {replica_region}, as the key "
504
513
  f"already exist there"
505
514
  )
506
- replica_key = copy.deepcopy(key)
515
+ replica_key = copy.deepcopy(primary_key)
507
516
  replica_key.replicate_metadata(request, account_id, replica_region)
508
517
  replicate_to_store.keys[key_id] = replica_key
509
518
 
510
- self.update_primary_key_with_replica_keys(key, replica_key, replica_region)
519
+ self.update_primary_key_with_replica_keys(primary_key, replica_key, replica_region)
511
520
 
512
521
  return ReplicateKeyResponse(ReplicaKeyMetadata=replica_key.metadata)
513
522
 
@@ -1164,22 +1173,10 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
1164
1173
  disabled_key_allowed=True,
1165
1174
  )
1166
1175
 
1167
- if import_state.wrapping_algo == AlgorithmSpec.RSAES_PKCS1_V1_5:
1168
- decrypt_padding = padding.PKCS1v15()
1169
- elif import_state.wrapping_algo == AlgorithmSpec.RSAES_OAEP_SHA_1:
1170
- decrypt_padding = padding.OAEP(padding.MGF1(hashes.SHA1()), hashes.SHA1(), None)
1171
- elif import_state.wrapping_algo == AlgorithmSpec.RSAES_OAEP_SHA_256:
1172
- decrypt_padding = padding.OAEP(padding.MGF1(hashes.SHA256()), hashes.SHA256(), None)
1173
- else:
1174
- raise KMSInvalidStateException(
1175
- f"Unsupported padding, requested wrapping algorithm:'{import_state.wrapping_algo}'"
1176
- )
1177
-
1178
1176
  # TODO check if there was already a key imported for this kms key
1179
1177
  # if so, it has to be identical. We cannot change keys by reimporting after deletion/expiry
1180
- key_material = import_state.key.crypto_key.key.decrypt(
1181
- encrypted_key_material, decrypt_padding
1182
- )
1178
+ key_material = self._decrypt_wrapped_key_material(import_state, encrypted_key_material)
1179
+
1183
1180
  if expiration_model:
1184
1181
  key_to_import_material_to.metadata["ExpirationModel"] = expiration_model
1185
1182
  else:
@@ -1419,9 +1416,7 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
1419
1416
  if key.metadata["KeySpec"] != KeySpec.SYMMETRIC_DEFAULT:
1420
1417
  raise UnsupportedOperationException()
1421
1418
  if key.metadata["Origin"] == OriginType.EXTERNAL:
1422
- raise UnsupportedOperationException(
1423
- f"{key.metadata['Arn']} origin is EXTERNAL which is not valid for this operation."
1424
- )
1419
+ raise NotImplementedError("Rotation of imported keys is not supported yet.")
1425
1420
 
1426
1421
  key.rotate_key_on_demand()
1427
1422
 
@@ -1553,7 +1548,7 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
1553
1548
  "Member must have length less than or equal to 4096"
1554
1549
  )
1555
1550
 
1556
- def _validate_grant_request(self, data: Dict):
1551
+ def _validate_grant_request(self, data: dict):
1557
1552
  if "KeyId" not in data or "GranteePrincipal" not in data or "Operations" not in data:
1558
1553
  raise ValidationError("Grant ID, key ID and grantee principal must be specified")
1559
1554
 
@@ -1564,6 +1559,47 @@ class KmsProvider(KmsApi, ServiceLifecycleHook):
1564
1559
  f" constraint: [Member must satisfy enum value set: {VALID_OPERATIONS}]"
1565
1560
  )
1566
1561
 
1562
+ def _decrypt_wrapped_key_material(
1563
+ self,
1564
+ import_state: KeyImportState,
1565
+ encrypted_key_material: CiphertextType,
1566
+ ) -> bytes:
1567
+ algo = import_state.wrapping_algo
1568
+ decrypt_key = import_state.key.crypto_key.key
1569
+
1570
+ match algo:
1571
+ case AlgorithmSpec.RSAES_PKCS1_V1_5:
1572
+ padding_scheme = padding.PKCS1v15()
1573
+ return decrypt_key.decrypt(encrypted_key_material, padding_scheme)
1574
+ case AlgorithmSpec.RSAES_OAEP_SHA_1:
1575
+ padding_scheme = padding.OAEP(padding.MGF1(hashes.SHA1()), hashes.SHA1(), None)
1576
+ return decrypt_key.decrypt(encrypted_key_material, padding_scheme)
1577
+ case AlgorithmSpec.RSAES_OAEP_SHA_256:
1578
+ padding_scheme = padding.OAEP(padding.MGF1(hashes.SHA256()), hashes.SHA256(), None)
1579
+ return decrypt_key.decrypt(encrypted_key_material, padding_scheme)
1580
+ case AlgorithmSpec.RSA_AES_KEY_WRAP_SHA_256:
1581
+ rsa_key_size_bytes = decrypt_key.key_size // 8
1582
+ wrapped_aes_key = encrypted_key_material[:rsa_key_size_bytes]
1583
+ wrapped_key_material = encrypted_key_material[rsa_key_size_bytes:]
1584
+
1585
+ aes_key = decrypt_key.decrypt(
1586
+ wrapped_aes_key,
1587
+ padding.OAEP(
1588
+ mgf=padding.MGF1(algorithm=hashes.SHA256()),
1589
+ algorithm=hashes.SHA256(),
1590
+ label=None,
1591
+ ),
1592
+ )
1593
+
1594
+ return keywrap.aes_key_unwrap_with_padding(
1595
+ aes_key, wrapped_key_material, default_backend()
1596
+ )
1597
+
1598
+ case _:
1599
+ raise KMSInvalidStateException(
1600
+ f"Unsupported padding, requested wrapping algorithm: '{algo}'"
1601
+ )
1602
+
1567
1603
  def _validate_plaintext_key_type_based(
1568
1604
  self,
1569
1605
  plaintext: PlaintextType,
@@ -2,7 +2,7 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  from pathlib import Path
5
- from typing import Optional, TypedDict
5
+ from typing import TypedDict
6
6
 
7
7
  import localstack.services.cloudformation.provider_utils as util
8
8
  from localstack.services.cloudformation.resource_provider import (
@@ -14,8 +14,8 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class KMSAliasProperties(TypedDict):
17
- AliasName: Optional[str]
18
- TargetKeyId: Optional[str]
17
+ AliasName: str | None
18
+ TargetKeyId: str | None
19
19
 
20
20
 
21
21
  REPEATED_INVOCATION = "repeated_invocation"
@@ -1,5 +1,3 @@
1
- from typing import Optional, Type
2
-
3
1
  from localstack.services.cloudformation.resource_provider import (
4
2
  CloudFormationResourceProviderPlugin,
5
3
  ResourceProvider,
@@ -10,7 +8,7 @@ class KMSAliasProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::KMS::Alias"
11
9
 
12
10
  def __init__(self):
13
- self.factory: Optional[Type[ResourceProvider]] = None
11
+ self.factory: type[ResourceProvider] | None = None
14
12
 
15
13
  def load(self):
16
14
  from localstack.services.kms.resource_providers.aws_kms_alias import KMSAliasProvider
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  import json
5
5
  from pathlib import Path
6
- from typing import Optional, TypedDict
6
+ from typing import TypedDict
7
7
 
8
8
  import localstack.services.cloudformation.provider_utils as util
9
9
  from localstack.services.cloudformation.resource_provider import (
@@ -15,22 +15,22 @@ from localstack.services.cloudformation.resource_provider import (
15
15
 
16
16
 
17
17
  class KMSKeyProperties(TypedDict):
18
- KeyPolicy: Optional[dict | str]
19
- Arn: Optional[str]
20
- Description: Optional[str]
21
- EnableKeyRotation: Optional[bool]
22
- Enabled: Optional[bool]
23
- KeyId: Optional[str]
24
- KeySpec: Optional[str]
25
- KeyUsage: Optional[str]
26
- MultiRegion: Optional[bool]
27
- PendingWindowInDays: Optional[int]
28
- Tags: Optional[list[Tag]]
18
+ KeyPolicy: dict | str | None
19
+ Arn: str | None
20
+ Description: str | None
21
+ EnableKeyRotation: bool | None
22
+ Enabled: bool | None
23
+ KeyId: str | None
24
+ KeySpec: str | None
25
+ KeyUsage: str | None
26
+ MultiRegion: bool | None
27
+ PendingWindowInDays: int | None
28
+ Tags: list[Tag] | None
29
29
 
30
30
 
31
31
  class Tag(TypedDict):
32
- Key: Optional[str]
33
- Value: Optional[str]
32
+ Key: str | None
33
+ Value: str | None
34
34
 
35
35
 
36
36
  REPEATED_INVOCATION = "repeated_invocation"
@@ -1,5 +1,3 @@
1
- from typing import Optional, Type
2
-
3
1
  from localstack.services.cloudformation.resource_provider import (
4
2
  CloudFormationResourceProviderPlugin,
5
3
  ResourceProvider,
@@ -10,7 +8,7 @@ class KMSKeyProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::KMS::Key"
11
9
 
12
10
  def __init__(self):
13
- self.factory: Optional[Type[ResourceProvider]] = None
11
+ self.factory: type[ResourceProvider] | None = None
14
12
 
15
13
  def load(self):
16
14
  from localstack.services.kms.resource_providers.aws_kms_key import KMSKeyProvider
@@ -1,5 +1,6 @@
1
1
  import re
2
- from typing import Callable, Tuple, TypeVar
2
+ from collections.abc import Callable
3
+ from typing import TypeVar
3
4
 
4
5
  from localstack.aws.api.kms import DryRunOperationException, Tag, TagException
5
6
  from localstack.services.kms.exceptions import ValidationException
@@ -8,7 +9,7 @@ from localstack.utils.aws.arns import ARN_PARTITION_REGEX
8
9
  T = TypeVar("T")
9
10
 
10
11
  KMS_KEY_ARN_PATTERN = re.compile(
11
- rf"{ARN_PARTITION_REGEX}:kms:(?P<region_name>[^:]+):(?P<account_id>\d{{12}}):key\/(?P<key_id>[^:]+)$"
12
+ rf"{ARN_PARTITION_REGEX}:kms:(?P<region_name>[^:]+):(?P<account_id>\d{{12}}):((?=key/)key/|(?=alias/))(?P<key_id>[^:]+)$"
12
13
  )
13
14
 
14
15
 
@@ -20,7 +21,7 @@ def get_hash_algorithm(signing_algorithm: str) -> str:
20
21
  return "_".join(signing_algorithm.rsplit(sep="_", maxsplit=-2)[-2:])
21
22
 
22
23
 
23
- def parse_key_arn(key_arn: str) -> Tuple[str, str, str]:
24
+ def parse_key_arn(key_arn: str) -> tuple[str, str, str]:
24
25
  """
25
26
  Parse a valid KMS key arn into its constituents.
26
27
 
@@ -6,8 +6,9 @@ import datetime
6
6
  import random
7
7
  import re
8
8
  import string
9
- from typing import TYPE_CHECKING, Any, Optional, Tuple
9
+ from typing import TYPE_CHECKING, Any
10
10
 
11
+ from localstack import config
11
12
  from localstack.aws.api import CommonServiceException, RequestContext
12
13
  from localstack.aws.api import lambda_ as api_spec
13
14
  from localstack.aws.api.lambda_ import (
@@ -192,7 +193,7 @@ def map_csc(model: "CodeSigningConfig") -> api_spec.CodeSigningConfig:
192
193
  )
193
194
 
194
195
 
195
- def get_config_for_url(store: "LambdaStore", url_id: str) -> "Optional[FunctionUrlConfig]":
196
+ def get_config_for_url(store: "LambdaStore", url_id: str) -> "FunctionUrlConfig | None":
196
197
  """
197
198
  Get a config object when resolving a URL
198
199
 
@@ -269,7 +270,7 @@ def function_locators_from_arn(arn: str) -> tuple[str | None, str | None, str |
269
270
  return None, None, None, None
270
271
 
271
272
 
272
- def get_account_and_region(function_arn_or_name: str, context: RequestContext) -> Tuple[str, str]:
273
+ def get_account_and_region(function_arn_or_name: str, context: RequestContext) -> tuple[str, str]:
273
274
  """
274
275
  Takes a full ARN, partial ARN or a name. Returns account ID and region from ARN if available, else
275
276
  falls back to context account ID and region.
@@ -345,11 +346,11 @@ def build_statement(
345
346
  statement_id: str,
346
347
  action: str,
347
348
  principal: str,
348
- source_arn: Optional[str] = None,
349
- source_account: Optional[str] = None,
350
- principal_org_id: Optional[str] = None,
351
- event_source_token: Optional[str] = None,
352
- auth_type: Optional[FunctionUrlAuthType] = None,
349
+ source_arn: str | None = None,
350
+ source_account: str | None = None,
351
+ principal_org_id: str | None = None,
352
+ event_source_token: str | None = None,
353
+ auth_type: FunctionUrlAuthType | None = None,
353
354
  ) -> dict[str, Any]:
354
355
  statement = {
355
356
  "Sid": statement_id,
@@ -377,7 +378,7 @@ def build_statement(
377
378
  Type="User",
378
379
  )
379
380
 
380
- condition = dict()
381
+ condition = {}
381
382
  if auth_type:
382
383
  update = {"StringEquals": {"lambda:FunctionUrlAuthType": auth_type}}
383
384
  condition = merge_recursive(condition, update)
@@ -425,7 +426,7 @@ def unqualified_lambda_arn(function_name: str, account: str, region: str):
425
426
 
426
427
 
427
428
  def qualified_lambda_arn(
428
- function_name: str, qualifier: Optional[str], account: str, region: str
429
+ function_name: str, qualifier: str | None, account: str, region: str
429
430
  ) -> str:
430
431
  """
431
432
  Generate a qualified lambda arn
@@ -440,7 +441,7 @@ def qualified_lambda_arn(
440
441
  return f"{unqualified_lambda_arn(function_name=function_name, account=account, region=region)}:{qualifier}"
441
442
 
442
443
 
443
- def lambda_arn(function_name: str, qualifier: Optional[str], account: str, region: str) -> str:
444
+ def lambda_arn(function_name: str, qualifier: str | None, account: str, region: str) -> str:
444
445
  """
445
446
  Return the lambda arn for the given parameters, with a qualifier if supplied, without otherwise
446
447
 
@@ -637,7 +638,7 @@ def map_alias_out(alias: "VersionAlias", function: "Function") -> AliasConfigura
637
638
  )
638
639
 
639
640
 
640
- def validate_and_set_batch_size(service: str, batch_size: Optional[int] = None) -> int:
641
+ def validate_and_set_batch_size(service: str, batch_size: int | None = None) -> int:
641
642
  min_batch_size = 1
642
643
 
643
644
  BATCH_SIZE_RANGES = {
@@ -665,7 +666,9 @@ def validate_and_set_batch_size(service: str, batch_size: Optional[int] = None)
665
666
  def map_layer_out(layer_version: "LayerVersion") -> PublishLayerVersionResponse:
666
667
  return PublishLayerVersionResponse(
667
668
  Content=LayerVersionContentOutput(
668
- Location=layer_version.code.generate_presigned_url(),
669
+ Location=layer_version.code.generate_presigned_url(
670
+ endpoint_url=config.external_service_url()
671
+ ),
669
672
  CodeSha256=layer_version.code.code_sha256,
670
673
  CodeSize=layer_version.code.code_size,
671
674
  # SigningProfileVersionArn="", # same as in function configuration
@@ -690,7 +693,7 @@ def layer_version_arn(layer_name: str, account: str, region: str, version: str):
690
693
  return f"arn:{get_partition(region)}:lambda:{region}:{account}:layer:{layer_name}:{version}"
691
694
 
692
695
 
693
- def parse_layer_arn(layer_version_arn: str) -> Tuple[str, str, str, str]:
696
+ def parse_layer_arn(layer_version_arn: str) -> tuple[str, str, str, str]:
694
697
  return LAYER_VERSION_ARN_PATTERN.match(layer_version_arn).group(
695
698
  "region_name", "account_id", "layer_name", "layer_version"
696
699
  )
@@ -715,12 +718,12 @@ def validate_layer_runtimes_and_architectures(
715
718
 
716
719
  if compatible_runtimes and set(compatible_runtimes).difference(ALL_RUNTIMES):
717
720
  constraint = f"Member must satisfy enum value set: {VALID_RUNTIMES}"
718
- validation_msg = f"Value '[{', '.join([s for s in compatible_runtimes])}]' at 'compatibleRuntimes' failed to satisfy constraint: {constraint}"
721
+ validation_msg = f"Value '[{', '.join(list(compatible_runtimes))}]' at 'compatibleRuntimes' failed to satisfy constraint: {constraint}"
719
722
  validations.append(validation_msg)
720
723
 
721
724
  if compatible_architectures and set(compatible_architectures).difference(ARCHITECTURES):
722
725
  constraint = "[Member must satisfy enum value set: [x86_64, arm64]]"
723
- validation_msg = f"Value '[{', '.join([s for s in compatible_architectures])}]' at 'compatibleArchitectures' failed to satisfy constraint: Member must satisfy constraint: {constraint}"
726
+ validation_msg = f"Value '[{', '.join(list(compatible_architectures))}]' at 'compatibleArchitectures' failed to satisfy constraint: Member must satisfy constraint: {constraint}"
724
727
  validations.append(validation_msg)
725
728
 
726
729
  return validations
@@ -1,5 +1,5 @@
1
1
  import urllib.parse
2
- from typing import List, TypedDict
2
+ from typing import TypedDict
3
3
 
4
4
  from rolo import Request, route
5
5
 
@@ -14,7 +14,7 @@ from localstack.services.lambda_.runtimes import (
14
14
 
15
15
 
16
16
  class LambdaRuntimesResponse(TypedDict, total=False):
17
- Runtimes: List[Runtime]
17
+ Runtimes: list[Runtime]
18
18
 
19
19
 
20
20
  class LambdaCustomEndpoints:
@@ -1,4 +1,4 @@
1
- from typing import Callable
1
+ from collections.abc import Callable
2
2
 
3
3
  import botocore.config
4
4
 
@@ -18,6 +18,7 @@ from localstack.aws.api.pipes import (
18
18
  PipeTargetParameters,
19
19
  )
20
20
  from localstack.services.lambda_ import hooks as lambda_hooks
21
+ from localstack.services.lambda_ import ldm
21
22
  from localstack.services.lambda_.event_source_mapping.esm_event_processor import (
22
23
  EsmEventProcessor,
23
24
  )
@@ -37,10 +38,6 @@ from localstack.services.lambda_.event_source_mapping.pollers.sqs_poller import
37
38
  SqsPoller,
38
39
  )
39
40
  from localstack.services.lambda_.event_source_mapping.senders.lambda_sender import LambdaSender
40
- from localstack.services.lambda_.lambda_debug_mode.ldm import (
41
- DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS,
42
- LDM,
43
- )
44
41
  from localstack.utils.aws.arns import parse_arn
45
42
  from localstack.utils.aws.client_types import ServicePrincipal
46
43
 
@@ -65,8 +62,8 @@ class EsmWorkerFactory:
65
62
  # Sender (always Lambda)
66
63
  function_arn = self.esm_config["FunctionArn"]
67
64
 
68
- if LDM.is_enabled():
69
- timeout_seconds = DEFAULT_LAMBDA_DEBUG_MODE_TIMEOUT_SECONDS
65
+ if ldm.IS_LDM_ENABLED:
66
+ timeout_seconds = ldm.DEFAULT_LDM_TIMEOUT_SECONDS
70
67
  else:
71
68
  # 900s is the maximum amount of time a Lambda can run for.
72
69
  lambda_max_timeout_seconds = 900
@@ -1,5 +1,5 @@
1
1
  import json
2
- from datetime import datetime, timezone
2
+ from datetime import UTC, datetime
3
3
 
4
4
  import botocore
5
5
  from botocore.client import BaseClient
@@ -57,7 +57,7 @@ def get_standardized_service_name(service_name: str) -> str:
57
57
 
58
58
 
59
59
  def get_current_time() -> datetime:
60
- return datetime.now(tz=timezone.utc)
60
+ return datetime.now(tz=UTC)
61
61
 
62
62
 
63
63
  def get_datetime_from_timestamp(timestamp: float) -> datetime:
@@ -4,8 +4,8 @@ import threading
4
4
  from abc import abstractmethod
5
5
  from bisect import bisect_left
6
6
  from collections import defaultdict
7
+ from collections.abc import Iterator
7
8
  from datetime import datetime
8
- from typing import Iterator
9
9
 
10
10
  from botocore.client import BaseClient
11
11
  from botocore.exceptions import ClientError
@@ -1,6 +1,7 @@
1
1
  import sys
2
+ from collections.abc import Iterable, Iterator
2
3
  from itertools import islice
3
- from typing import Any, Iterable, Iterator
4
+ from typing import Any
4
5
 
5
6
 
6
7
  def batched(iterable, n):
@@ -2,19 +2,24 @@
2
2
 
3
3
  from localstack.runtime.hooks import hook_spec
4
4
 
5
+ HOOKS_LAMBDA_CREATE_FUNCTION_VERSION = "localstack.hooks.lambda_create_function_version"
6
+ HOOKS_LAMBDA_DELETE_FUNCTION_VERSION = "localstack.hooks.lambda_delete_function_version"
5
7
  HOOKS_LAMBDA_START_DOCKER_EXECUTOR = "localstack.hooks.lambda_start_docker_executor"
6
8
  HOOKS_LAMBDA_PREPARE_DOCKER_EXECUTOR = "localstack.hooks.lambda_prepare_docker_executors"
7
9
  HOOKS_LAMBDA_INJECT_LAYER_FETCHER = "localstack.hooks.lambda_inject_layer_fetcher"
10
+ HOOKS_LAMBDA_INJECT_LDM_PROVISIONER = "localstack.hooks.lambda_inject_ldm_provisioner"
8
11
  HOOKS_LAMBDA_PREBUILD_ENVIRONMENT_IMAGE = "localstack.hooks.lambda_prebuild_environment_image"
9
12
  HOOKS_LAMBDA_CREATE_EVENT_SOURCE_POLLER = "localstack.hooks.lambda_create_event_source_poller"
10
13
  HOOKS_LAMBDA_SET_EVENT_SOURCE_CONFIG_DEFAULTS = (
11
14
  "localstack.hooks.lambda_set_event_source_config_defaults"
12
15
  )
13
16
 
14
-
17
+ create_function_version = hook_spec(HOOKS_LAMBDA_CREATE_FUNCTION_VERSION)
18
+ delete_function_version = hook_spec(HOOKS_LAMBDA_DELETE_FUNCTION_VERSION)
15
19
  start_docker_executor = hook_spec(HOOKS_LAMBDA_START_DOCKER_EXECUTOR)
16
20
  prepare_docker_executor = hook_spec(HOOKS_LAMBDA_PREPARE_DOCKER_EXECUTOR)
17
21
  inject_layer_fetcher = hook_spec(HOOKS_LAMBDA_INJECT_LAYER_FETCHER)
22
+ inject_ldm_provisioner = hook_spec(HOOKS_LAMBDA_INJECT_LDM_PROVISIONER)
18
23
  prebuild_environment_image = hook_spec(HOOKS_LAMBDA_PREBUILD_ENVIRONMENT_IMAGE)
19
24
  create_event_source_poller = hook_spec(HOOKS_LAMBDA_CREATE_EVENT_SOURCE_POLLER)
20
25
  set_event_source_config_defaults = hook_spec(HOOKS_LAMBDA_SET_EVENT_SOURCE_CONFIG_DEFAULTS)
@@ -2,7 +2,6 @@ import contextlib
2
2
  import logging
3
3
  from collections import defaultdict
4
4
  from concurrent.futures import Future, ThreadPoolExecutor
5
- from typing import ContextManager
6
5
 
7
6
  from localstack.services.lambda_.invocation.execution_environment import (
8
7
  EnvironmentStartupTimeoutException,
@@ -44,7 +43,7 @@ class AssignmentService(OtherServiceEndpoint):
44
43
  version_manager_id: str,
45
44
  function_version: FunctionVersion,
46
45
  provisioning_type: InitializationType,
47
- ) -> ContextManager[ExecutionEnvironment]:
46
+ ) -> contextlib.AbstractContextManager[ExecutionEnvironment]:
48
47
  applicable_envs = (
49
48
  env
50
49
  for env in self.environments[version_manager_id].values()