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
@@ -2,7 +2,7 @@ import dataclasses
2
2
  import logging
3
3
  import os
4
4
  import threading
5
- from typing import Dict, List, NamedTuple, Optional, Tuple
5
+ from typing import NamedTuple
6
6
  from urllib.parse import urlparse
7
7
 
8
8
  import requests
@@ -18,7 +18,12 @@ from localstack.http.client import SimpleRequestsClient
18
18
  from localstack.http.proxy import ProxyHandler
19
19
  from localstack.services.edge import ROUTER
20
20
  from localstack.services.opensearch import versions
21
- from localstack.services.opensearch.packages import elasticsearch_package, opensearch_package
21
+ from localstack.services.opensearch.packages import (
22
+ ELASTICSEARCH_DEFAULT_VERSION,
23
+ OPENSEARCH_DEFAULT_VERSION,
24
+ elasticsearch_package,
25
+ opensearch_package,
26
+ )
22
27
  from localstack.utils.aws.arns import parse_arn
23
28
  from localstack.utils.common import (
24
29
  ShellCommandThread,
@@ -37,7 +42,10 @@ LOG = logging.getLogger(__name__)
37
42
  INTERNAL_USER_AUTH = ("localstack-internal", "localstack-internal")
38
43
  DEFAULT_BACKEND_HOST = "127.0.0.1"
39
44
 
40
- CommandSettings = Dict[str, str]
45
+ # user that starts the opensearch process if the current user is root
46
+ OS_USER_OPENSEARCH = "localstack"
47
+
48
+ CommandSettings = dict[str, str]
41
49
 
42
50
 
43
51
  class Directories(NamedTuple):
@@ -49,8 +57,8 @@ class Directories(NamedTuple):
49
57
 
50
58
 
51
59
  def get_cluster_health_status(
52
- url: str, auth: Tuple[str, str] | None, host: str | None = None
53
- ) -> Optional[str]:
60
+ url: str, auth: tuple[str, str] | None, host: str | None = None
61
+ ) -> str | None:
54
62
  """
55
63
  Queries the health endpoint of OpenSearch/Elasticsearch and returns either the status ('green', 'yellow',
56
64
  ...) or None if the response returned a non-200 response.
@@ -125,7 +133,7 @@ def resolve_directories(version: str, cluster_path: str, data_root: str = None)
125
133
  return Directories(install_dir, tmp_dir, modules_dir, data_dir, backup_dir)
126
134
 
127
135
 
128
- def build_cluster_run_command(cluster_bin: str, settings: CommandSettings) -> List[str]:
136
+ def build_cluster_run_command(cluster_bin: str, settings: CommandSettings) -> list[str]:
129
137
  """
130
138
  Takes the command settings dict and builds the actual command (which can then be executed as a shell command).
131
139
 
@@ -169,13 +177,13 @@ class SecurityOptions:
169
177
  master_password: str | None
170
178
 
171
179
  @property
172
- def auth(self) -> Tuple[str, str] | None:
180
+ def auth(self) -> tuple[str, str] | None:
173
181
  """Returns an auth tuple which can be used for HTTP requests or None, if disabled."""
174
182
  return None if not self.enabled else (self.master_username, self.master_password)
175
183
 
176
184
  @staticmethod
177
185
  def from_input(
178
- advanced_security_options: Optional[AdvancedSecurityOptionsInput],
186
+ advanced_security_options: AdvancedSecurityOptionsInput | None,
179
187
  ) -> "SecurityOptions":
180
188
  """
181
189
  Parses the given AdvancedSecurityOptionsInput, performs some validation, and returns the parsed SecurityOptions.
@@ -215,7 +223,7 @@ class SecurityOptions:
215
223
 
216
224
  def register_cluster(
217
225
  host: str, path: str, forward_url: str, custom_endpoint: CustomEndpoint
218
- ) -> List[Rule]:
226
+ ) -> list[Rule]:
219
227
  """
220
228
  Registers routes for a cluster at the edge router.
221
229
  Depending on which endpoint strategy is employed, and if a custom endpoint is enabled, different routes are
@@ -314,7 +322,7 @@ class OpensearchCluster(Server):
314
322
 
315
323
  @property
316
324
  def default_version(self) -> str:
317
- return constants.OPENSEARCH_DEFAULT_VERSION
325
+ return OPENSEARCH_DEFAULT_VERSION
318
326
 
319
327
  @property
320
328
  def version(self) -> str:
@@ -336,9 +344,9 @@ class OpensearchCluster(Server):
336
344
 
337
345
  @property
338
346
  def os_user(self):
339
- return constants.OS_USER_OPENSEARCH
347
+ return OS_USER_OPENSEARCH
340
348
 
341
- def health(self) -> Optional[str]:
349
+ def health(self) -> str | None:
342
350
  return get_cluster_health_status(self.url, auth=self.auth)
343
351
 
344
352
  def do_start_thread(self) -> FuncThread:
@@ -451,8 +459,8 @@ class OpensearchCluster(Server):
451
459
  return settings
452
460
 
453
461
  def _create_run_command(
454
- self, directories: Directories, additional_settings: Optional[CommandSettings] = None
455
- ) -> List[str]:
462
+ self, directories: Directories, additional_settings: CommandSettings | None = None
463
+ ) -> list[str]:
456
464
  # delete opensearch data that may be cached locally from a previous test run
457
465
  bin_path = os.path.join(directories.install, "bin", self.bin_name)
458
466
 
@@ -464,7 +472,7 @@ class OpensearchCluster(Server):
464
472
  cmd = build_cluster_run_command(bin_path, settings)
465
473
  return cmd
466
474
 
467
- def _create_env_vars(self, directories: Directories) -> Dict:
475
+ def _create_env_vars(self, directories: Directories) -> dict:
468
476
  env_vars = {
469
477
  "JAVA_HOME": os.path.join(directories.install, "jdk"),
470
478
  "OPENSEARCH_JAVA_OPTS": os.environ.get("OPENSEARCH_JAVA_OPTS", "-Xms200m -Xmx600m"),
@@ -580,7 +588,7 @@ class EdgeProxiedOpensearchCluster(Server):
580
588
 
581
589
  @property
582
590
  def default_version(self):
583
- return constants.OPENSEARCH_DEFAULT_VERSION
591
+ return OPENSEARCH_DEFAULT_VERSION
584
592
 
585
593
  @property
586
594
  def url(self) -> str:
@@ -658,7 +666,7 @@ class ElasticsearchCluster(OpensearchCluster):
658
666
 
659
667
  @property
660
668
  def default_version(self) -> str:
661
- return constants.ELASTICSEARCH_DEFAULT_VERSION
669
+ return ELASTICSEARCH_DEFAULT_VERSION
662
670
 
663
671
  @property
664
672
  def bin_name(self) -> str:
@@ -666,7 +674,7 @@ class ElasticsearchCluster(OpensearchCluster):
666
674
 
667
675
  @property
668
676
  def os_user(self):
669
- return constants.OS_USER_OPENSEARCH
677
+ return OS_USER_OPENSEARCH
670
678
 
671
679
  def _ensure_installed(self):
672
680
  elasticsearch_package.install(self.version)
@@ -699,7 +707,7 @@ class ElasticsearchCluster(OpensearchCluster):
699
707
 
700
708
  return settings
701
709
 
702
- def _create_env_vars(self, directories: Directories) -> Dict:
710
+ def _create_env_vars(self, directories: Directories) -> dict:
703
711
  return {
704
712
  **elasticsearch_package.get_installer(self.version).get_java_env_vars(),
705
713
  "ES_JAVA_OPTS": os.environ.get("ES_JAVA_OPTS", "-Xms200m -Xmx600m"),
@@ -710,7 +718,7 @@ class ElasticsearchCluster(OpensearchCluster):
710
718
  class EdgeProxiedElasticsearchCluster(EdgeProxiedOpensearchCluster):
711
719
  @property
712
720
  def default_version(self):
713
- return constants.ELASTICSEARCH_DEFAULT_VERSION
721
+ return ELASTICSEARCH_DEFAULT_VERSION
714
722
 
715
723
  def _backend_cluster(self) -> OpensearchCluster:
716
724
  return ElasticsearchCluster(
@@ -1,7 +1,6 @@
1
1
  import dataclasses
2
2
  import logging
3
3
  import threading
4
- from typing import Dict, Optional
5
4
 
6
5
  from botocore.utils import ArnParser
7
6
 
@@ -80,9 +79,9 @@ class DomainKey:
80
79
 
81
80
  def build_cluster_endpoint(
82
81
  domain_key: DomainKey,
83
- custom_endpoint: Optional[CustomEndpoint] = None,
82
+ custom_endpoint: CustomEndpoint | None = None,
84
83
  engine_type: EngineType = EngineType.OpenSearch,
85
- preferred_port: Optional[int] = None,
84
+ preferred_port: int | None = None,
86
85
  ) -> str:
87
86
  """
88
87
  Builds the cluster endpoint from and optional custom_endpoint and the localstack opensearch config. Example
@@ -131,7 +130,7 @@ def build_cluster_endpoint(
131
130
 
132
131
  def determine_custom_endpoint(
133
132
  domain_endpoint_options: DomainEndpointOptions,
134
- ) -> Optional[CustomEndpoint]:
133
+ ) -> CustomEndpoint | None:
135
134
  if not domain_endpoint_options:
136
135
  return
137
136
 
@@ -146,7 +145,7 @@ def determine_custom_endpoint(
146
145
 
147
146
 
148
147
  class ClusterManager:
149
- clusters: Dict[str, Server]
148
+ clusters: dict[str, Server]
150
149
 
151
150
  def __init__(self) -> None:
152
151
  self.clusters = {}
@@ -155,9 +154,9 @@ class ClusterManager:
155
154
  self,
156
155
  arn: str,
157
156
  version: str,
158
- endpoint_options: Optional[DomainEndpointOptions] = None,
159
- security_options: Optional[SecurityOptions] = None,
160
- preferred_port: Optional[int] = None,
157
+ endpoint_options: DomainEndpointOptions | None = None,
158
+ security_options: SecurityOptions | None = None,
159
+ preferred_port: int | None = None,
161
160
  ) -> Server:
162
161
  """
163
162
  Creates a new cluster.
@@ -190,7 +189,7 @@ class ClusterManager:
190
189
  self.clusters[arn] = cluster
191
190
  return cluster
192
191
 
193
- def get(self, arn: str) -> Optional[Server]:
192
+ def get(self, arn: str) -> Server | None:
194
193
  return self.clusters.get(arn)
195
194
 
196
195
  def remove(self, arn: str):
@@ -257,8 +256,8 @@ class MultiplexingClusterManager(ClusterManager):
257
256
  - OPENSEARCH_ENDPOINT_STRATEGY = domain / path
258
257
  """
259
258
 
260
- cluster: Optional[Server]
261
- endpoints: Dict[str, ClusterEndpoint]
259
+ cluster: Server | None
260
+ endpoints: dict[str, ClusterEndpoint]
262
261
 
263
262
  def __init__(self) -> None:
264
263
  super().__init__()
@@ -366,7 +365,7 @@ class SingletonClusterManager(ClusterManager):
366
365
  - ES_MULTI_CLUSTER == False
367
366
  """
368
367
 
369
- cluster: Optional[Server]
368
+ cluster: Server | None
370
369
 
371
370
  def __init__(self) -> None:
372
371
  super().__init__()
@@ -378,8 +377,8 @@ class SingletonClusterManager(ClusterManager):
378
377
  self,
379
378
  arn: str,
380
379
  version: str,
381
- endpoint_options: Optional[DomainEndpointOptions] = None,
382
- security_options: Optional[SecurityOptions] = None,
380
+ endpoint_options: DomainEndpointOptions | None = None,
381
+ security_options: SecurityOptions | None = None,
383
382
  preferred_port: int = None,
384
383
  ) -> Server:
385
384
  with self.mutex:
@@ -1,5 +1,3 @@
1
- from typing import Dict
2
-
3
1
  from localstack.aws.api.opensearch import DomainStatus
4
2
  from localstack.services.stores import (
5
3
  AccountRegionBundle,
@@ -12,7 +10,7 @@ from localstack.utils.tagging import TaggingService
12
10
 
13
11
  class OpenSearchStore(BaseStore):
14
12
  # storage for domain resources (access should be protected with the _domain_mutex)
15
- opensearch_domains: Dict[str, DomainStatus] = LocalAttribute(default=dict)
13
+ opensearch_domains: dict[str, DomainStatus] = LocalAttribute(default=dict)
16
14
 
17
15
  # static tagging service instance
18
16
  TAGS = CrossRegionAttribute(default=TaggingService)
@@ -5,18 +5,10 @@ import re
5
5
  import shutil
6
6
  import textwrap
7
7
  import threading
8
- from typing import List
9
8
 
10
9
  import semver
11
10
 
12
11
  from localstack import config
13
- from localstack.constants import (
14
- ELASTICSEARCH_DEFAULT_VERSION,
15
- ELASTICSEARCH_DELETE_MODULES,
16
- ELASTICSEARCH_PLUGIN_LIST,
17
- OPENSEARCH_DEFAULT_VERSION,
18
- OPENSEARCH_PLUGIN_LIST,
19
- )
20
12
  from localstack.packages import InstallTarget, Package, PackageInstaller
21
13
  from localstack.packages.java import java_package
22
14
  from localstack.services.opensearch import versions
@@ -33,6 +25,32 @@ from localstack.utils.sync import SynchronizedDefaultDict, retry
33
25
 
34
26
  LOG = logging.getLogger(__name__)
35
27
 
28
+ # the version of opensearch which is used by default
29
+ OPENSEARCH_DEFAULT_VERSION = "OpenSearch_3.1"
30
+
31
+ # See https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-plugins.html
32
+ OPENSEARCH_PLUGIN_LIST = [
33
+ "ingest-attachment",
34
+ "analysis-kuromoji",
35
+ ]
36
+
37
+ # the version of elasticsearch that is pre-seeded into the base image (sync with Dockerfile.base)
38
+ ELASTICSEARCH_DEFAULT_VERSION = "Elasticsearch_7.10"
39
+
40
+ # See https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/aes-supported-plugins.html
41
+ ELASTICSEARCH_PLUGIN_LIST = [
42
+ "analysis-icu",
43
+ "ingest-attachment",
44
+ "analysis-kuromoji",
45
+ "mapper-murmur3",
46
+ "mapper-size",
47
+ "analysis-phonetic",
48
+ "analysis-smartcn",
49
+ "analysis-stempel",
50
+ "analysis-ukrainian",
51
+ ]
52
+ # Default ES modules to exclude (save apprx 66MB in the final image)
53
+ ELASTICSEARCH_DELETE_MODULES = ["ingest-geoip"]
36
54
 
37
55
  _OPENSEARCH_INSTALL_LOCKS = SynchronizedDefaultDict(threading.RLock)
38
56
 
@@ -49,7 +67,7 @@ class OpensearchPackage(Package):
49
67
  else:
50
68
  return OpensearchPackageInstaller(version)
51
69
 
52
- def get_versions(self) -> List[str]:
70
+ def get_versions(self) -> list[str]:
53
71
  return list(versions.install_versions.keys())
54
72
 
55
73
 
@@ -3,9 +3,8 @@ import os
3
3
  import re
4
4
  import threading
5
5
  from copy import deepcopy
6
- from datetime import datetime, timezone
6
+ from datetime import UTC, datetime
7
7
  from random import randint
8
- from typing import Dict, Optional
9
8
  from urllib.parse import urlparse
10
9
 
11
10
  from localstack import config
@@ -27,6 +26,7 @@ from localstack.aws.api.opensearch import (
27
26
  CognitoOptions,
28
27
  CognitoOptionsStatus,
29
28
  ColdStorageOptions,
29
+ CompatibleVersionsMap,
30
30
  CreateDomainRequest,
31
31
  CreateDomainResponse,
32
32
  DeleteDomainResponse,
@@ -76,7 +76,6 @@ from localstack.aws.api.opensearch import (
76
76
  VolumeType,
77
77
  VPCDerivedInfoStatus,
78
78
  )
79
- from localstack.constants import OPENSEARCH_DEFAULT_VERSION
80
79
  from localstack.services.opensearch import versions
81
80
  from localstack.services.opensearch.cluster import SecurityOptions
82
81
  from localstack.services.opensearch.cluster_manager import (
@@ -85,6 +84,7 @@ from localstack.services.opensearch.cluster_manager import (
85
84
  create_cluster_manager,
86
85
  )
87
86
  from localstack.services.opensearch.models import OpenSearchStore, opensearch_stores
87
+ from localstack.services.opensearch.packages import OPENSEARCH_DEFAULT_VERSION
88
88
  from localstack.services.plugins import ServiceLifecycleHook
89
89
  from localstack.state import AssetDirectory, StateVisitor
90
90
  from localstack.utils.aws.arns import parse_arn
@@ -143,9 +143,9 @@ def _run_cluster_startup_monitor(cluster: Server, domain_name: str, region: str)
143
143
  def create_cluster(
144
144
  domain_key: DomainKey,
145
145
  engine_version: str,
146
- domain_endpoint_options: Optional[DomainEndpointOptions],
147
- security_options: Optional[SecurityOptions],
148
- preferred_port: Optional[int] = None,
146
+ domain_endpoint_options: DomainEndpointOptions | None,
147
+ security_options: SecurityOptions | None,
148
+ preferred_port: int | None = None,
149
149
  ):
150
150
  """
151
151
  Uses the ClusterManager to create a new cluster for the given domain key. NOT thread safe, needs to be called
@@ -369,7 +369,7 @@ def get_domain_status(
369
369
  Cancellable=False,
370
370
  UpdateStatus=DeploymentStatus.COMPLETED,
371
371
  Description="There is no software update available for this domain.",
372
- AutomatedUpdateDate=datetime.fromtimestamp(0, tz=timezone.utc),
372
+ AutomatedUpdateDate=datetime.fromtimestamp(0, tz=UTC),
373
373
  OptionalDeployment=True,
374
374
  ),
375
375
  DomainEndpointOptions=stored_status.get("DomainEndpointOptions")
@@ -399,7 +399,7 @@ def _ensure_domain_exists(arn: ARN) -> None:
399
399
 
400
400
 
401
401
  def _update_domain_config_request_to_status(request: UpdateDomainConfigRequest) -> DomainStatus:
402
- request: Dict
402
+ request: dict
403
403
  request.pop("DryRun", None)
404
404
  request.pop("DomainName", None)
405
405
  return request
@@ -467,10 +467,11 @@ class OpensearchProvider(OpensearchApi, ServiceLifecycleHook):
467
467
  preferred_port=preferred_port,
468
468
  )
469
469
  except Exception:
470
- LOG.exception(
470
+ LOG.error(
471
471
  "Could not restore domain %s in region %s.",
472
472
  domain_name,
473
473
  region,
474
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
474
475
  )
475
476
 
476
477
  def on_before_state_reset(self):
@@ -581,7 +582,7 @@ class OpensearchProvider(OpensearchApi, ServiceLifecycleHook):
581
582
  if domain_status is None:
582
583
  raise ResourceNotFoundException(f"Domain not found: {domain_key.domain_name}")
583
584
 
584
- status_update: Dict = _update_domain_config_request_to_status(payload)
585
+ status_update: dict = _update_domain_config_request_to_status(payload)
585
586
  domain_status.update(status_update)
586
587
 
587
588
  return UpdateDomainConfigResponse(DomainConfig=_status_to_config(domain_status))
@@ -650,6 +651,10 @@ class OpensearchProvider(OpensearchApi, ServiceLifecycleHook):
650
651
  for comp in versions.compatible_versions
651
652
  if comp["SourceVersion"] == version_filter
652
653
  ]
654
+ if not compatible_versions:
655
+ compatible_versions = [
656
+ CompatibleVersionsMap(SourceVersion=version_filter, TargetVersions=[])
657
+ ]
653
658
  return GetCompatibleVersionsResponse(CompatibleVersions=compatible_versions)
654
659
 
655
660
  def describe_domain_config(
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
 
4
4
  import copy
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.aws.api.es import CreateElasticsearchDomainRequest
@@ -17,105 +17,105 @@ from localstack.utils.collections import convert_to_typed_dict
17
17
 
18
18
 
19
19
  class ElasticsearchDomainProperties(TypedDict):
20
- AccessPolicies: Optional[dict]
21
- AdvancedOptions: Optional[dict]
22
- AdvancedSecurityOptions: Optional[AdvancedSecurityOptionsInput]
23
- Arn: Optional[str]
24
- CognitoOptions: Optional[CognitoOptions]
25
- DomainArn: Optional[str]
26
- DomainEndpoint: Optional[str]
27
- DomainEndpointOptions: Optional[DomainEndpointOptions]
28
- DomainName: Optional[str]
29
- EBSOptions: Optional[EBSOptions]
30
- ElasticsearchClusterConfig: Optional[ElasticsearchClusterConfig]
31
- ElasticsearchVersion: Optional[str]
32
- EncryptionAtRestOptions: Optional[EncryptionAtRestOptions]
33
- Id: Optional[str]
34
- LogPublishingOptions: Optional[dict]
35
- NodeToNodeEncryptionOptions: Optional[NodeToNodeEncryptionOptions]
36
- SnapshotOptions: Optional[SnapshotOptions]
37
- Tags: Optional[list[Tag]]
38
- VPCOptions: Optional[VPCOptions]
20
+ AccessPolicies: dict | None
21
+ AdvancedOptions: dict | None
22
+ AdvancedSecurityOptions: AdvancedSecurityOptionsInput | None
23
+ Arn: str | None
24
+ CognitoOptions: CognitoOptions | None
25
+ DomainArn: str | None
26
+ DomainEndpoint: str | None
27
+ DomainEndpointOptions: DomainEndpointOptions | None
28
+ DomainName: str | None
29
+ EBSOptions: EBSOptions | None
30
+ ElasticsearchClusterConfig: ElasticsearchClusterConfig | None
31
+ ElasticsearchVersion: str | None
32
+ EncryptionAtRestOptions: EncryptionAtRestOptions | None
33
+ Id: str | None
34
+ LogPublishingOptions: dict | None
35
+ NodeToNodeEncryptionOptions: NodeToNodeEncryptionOptions | None
36
+ SnapshotOptions: SnapshotOptions | None
37
+ Tags: list[Tag] | None
38
+ VPCOptions: VPCOptions | None
39
39
 
40
40
 
41
41
  class ZoneAwarenessConfig(TypedDict):
42
- AvailabilityZoneCount: Optional[int]
42
+ AvailabilityZoneCount: int | None
43
43
 
44
44
 
45
45
  class ColdStorageOptions(TypedDict):
46
- Enabled: Optional[bool]
46
+ Enabled: bool | None
47
47
 
48
48
 
49
49
  class ElasticsearchClusterConfig(TypedDict):
50
- ColdStorageOptions: Optional[ColdStorageOptions]
51
- DedicatedMasterCount: Optional[int]
52
- DedicatedMasterEnabled: Optional[bool]
53
- DedicatedMasterType: Optional[str]
54
- InstanceCount: Optional[int]
55
- InstanceType: Optional[str]
56
- WarmCount: Optional[int]
57
- WarmEnabled: Optional[bool]
58
- WarmType: Optional[str]
59
- ZoneAwarenessConfig: Optional[ZoneAwarenessConfig]
60
- ZoneAwarenessEnabled: Optional[bool]
50
+ ColdStorageOptions: ColdStorageOptions | None
51
+ DedicatedMasterCount: int | None
52
+ DedicatedMasterEnabled: bool | None
53
+ DedicatedMasterType: str | None
54
+ InstanceCount: int | None
55
+ InstanceType: str | None
56
+ WarmCount: int | None
57
+ WarmEnabled: bool | None
58
+ WarmType: str | None
59
+ ZoneAwarenessConfig: ZoneAwarenessConfig | None
60
+ ZoneAwarenessEnabled: bool | None
61
61
 
62
62
 
63
63
  class SnapshotOptions(TypedDict):
64
- AutomatedSnapshotStartHour: Optional[int]
64
+ AutomatedSnapshotStartHour: int | None
65
65
 
66
66
 
67
67
  class VPCOptions(TypedDict):
68
- SecurityGroupIds: Optional[list[str]]
69
- SubnetIds: Optional[list[str]]
68
+ SecurityGroupIds: list[str] | None
69
+ SubnetIds: list[str] | None
70
70
 
71
71
 
72
72
  class NodeToNodeEncryptionOptions(TypedDict):
73
- Enabled: Optional[bool]
73
+ Enabled: bool | None
74
74
 
75
75
 
76
76
  class DomainEndpointOptions(TypedDict):
77
- CustomEndpoint: Optional[str]
78
- CustomEndpointCertificateArn: Optional[str]
79
- CustomEndpointEnabled: Optional[bool]
80
- EnforceHTTPS: Optional[bool]
81
- TLSSecurityPolicy: Optional[str]
77
+ CustomEndpoint: str | None
78
+ CustomEndpointCertificateArn: str | None
79
+ CustomEndpointEnabled: bool | None
80
+ EnforceHTTPS: bool | None
81
+ TLSSecurityPolicy: str | None
82
82
 
83
83
 
84
84
  class CognitoOptions(TypedDict):
85
- Enabled: Optional[bool]
86
- IdentityPoolId: Optional[str]
87
- RoleArn: Optional[str]
88
- UserPoolId: Optional[str]
85
+ Enabled: bool | None
86
+ IdentityPoolId: str | None
87
+ RoleArn: str | None
88
+ UserPoolId: str | None
89
89
 
90
90
 
91
91
  class MasterUserOptions(TypedDict):
92
- MasterUserARN: Optional[str]
93
- MasterUserName: Optional[str]
94
- MasterUserPassword: Optional[str]
92
+ MasterUserARN: str | None
93
+ MasterUserName: str | None
94
+ MasterUserPassword: str | None
95
95
 
96
96
 
97
97
  class AdvancedSecurityOptionsInput(TypedDict):
98
- AnonymousAuthEnabled: Optional[bool]
99
- Enabled: Optional[bool]
100
- InternalUserDatabaseEnabled: Optional[bool]
101
- MasterUserOptions: Optional[MasterUserOptions]
98
+ AnonymousAuthEnabled: bool | None
99
+ Enabled: bool | None
100
+ InternalUserDatabaseEnabled: bool | None
101
+ MasterUserOptions: MasterUserOptions | None
102
102
 
103
103
 
104
104
  class EBSOptions(TypedDict):
105
- EBSEnabled: Optional[bool]
106
- Iops: Optional[int]
107
- VolumeSize: Optional[int]
108
- VolumeType: Optional[str]
105
+ EBSEnabled: bool | None
106
+ Iops: int | None
107
+ VolumeSize: int | None
108
+ VolumeType: str | None
109
109
 
110
110
 
111
111
  class EncryptionAtRestOptions(TypedDict):
112
- Enabled: Optional[bool]
113
- KmsKeyId: Optional[str]
112
+ Enabled: bool | None
113
+ KmsKeyId: str | None
114
114
 
115
115
 
116
116
  class Tag(TypedDict):
117
- Key: Optional[str]
118
- Value: Optional[str]
117
+ Key: str | None
118
+ Value: str | None
119
119
 
120
120
 
121
121
  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 ElasticsearchDomainProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::Elasticsearch::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_elasticsearch_domain import (