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
@@ -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,151 +15,151 @@ from localstack.services.cloudformation.resource_provider import (
15
15
 
16
16
 
17
17
  class OpenSearchServiceDomainProperties(TypedDict):
18
- AccessPolicies: Optional[dict]
19
- AdvancedOptions: Optional[dict]
20
- AdvancedSecurityOptions: Optional[AdvancedSecurityOptionsInput]
21
- Arn: Optional[str]
22
- ClusterConfig: Optional[ClusterConfig]
23
- CognitoOptions: Optional[CognitoOptions]
24
- DomainArn: Optional[str]
25
- DomainEndpoint: Optional[str]
26
- DomainEndpointOptions: Optional[DomainEndpointOptions]
27
- DomainEndpoints: Optional[dict]
28
- DomainName: Optional[str]
29
- EBSOptions: Optional[EBSOptions]
30
- EncryptionAtRestOptions: Optional[EncryptionAtRestOptions]
31
- EngineVersion: Optional[str]
32
- Id: Optional[str]
33
- LogPublishingOptions: Optional[dict]
34
- NodeToNodeEncryptionOptions: Optional[NodeToNodeEncryptionOptions]
35
- OffPeakWindowOptions: Optional[OffPeakWindowOptions]
36
- ServiceSoftwareOptions: Optional[ServiceSoftwareOptions]
37
- SnapshotOptions: Optional[SnapshotOptions]
38
- SoftwareUpdateOptions: Optional[SoftwareUpdateOptions]
39
- Tags: Optional[list[Tag]]
40
- VPCOptions: Optional[VPCOptions]
18
+ AccessPolicies: dict | None
19
+ AdvancedOptions: dict | None
20
+ AdvancedSecurityOptions: AdvancedSecurityOptionsInput | None
21
+ Arn: str | None
22
+ ClusterConfig: ClusterConfig | None
23
+ CognitoOptions: CognitoOptions | None
24
+ DomainArn: str | None
25
+ DomainEndpoint: str | None
26
+ DomainEndpointOptions: DomainEndpointOptions | None
27
+ DomainEndpoints: dict | None
28
+ DomainName: str | None
29
+ EBSOptions: EBSOptions | None
30
+ EncryptionAtRestOptions: EncryptionAtRestOptions | None
31
+ EngineVersion: str | None
32
+ Id: str | None
33
+ LogPublishingOptions: dict | None
34
+ NodeToNodeEncryptionOptions: NodeToNodeEncryptionOptions | None
35
+ OffPeakWindowOptions: OffPeakWindowOptions | None
36
+ ServiceSoftwareOptions: ServiceSoftwareOptions | None
37
+ SnapshotOptions: SnapshotOptions | None
38
+ SoftwareUpdateOptions: SoftwareUpdateOptions | None
39
+ Tags: list[Tag] | None
40
+ VPCOptions: VPCOptions | None
41
41
 
42
42
 
43
43
  class ZoneAwarenessConfig(TypedDict):
44
- AvailabilityZoneCount: Optional[int]
44
+ AvailabilityZoneCount: int | None
45
45
 
46
46
 
47
47
  class ClusterConfig(TypedDict):
48
- DedicatedMasterCount: Optional[int]
49
- DedicatedMasterEnabled: Optional[bool]
50
- DedicatedMasterType: Optional[str]
51
- InstanceCount: Optional[int]
52
- InstanceType: Optional[str]
53
- WarmCount: Optional[int]
54
- WarmEnabled: Optional[bool]
55
- WarmType: Optional[str]
56
- ZoneAwarenessConfig: Optional[ZoneAwarenessConfig]
57
- ZoneAwarenessEnabled: Optional[bool]
48
+ DedicatedMasterCount: int | None
49
+ DedicatedMasterEnabled: bool | None
50
+ DedicatedMasterType: str | None
51
+ InstanceCount: int | None
52
+ InstanceType: str | None
53
+ WarmCount: int | None
54
+ WarmEnabled: bool | None
55
+ WarmType: str | None
56
+ ZoneAwarenessConfig: ZoneAwarenessConfig | None
57
+ ZoneAwarenessEnabled: bool | None
58
58
 
59
59
 
60
60
  class SnapshotOptions(TypedDict):
61
- AutomatedSnapshotStartHour: Optional[int]
61
+ AutomatedSnapshotStartHour: int | None
62
62
 
63
63
 
64
64
  class VPCOptions(TypedDict):
65
- SecurityGroupIds: Optional[list[str]]
66
- SubnetIds: Optional[list[str]]
65
+ SecurityGroupIds: list[str] | None
66
+ SubnetIds: list[str] | None
67
67
 
68
68
 
69
69
  class NodeToNodeEncryptionOptions(TypedDict):
70
- Enabled: Optional[bool]
70
+ Enabled: bool | None
71
71
 
72
72
 
73
73
  class DomainEndpointOptions(TypedDict):
74
- CustomEndpoint: Optional[str]
75
- CustomEndpointCertificateArn: Optional[str]
76
- CustomEndpointEnabled: Optional[bool]
77
- EnforceHTTPS: Optional[bool]
78
- TLSSecurityPolicy: Optional[str]
74
+ CustomEndpoint: str | None
75
+ CustomEndpointCertificateArn: str | None
76
+ CustomEndpointEnabled: bool | None
77
+ EnforceHTTPS: bool | None
78
+ TLSSecurityPolicy: str | None
79
79
 
80
80
 
81
81
  class CognitoOptions(TypedDict):
82
- Enabled: Optional[bool]
83
- IdentityPoolId: Optional[str]
84
- RoleArn: Optional[str]
85
- UserPoolId: Optional[str]
82
+ Enabled: bool | None
83
+ IdentityPoolId: str | None
84
+ RoleArn: str | None
85
+ UserPoolId: str | None
86
86
 
87
87
 
88
88
  class MasterUserOptions(TypedDict):
89
- MasterUserARN: Optional[str]
90
- MasterUserName: Optional[str]
91
- MasterUserPassword: Optional[str]
89
+ MasterUserARN: str | None
90
+ MasterUserName: str | None
91
+ MasterUserPassword: str | None
92
92
 
93
93
 
94
94
  class Idp(TypedDict):
95
- EntityId: Optional[str]
96
- MetadataContent: Optional[str]
95
+ EntityId: str | None
96
+ MetadataContent: str | None
97
97
 
98
98
 
99
99
  class SAMLOptions(TypedDict):
100
- Enabled: Optional[bool]
101
- Idp: Optional[Idp]
102
- MasterBackendRole: Optional[str]
103
- MasterUserName: Optional[str]
104
- RolesKey: Optional[str]
105
- SessionTimeoutMinutes: Optional[int]
106
- SubjectKey: Optional[str]
100
+ Enabled: bool | None
101
+ Idp: Idp | None
102
+ MasterBackendRole: str | None
103
+ MasterUserName: str | None
104
+ RolesKey: str | None
105
+ SessionTimeoutMinutes: int | None
106
+ SubjectKey: str | None
107
107
 
108
108
 
109
109
  class AdvancedSecurityOptionsInput(TypedDict):
110
- AnonymousAuthDisableDate: Optional[str]
111
- AnonymousAuthEnabled: Optional[bool]
112
- Enabled: Optional[bool]
113
- InternalUserDatabaseEnabled: Optional[bool]
114
- MasterUserOptions: Optional[MasterUserOptions]
115
- SAMLOptions: Optional[SAMLOptions]
110
+ AnonymousAuthDisableDate: str | None
111
+ AnonymousAuthEnabled: bool | None
112
+ Enabled: bool | None
113
+ InternalUserDatabaseEnabled: bool | None
114
+ MasterUserOptions: MasterUserOptions | None
115
+ SAMLOptions: SAMLOptions | None
116
116
 
117
117
 
118
118
  class EBSOptions(TypedDict):
119
- EBSEnabled: Optional[bool]
120
- Iops: Optional[int]
121
- Throughput: Optional[int]
122
- VolumeSize: Optional[int]
123
- VolumeType: Optional[str]
119
+ EBSEnabled: bool | None
120
+ Iops: int | None
121
+ Throughput: int | None
122
+ VolumeSize: int | None
123
+ VolumeType: str | None
124
124
 
125
125
 
126
126
  class EncryptionAtRestOptions(TypedDict):
127
- Enabled: Optional[bool]
128
- KmsKeyId: Optional[str]
127
+ Enabled: bool | None
128
+ KmsKeyId: str | None
129
129
 
130
130
 
131
131
  class Tag(TypedDict):
132
- Key: Optional[str]
133
- Value: Optional[str]
132
+ Key: str | None
133
+ Value: str | None
134
134
 
135
135
 
136
136
  class ServiceSoftwareOptions(TypedDict):
137
- AutomatedUpdateDate: Optional[str]
138
- Cancellable: Optional[bool]
139
- CurrentVersion: Optional[str]
140
- Description: Optional[str]
141
- NewVersion: Optional[str]
142
- OptionalDeployment: Optional[bool]
143
- UpdateAvailable: Optional[bool]
144
- UpdateStatus: Optional[str]
137
+ AutomatedUpdateDate: str | None
138
+ Cancellable: bool | None
139
+ CurrentVersion: str | None
140
+ Description: str | None
141
+ NewVersion: str | None
142
+ OptionalDeployment: bool | None
143
+ UpdateAvailable: bool | None
144
+ UpdateStatus: str | None
145
145
 
146
146
 
147
147
  class WindowStartTime(TypedDict):
148
- Hours: Optional[int]
149
- Minutes: Optional[int]
148
+ Hours: int | None
149
+ Minutes: int | None
150
150
 
151
151
 
152
152
  class OffPeakWindow(TypedDict):
153
- WindowStartTime: Optional[WindowStartTime]
153
+ WindowStartTime: WindowStartTime | None
154
154
 
155
155
 
156
156
  class OffPeakWindowOptions(TypedDict):
157
- Enabled: Optional[bool]
158
- OffPeakWindow: Optional[OffPeakWindow]
157
+ Enabled: bool | None
158
+ OffPeakWindow: OffPeakWindow | None
159
159
 
160
160
 
161
161
  class SoftwareUpdateOptions(TypedDict):
162
- AutoSoftwareUpdateEnabled: Optional[bool]
162
+ AutoSoftwareUpdateEnabled: bool | None
163
163
 
164
164
 
165
165
  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 OpenSearchServiceDomainProviderPlugin(CloudFormationResourceProviderPlugin
10
8
  name = "AWS::OpenSearchService::Domain"
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.opensearch.resource_providers.aws_opensearchservice_domain import (
@@ -6,8 +6,6 @@ the latest install_versions from the github repository tags. Run::
6
6
 
7
7
  """
8
8
 
9
- from typing import Dict
10
-
11
9
  import semver
12
10
 
13
11
  from localstack.aws.api.opensearch import CompatibleVersionsMap, EngineType
@@ -15,20 +13,24 @@ from localstack.utils.common import get_arch
15
13
 
16
14
  # Internal representation of the OpenSearch versions (without the "OpenSearch_" prefix)
17
15
  _opensearch_install_versions = {
16
+ "3.1": "3.1.0",
17
+ "2.19": "2.19.3",
18
+ "2.17": "2.17.1",
19
+ "2.15": "2.15.0",
18
20
  "2.13": "2.13.0",
19
21
  "2.11": "2.11.1",
20
22
  "2.9": "2.9.0",
21
23
  "2.7": "2.7.0",
22
24
  "2.5": "2.5.0",
23
25
  "2.3": "2.3.0",
24
- "1.3": "1.3.12",
26
+ "1.3": "1.3.20",
25
27
  "1.2": "1.2.4",
26
28
  "1.1": "1.1.0",
27
29
  "1.0": "1.0.0",
28
30
  }
29
31
  # Internal representation of the Elasticsearch versions (without the "Elasticsearch_" prefix)
30
32
  _elasticsearch_install_versions = {
31
- "7.10": "7.10.0",
33
+ "7.10": "7.10.2",
32
34
  "7.9": "7.9.3",
33
35
  "7.8": "7.8.1",
34
36
  "7.7": "7.7.1",
@@ -223,6 +225,9 @@ compatible_versions = [
223
225
  "OpenSearch_2.9",
224
226
  "OpenSearch_2.11",
225
227
  "OpenSearch_2.13",
228
+ "OpenSearch_2.15",
229
+ "OpenSearch_2.17",
230
+ "OpenSearch_2.19",
226
231
  ],
227
232
  ),
228
233
  CompatibleVersionsMap(
@@ -233,28 +238,68 @@ compatible_versions = [
233
238
  "OpenSearch_2.9",
234
239
  "OpenSearch_2.11",
235
240
  "OpenSearch_2.13",
241
+ "OpenSearch_2.15",
242
+ "OpenSearch_2.17",
243
+ "OpenSearch_2.19",
236
244
  ],
237
245
  ),
238
246
  CompatibleVersionsMap(
239
247
  SourceVersion="OpenSearch_2.5",
240
- TargetVersions=["OpenSearch_2.7", "OpenSearch_2.9", "OpenSearch_2.11", "OpenSearch_2.13"],
248
+ TargetVersions=[
249
+ "OpenSearch_2.7",
250
+ "OpenSearch_2.9",
251
+ "OpenSearch_2.11",
252
+ "OpenSearch_2.13",
253
+ "OpenSearch_2.15",
254
+ "OpenSearch_2.17",
255
+ "OpenSearch_2.19",
256
+ ],
241
257
  ),
242
258
  CompatibleVersionsMap(
243
259
  SourceVersion="OpenSearch_2.7",
244
- TargetVersions=["OpenSearch_2.9", "OpenSearch_2.11", "OpenSearch_2.13"],
260
+ TargetVersions=[
261
+ "OpenSearch_2.9",
262
+ "OpenSearch_2.11",
263
+ "OpenSearch_2.13",
264
+ "OpenSearch_2.15",
265
+ "OpenSearch_2.17",
266
+ "OpenSearch_2.19",
267
+ ],
245
268
  ),
246
269
  CompatibleVersionsMap(
247
270
  SourceVersion="OpenSearch_2.9",
248
- TargetVersions=["OpenSearch_2.11", "OpenSearch_2.13"],
271
+ TargetVersions=[
272
+ "OpenSearch_2.11",
273
+ "OpenSearch_2.13",
274
+ "OpenSearch_2.15",
275
+ "OpenSearch_2.17",
276
+ "OpenSearch_2.19",
277
+ ],
249
278
  ),
250
279
  CompatibleVersionsMap(
251
280
  SourceVersion="OpenSearch_2.11",
252
- TargetVersions=["OpenSearch_2.13"],
281
+ TargetVersions=["OpenSearch_2.13", "OpenSearch_2.15", "OpenSearch_2.17", "OpenSearch_2.19"],
282
+ ),
283
+ CompatibleVersionsMap(
284
+ SourceVersion="OpenSearch_2.13",
285
+ TargetVersions=["OpenSearch_2.15", "OpenSearch_2.17", "OpenSearch_2.19"],
286
+ ),
287
+ CompatibleVersionsMap(
288
+ SourceVersion="OpenSearch_2.15",
289
+ TargetVersions=["OpenSearch_2.17", "OpenSearch_2.19"],
290
+ ),
291
+ CompatibleVersionsMap(
292
+ SourceVersion="OpenSearch_2.17",
293
+ TargetVersions=["OpenSearch_2.19"],
294
+ ),
295
+ CompatibleVersionsMap(
296
+ SourceVersion="OpenSearch_2.19",
297
+ TargetVersions=["OpenSearch_3.1"],
253
298
  ),
254
299
  ]
255
300
 
256
301
 
257
- def get_install_type_and_version(version: str) -> (EngineType, str):
302
+ def get_install_type_and_version(version: str) -> tuple[EngineType, str]:
258
303
  engine_type = EngineType(version.split("_")[0])
259
304
 
260
305
  if version not in install_versions:
@@ -299,9 +344,11 @@ def get_download_url(install_version: str, engine_type: EngineType) -> str:
299
344
  return _opensearch_url(install_version)
300
345
  elif engine_type == EngineType.Elasticsearch:
301
346
  return _es_url(install_version)
347
+ else:
348
+ raise ValueError(f"Unknown OpenSearch engine type: {engine_type}")
302
349
 
303
350
 
304
- def fetch_latest_versions() -> Dict[str, str]: # pragma: no cover
351
+ def fetch_latest_versions() -> dict[str, str]: # pragma: no cover
305
352
  """
306
353
  Fetches from the opensearch git repository tags the latest patch versions for a minor version and returns a
307
354
  dictionary where the key corresponds to the minor version, and the value to the patch version. Run this once in a
@@ -3,9 +3,10 @@ import functools
3
3
  import logging
4
4
  import threading
5
5
  from collections import defaultdict
6
+ from collections.abc import Callable
6
7
  from concurrent.futures import ThreadPoolExecutor
7
8
  from enum import Enum
8
- from typing import Callable, Dict, List, Optional, Protocol, Tuple
9
+ from typing import Protocol
9
10
 
10
11
  from plux import Plugin, PluginLifecycleListener, PluginManager, PluginSpec
11
12
 
@@ -190,7 +191,7 @@ class ServiceContainer:
190
191
  service: Service
191
192
  state: ServiceState
192
193
  lock: threading.RLock
193
- errors: List[Exception]
194
+ errors: list[Exception]
194
195
 
195
196
  def __init__(self, service: Service, state=ServiceState.UNKNOWN):
196
197
  self.service = service
@@ -236,13 +237,13 @@ class ServiceContainer:
236
237
  class ServiceManager:
237
238
  def __init__(self) -> None:
238
239
  super().__init__()
239
- self._services: Dict[str, ServiceContainer] = {}
240
+ self._services: dict[str, ServiceContainer] = {}
240
241
  self._mutex = threading.RLock()
241
242
 
242
- def get_service_container(self, name: str) -> Optional[ServiceContainer]:
243
+ def get_service_container(self, name: str) -> ServiceContainer | None:
243
244
  return self._services.get(name)
244
245
 
245
- def get_service(self, name: str) -> Optional[Service]:
246
+ def get_service(self, name: str) -> Service | None:
246
247
  container = self.get_service_container(name)
247
248
  return container.service if container else None
248
249
 
@@ -252,7 +253,7 @@ class ServiceManager:
252
253
 
253
254
  return True
254
255
 
255
- def list_available(self) -> List[str]:
256
+ def list_available(self) -> list[str]:
256
257
  return list(self._services.keys())
257
258
 
258
259
  def exists(self, name: str) -> bool:
@@ -268,11 +269,11 @@ class ServiceManager:
268
269
  def check_all(self):
269
270
  return any(self.check(service_name) for service_name in self.list_available())
270
271
 
271
- def get_state(self, name: str) -> Optional[ServiceState]:
272
+ def get_state(self, name: str) -> ServiceState | None:
272
273
  container = self.get_service_container(name)
273
274
  return container.state if container else None
274
275
 
275
- def get_states(self) -> Dict[str, ServiceState]:
276
+ def get_states(self) -> dict[str, ServiceState]:
276
277
  return {name: self.get_state(name) for name in self.list_available()}
277
278
 
278
279
  @log_duration()
@@ -285,19 +286,19 @@ class ServiceManager:
285
286
  container = self.get_service_container(name)
286
287
 
287
288
  if not container:
288
- raise ValueError("no such service %s" % name)
289
+ raise ValueError(f"no such service {name}")
289
290
 
290
291
  if container.state == ServiceState.STARTING:
291
292
  if not poll_condition(lambda: container.state != ServiceState.STARTING, timeout=30):
292
- raise TimeoutError("gave up waiting for service %s to start" % name)
293
+ raise TimeoutError(f"gave up waiting for service {name} to start")
293
294
 
294
295
  if container.state == ServiceState.STOPPING:
295
296
  if not poll_condition(lambda: container.state == ServiceState.STOPPED, timeout=30):
296
- raise TimeoutError("gave up waiting for service %s to stop" % name)
297
+ raise TimeoutError(f"gave up waiting for service {name} to stop")
297
298
 
298
299
  with container.lock:
299
300
  if container.state == ServiceState.DISABLED:
300
- raise ServiceDisabled("service %s is disabled" % name)
301
+ raise ServiceDisabled(f"service {name} is disabled")
301
302
 
302
303
  if container.state == ServiceState.RUNNING:
303
304
  return container.service
@@ -313,7 +314,7 @@ class ServiceManager:
313
314
  raise container.errors[-1]
314
315
 
315
316
  raise ServiceStateException(
316
- "service %s is not ready (%s) and could not be started" % (name, container.state)
317
+ f"service {name} is not ready ({container.state}) and could not be started"
317
318
  )
318
319
 
319
320
  # legacy map compatibility
@@ -397,13 +398,13 @@ class ServicePluginErrorCollector(PluginLifecycleListener):
397
398
  A PluginLifecycleListener that collects errors related to service plugins.
398
399
  """
399
400
 
400
- errors: Dict[Tuple[str, str], Exception] # keys are: (api, provider)
401
+ errors: dict[tuple[str, str], Exception] # keys are: (api, provider)
401
402
 
402
- def __init__(self, errors: Dict[str, Exception] = None) -> None:
403
+ def __init__(self, errors: dict[str, Exception] = None) -> None:
403
404
  super().__init__()
404
405
  self.errors = errors or {}
405
406
 
406
- def get_key(self, plugin_name) -> Tuple[str, str]:
407
+ def get_key(self, plugin_name) -> tuple[str, str]:
407
408
  # the convention is <api>:<provider>, currently we don't really expose the provider
408
409
  # TODO: faulty plugin names would break this
409
410
  return tuple(plugin_name.split(":", maxsplit=1))
@@ -446,7 +447,7 @@ class ServicePluginManager(ServiceManager):
446
447
  self.provider_config = provider_config or config.SERVICE_PROVIDER_CONFIG
447
448
 
448
449
  # locks used to make sure plugin loading is thread safe - will be cleared after single use
449
- self._plugin_load_locks: Dict[str, threading.RLock] = SynchronizedDefaultDict(
450
+ self._plugin_load_locks: dict[str, threading.RLock] = SynchronizedDefaultDict(
450
451
  threading.RLock
451
452
  )
452
453
 
@@ -469,7 +470,7 @@ class ServicePluginManager(ServiceManager):
469
470
 
470
471
  # TODO make the abstraction clearer, to provide better information if service is available versus discoverable
471
472
  # especially important when considering pro services
472
- def list_available(self) -> List[str]:
473
+ def list_available(self) -> list[str]:
473
474
  """
474
475
  List all available services, which have an available, configured provider
475
476
 
@@ -482,8 +483,8 @@ class ServicePluginManager(ServiceManager):
482
483
  ]
483
484
 
484
485
  def _get_loaded_service_containers(
485
- self, services: Optional[List[str]] = None
486
- ) -> List[ServiceContainer]:
486
+ self, services: list[str] | None = None
487
+ ) -> list[ServiceContainer]:
487
488
  """
488
489
  Returns all the available service containers.
489
490
  :param services: the list of services to restrict the search to. If empty or NULL then service containers for
@@ -495,7 +496,7 @@ class ServicePluginManager(ServiceManager):
495
496
  c for s in services if (c := super(ServicePluginManager, self).get_service_container(s))
496
497
  ]
497
498
 
498
- def list_loaded_services(self) -> List[str]:
499
+ def list_loaded_services(self) -> list[str]:
499
500
  """
500
501
  Lists all the services which have a provider that has been initialized
501
502
 
@@ -506,7 +507,7 @@ class ServicePluginManager(ServiceManager):
506
507
  for service_container in self._get_loaded_service_containers()
507
508
  ]
508
509
 
509
- def list_active_services(self) -> List[str]:
510
+ def list_active_services(self) -> list[str]:
510
511
  """
511
512
  Lists all services that have an initialised provider and are currently running.
512
513
 
@@ -521,7 +522,7 @@ class ServicePluginManager(ServiceManager):
521
522
  def exists(self, name: str) -> bool:
522
523
  return name in self.list_available()
523
524
 
524
- def get_state(self, name: str) -> Optional[ServiceState]:
525
+ def get_state(self, name: str) -> ServiceState | None:
525
526
  if name in self._services:
526
527
  # ServiceContainer exists, which means the plugin has been loaded
527
528
  return super().get_state(name)
@@ -537,7 +538,7 @@ class ServicePluginManager(ServiceManager):
537
538
 
538
539
  return ServiceState.AVAILABLE if is_api_enabled(name) else ServiceState.DISABLED
539
540
 
540
- def get_service_container(self, name: str) -> Optional[ServiceContainer]:
541
+ def get_service_container(self, name: str) -> ServiceContainer | None:
541
542
  if container := self._services.get(name):
542
543
  return container
543
544
 
@@ -565,7 +566,7 @@ class ServicePluginManager(ServiceManager):
565
566
  return self._services.get(name)
566
567
 
567
568
  @property
568
- def api_provider_specs(self) -> Dict[str, List[str]]:
569
+ def api_provider_specs(self) -> dict[str, list[str]]:
569
570
  """
570
571
  Returns all provider names within the service plugin namespace and parses their name according to the convention,
571
572
  that is "<api>:<provider>". The result is a dictionary that maps api => List[str (name of a provider)].
@@ -579,7 +580,7 @@ class ServicePluginManager(ServiceManager):
579
580
  return self._api_provider_specs
580
581
 
581
582
  @log_duration()
582
- def _load_service_plugin(self, name: str) -> Optional[ServicePlugin]:
583
+ def _load_service_plugin(self, name: str) -> ServicePlugin | None:
583
584
  providers = self.api_provider_specs.get(name)
584
585
  if not providers:
585
586
  # no providers for this api
@@ -608,7 +609,7 @@ class ServicePluginManager(ServiceManager):
608
609
  return plugin
609
610
 
610
611
  @log_duration()
611
- def _resolve_api_provider_specs(self) -> Dict[str, List[str]]:
612
+ def _resolve_api_provider_specs(self) -> dict[str, list[str]]:
612
613
  result = defaultdict(list)
613
614
 
614
615
  for spec in self.plugin_manager.list_plugin_specs():
@@ -619,7 +620,7 @@ class ServicePluginManager(ServiceManager):
619
620
 
620
621
  return result
621
622
 
622
- def apis_with_provider(self, provider: str) -> List[str]:
623
+ def apis_with_provider(self, provider: str) -> list[str]:
623
624
  """
624
625
  Lists all apis where a given provider exists for.
625
626
  :param provider: Name of the provider
@@ -631,7 +632,7 @@ class ServicePluginManager(ServiceManager):
631
632
  apis.append(api)
632
633
  return apis
633
634
 
634
- def _stop_services(self, service_containers: List[ServiceContainer]) -> None:
635
+ def _stop_services(self, service_containers: list[ServiceContainer]) -> None:
635
636
  """
636
637
  Atomically attempts to stop all given 'ServiceState.STARTING' and 'ServiceState.RUNNING' services.
637
638
  :param service_containers: the list of service containers to be stopped.
@@ -642,7 +643,7 @@ class ServicePluginManager(ServiceManager):
642
643
  if service_container.state in target_service_states:
643
644
  service_container.stop()
644
645
 
645
- def stop_services(self, services: List[str] = None):
646
+ def stop_services(self, services: list[str] = None):
646
647
  """
647
648
  Stops services for this service manager, if they are currently active.
648
649
  Will not stop services not already started or in and error state.
@@ -691,7 +692,7 @@ def check_service_health(api, expect_shutdown=False):
691
692
  LOG.warning('Service "%s" not yet available, retrying...', api)
692
693
  else:
693
694
  LOG.warning('Service "%s" still shutting down, retrying...', api)
694
- raise Exception("Service check failed for api: %s" % api)
695
+ raise Exception(f"Service check failed for api: {api}")
695
696
 
696
697
 
697
698
  @hooks.on_infra_start(should_load=lambda: config.EAGER_SERVICE_LOADING)
@@ -707,4 +708,8 @@ def eager_load_services():
707
708
  except ServiceDisabled as e:
708
709
  LOG.debug("%s", e)
709
710
  except Exception:
710
- LOG.exception("could not load service plugin %s", api)
711
+ LOG.error(
712
+ "could not load service plugin %s",
713
+ api,
714
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
715
+ )
@@ -41,7 +41,7 @@ def apigateway_legacy():
41
41
  return Service.for_provider(provider, dispatch_table_factory=MotoFallbackDispatcher)
42
42
 
43
43
 
44
- @aws_provider()
44
+ @aws_provider(api="cloudformation", name="engine-legacy")
45
45
  def cloudformation():
46
46
  from localstack.services.cloudformation.provider import CloudformationProvider
47
47
 
@@ -49,7 +49,7 @@ def cloudformation():
49
49
  return Service.for_provider(provider)
50
50
 
51
51
 
52
- @aws_provider(api="cloudformation", name="engine-v2")
52
+ @aws_provider(api="cloudformation")
53
53
  def cloudformation_v2():
54
54
  from localstack.services.cloudformation.v2.provider import CloudformationProviderV2
55
55
 
@@ -318,6 +318,14 @@ def sns():
318
318
  return Service.for_provider(provider, dispatch_table_factory=MotoFallbackDispatcher)
319
319
 
320
320
 
321
+ @aws_provider(api="sns", name="v2")
322
+ def sns_v2():
323
+ from localstack.services.sns.v2.provider import SnsProvider
324
+
325
+ provider = SnsProvider()
326
+ return Service.for_provider(provider)
327
+
328
+
321
329
  @aws_provider()
322
330
  def sqs():
323
331
  from localstack.services.sqs.provider import SqsProvider