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 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  from pathlib import Path
5
- from typing import Optional, TypedDict
5
+ from typing import TypedDict
6
6
 
7
7
  import localstack.services.cloudformation.provider_utils as util
8
8
  from localstack.services.cloudformation.resource_provider import (
@@ -14,113 +14,113 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class DynamoDBTableProperties(TypedDict):
17
- KeySchema: Optional[list[KeySchema] | dict]
18
- Arn: Optional[str]
19
- AttributeDefinitions: Optional[list[AttributeDefinition]]
20
- BillingMode: Optional[str]
21
- ContributorInsightsSpecification: Optional[ContributorInsightsSpecification]
22
- DeletionProtectionEnabled: Optional[bool]
23
- GlobalSecondaryIndexes: Optional[list[GlobalSecondaryIndex]]
24
- ImportSourceSpecification: Optional[ImportSourceSpecification]
25
- KinesisStreamSpecification: Optional[KinesisStreamSpecification]
26
- LocalSecondaryIndexes: Optional[list[LocalSecondaryIndex]]
27
- PointInTimeRecoverySpecification: Optional[PointInTimeRecoverySpecification]
28
- ProvisionedThroughput: Optional[ProvisionedThroughput]
29
- SSESpecification: Optional[SSESpecification]
30
- StreamArn: Optional[str]
31
- StreamSpecification: Optional[StreamSpecification]
32
- TableClass: Optional[str]
33
- TableName: Optional[str]
34
- Tags: Optional[list[Tag]]
35
- TimeToLiveSpecification: Optional[TimeToLiveSpecification]
17
+ KeySchema: list[KeySchema] | dict | None
18
+ Arn: str | None
19
+ AttributeDefinitions: list[AttributeDefinition] | None
20
+ BillingMode: str | None
21
+ ContributorInsightsSpecification: ContributorInsightsSpecification | None
22
+ DeletionProtectionEnabled: bool | None
23
+ GlobalSecondaryIndexes: list[GlobalSecondaryIndex] | None
24
+ ImportSourceSpecification: ImportSourceSpecification | None
25
+ KinesisStreamSpecification: KinesisStreamSpecification | None
26
+ LocalSecondaryIndexes: list[LocalSecondaryIndex] | None
27
+ PointInTimeRecoverySpecification: PointInTimeRecoverySpecification | None
28
+ ProvisionedThroughput: ProvisionedThroughput | None
29
+ SSESpecification: SSESpecification | None
30
+ StreamArn: str | None
31
+ StreamSpecification: StreamSpecification | None
32
+ TableClass: str | None
33
+ TableName: str | None
34
+ Tags: list[Tag] | None
35
+ TimeToLiveSpecification: TimeToLiveSpecification | None
36
36
 
37
37
 
38
38
  class AttributeDefinition(TypedDict):
39
- AttributeName: Optional[str]
40
- AttributeType: Optional[str]
39
+ AttributeName: str | None
40
+ AttributeType: str | None
41
41
 
42
42
 
43
43
  class KeySchema(TypedDict):
44
- AttributeName: Optional[str]
45
- KeyType: Optional[str]
44
+ AttributeName: str | None
45
+ KeyType: str | None
46
46
 
47
47
 
48
48
  class Projection(TypedDict):
49
- NonKeyAttributes: Optional[list[str]]
50
- ProjectionType: Optional[str]
49
+ NonKeyAttributes: list[str] | None
50
+ ProjectionType: str | None
51
51
 
52
52
 
53
53
  class ProvisionedThroughput(TypedDict):
54
- ReadCapacityUnits: Optional[int]
55
- WriteCapacityUnits: Optional[int]
54
+ ReadCapacityUnits: int | None
55
+ WriteCapacityUnits: int | None
56
56
 
57
57
 
58
58
  class ContributorInsightsSpecification(TypedDict):
59
- Enabled: Optional[bool]
59
+ Enabled: bool | None
60
60
 
61
61
 
62
62
  class GlobalSecondaryIndex(TypedDict):
63
- IndexName: Optional[str]
64
- KeySchema: Optional[list[KeySchema]]
65
- Projection: Optional[Projection]
66
- ContributorInsightsSpecification: Optional[ContributorInsightsSpecification]
67
- ProvisionedThroughput: Optional[ProvisionedThroughput]
63
+ IndexName: str | None
64
+ KeySchema: list[KeySchema] | None
65
+ Projection: Projection | None
66
+ ContributorInsightsSpecification: ContributorInsightsSpecification | None
67
+ ProvisionedThroughput: ProvisionedThroughput | None
68
68
 
69
69
 
70
70
  class LocalSecondaryIndex(TypedDict):
71
- IndexName: Optional[str]
72
- KeySchema: Optional[list[KeySchema]]
73
- Projection: Optional[Projection]
71
+ IndexName: str | None
72
+ KeySchema: list[KeySchema] | None
73
+ Projection: Projection | None
74
74
 
75
75
 
76
76
  class PointInTimeRecoverySpecification(TypedDict):
77
- PointInTimeRecoveryEnabled: Optional[bool]
77
+ PointInTimeRecoveryEnabled: bool | None
78
78
 
79
79
 
80
80
  class SSESpecification(TypedDict):
81
- SSEEnabled: Optional[bool]
82
- KMSMasterKeyId: Optional[str]
83
- SSEType: Optional[str]
81
+ SSEEnabled: bool | None
82
+ KMSMasterKeyId: str | None
83
+ SSEType: str | None
84
84
 
85
85
 
86
86
  class StreamSpecification(TypedDict):
87
- StreamViewType: Optional[str]
87
+ StreamViewType: str | None
88
88
 
89
89
 
90
90
  class Tag(TypedDict):
91
- Key: Optional[str]
92
- Value: Optional[str]
91
+ Key: str | None
92
+ Value: str | None
93
93
 
94
94
 
95
95
  class TimeToLiveSpecification(TypedDict):
96
- AttributeName: Optional[str]
97
- Enabled: Optional[bool]
96
+ AttributeName: str | None
97
+ Enabled: bool | None
98
98
 
99
99
 
100
100
  class KinesisStreamSpecification(TypedDict):
101
- StreamArn: Optional[str]
101
+ StreamArn: str | None
102
102
 
103
103
 
104
104
  class S3BucketSource(TypedDict):
105
- S3Bucket: Optional[str]
106
- S3BucketOwner: Optional[str]
107
- S3KeyPrefix: Optional[str]
105
+ S3Bucket: str | None
106
+ S3BucketOwner: str | None
107
+ S3KeyPrefix: str | None
108
108
 
109
109
 
110
110
  class Csv(TypedDict):
111
- Delimiter: Optional[str]
112
- HeaderList: Optional[list[str]]
111
+ Delimiter: str | None
112
+ HeaderList: list[str] | None
113
113
 
114
114
 
115
115
  class InputFormatOptions(TypedDict):
116
- Csv: Optional[Csv]
116
+ Csv: Csv | None
117
117
 
118
118
 
119
119
  class ImportSourceSpecification(TypedDict):
120
- InputFormat: Optional[str]
121
- S3BucketSource: Optional[S3BucketSource]
122
- InputCompressionType: Optional[str]
123
- InputFormatOptions: Optional[InputFormatOptions]
120
+ InputFormat: str | None
121
+ S3BucketSource: S3BucketSource | None
122
+ InputCompressionType: str | None
123
+ InputFormatOptions: InputFormatOptions | None
124
124
 
125
125
 
126
126
  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 DynamoDBTableProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::DynamoDB::Table"
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.dynamodb.resource_providers.aws_dynamodb_table import (
@@ -162,7 +162,7 @@ class DynamodbServer(Server):
162
162
  cmd = [
163
163
  "java",
164
164
  *self._get_java_vm_options(),
165
- "-Xmx%s" % self.heap_size,
165
+ f"-Xmx{self.heap_size}",
166
166
  f"-javaagent:{dynamodblocal_package.get_installer().get_ddb_agent_jar_path()}",
167
167
  f"-Djava.library.path={self.library_path}",
168
168
  "-jar",
@@ -219,7 +219,7 @@ class DynamodbServer(Server):
219
219
  aws_secret_access_key=DEFAULT_AWS_ACCOUNT_ID,
220
220
  ).dynamodb.list_tables()
221
221
  except Exception:
222
- LOG.exception("DynamoDB health check failed")
222
+ LOG.error("DynamoDB health check failed", exc_info=LOG.isEnabledFor(logging.DEBUG))
223
223
  if expect_shutdown:
224
224
  assert out is None
225
225
  else:
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  import re
3
3
  from binascii import crc32
4
- from typing import Dict, List, Optional
5
4
 
6
5
  from boto3.dynamodb.types import TypeDeserializer, TypeSerializer
7
6
  from cachetools import TTLCache
@@ -61,7 +60,7 @@ def get_ddb_access_key(account_id: str, region_name: str) -> str:
61
60
  class ItemSet:
62
61
  """Represents a set of items and provides utils to find individual items in the set"""
63
62
 
64
- def __init__(self, items: List[Dict], key_schema: List[Dict]):
63
+ def __init__(self, items: list[dict], key_schema: list[dict]):
65
64
  self.items_list = items
66
65
  self.key_schema = key_schema
67
66
  self._build_dict()
@@ -71,11 +70,11 @@ class ItemSet:
71
70
  for item in self.items_list:
72
71
  self.items_dict[self._hashable_key(item)] = item
73
72
 
74
- def _hashable_key(self, item: Dict):
73
+ def _hashable_key(self, item: dict):
75
74
  keys = SchemaExtractor.extract_keys_for_schema(item=item, key_schema=self.key_schema)
76
75
  return canonical_json(keys)
77
76
 
78
- def find_item(self, item: Dict) -> Optional[Dict]:
77
+ def find_item(self, item: dict) -> dict | None:
79
78
  key = self._hashable_key(item)
80
79
  return self.items_dict.get(key)
81
80
 
@@ -83,13 +82,13 @@ class ItemSet:
83
82
  class SchemaExtractor:
84
83
  @classmethod
85
84
  def extract_keys(
86
- cls, item: Dict, table_name: str, account_id: str, region_name: str
87
- ) -> Optional[Dict]:
85
+ cls, item: dict, table_name: str, account_id: str, region_name: str
86
+ ) -> dict | None:
88
87
  key_schema = cls.get_key_schema(table_name, account_id, region_name)
89
88
  return cls.extract_keys_for_schema(item, key_schema)
90
89
 
91
90
  @classmethod
92
- def extract_keys_for_schema(cls, item: Dict, key_schema: List[Dict]):
91
+ def extract_keys_for_schema(cls, item: dict, key_schema: list[dict]):
93
92
  result = {}
94
93
  for key in key_schema:
95
94
  attr_name = key["AttributeName"]
@@ -104,10 +103,10 @@ class SchemaExtractor:
104
103
  @classmethod
105
104
  def get_key_schema(
106
105
  cls, table_name: str, account_id: str, region_name: str
107
- ) -> Optional[List[Dict]]:
106
+ ) -> list[dict] | None:
108
107
  from localstack.services.dynamodb.provider import get_store
109
108
 
110
- table_definitions: Dict = get_store(
109
+ table_definitions: dict = get_store(
111
110
  account_id=account_id,
112
111
  region_name=region_name,
113
112
  ).table_definitions
@@ -169,12 +168,12 @@ class ItemFinder:
169
168
 
170
169
  @staticmethod
171
170
  def find_existing_item(
172
- put_item: Dict,
171
+ put_item: dict,
173
172
  table_name: str,
174
173
  account_id: str,
175
174
  region_name: str,
176
175
  endpoint_url: str,
177
- ) -> Optional[AttributeMap]:
176
+ ) -> AttributeMap | None:
178
177
  from localstack.services.dynamodb.provider import ValidationException
179
178
 
180
179
  ddb_client = ItemFinder.get_ddb_local_client(account_id, region_name, endpoint_url)
@@ -273,7 +272,7 @@ class ItemFinder:
273
272
  @classmethod
274
273
  def list_existing_items_for_statement(
275
274
  cls, partiql_statement: str, account_id: str, region_name: str, endpoint_url: str
276
- ) -> List:
275
+ ) -> list:
277
276
  table_name = extract_table_name_from_partiql_update(partiql_statement)
278
277
  if not table_name:
279
278
  return []
@@ -288,7 +287,7 @@ class ItemFinder:
288
287
  @staticmethod
289
288
  def get_all_table_items(
290
289
  account_id: str, region_name: str, table_name: str, endpoint_url: str
291
- ) -> List:
290
+ ) -> list:
292
291
  ddb_client = ItemFinder.get_ddb_local_client(account_id, region_name, endpoint_url)
293
292
  dynamodb_kwargs = {"TableName": table_name}
294
293
  all_items = list_all_resources(
@@ -300,7 +299,7 @@ class ItemFinder:
300
299
  return all_items
301
300
 
302
301
 
303
- def extract_table_name_from_partiql_update(statement: str) -> Optional[str]:
302
+ def extract_table_name_from_partiql_update(statement: str) -> str | None:
304
303
  regex = r"^\s*(UPDATE|INSERT\s+INTO|DELETE\s+FROM)\s+([^\s]+).*"
305
304
  match = re.match(regex, statement, flags=re.IGNORECASE | re.MULTILINE)
306
305
  return match and match.group(2)
@@ -9,7 +9,6 @@ import time
9
9
  from contextlib import contextmanager
10
10
  from datetime import datetime
11
11
  from operator import itemgetter
12
- from typing import Dict, Optional
13
12
 
14
13
  import requests
15
14
  import werkzeug
@@ -24,6 +23,7 @@ from localstack.aws.api import (
24
23
  handler,
25
24
  )
26
25
  from localstack.aws.api.dynamodb import (
26
+ ApproximateCreationDateTimePrecision,
27
27
  BatchExecuteStatementOutput,
28
28
  BatchGetItemOutput,
29
29
  BatchGetRequestMap,
@@ -40,6 +40,8 @@ from localstack.aws.api.dynamodb import (
40
40
  DeleteRequest,
41
41
  DeleteTableOutput,
42
42
  DescribeContinuousBackupsOutput,
43
+ DescribeContributorInsightsInput,
44
+ DescribeContributorInsightsOutput,
43
45
  DescribeGlobalTableOutput,
44
46
  DescribeKinesisStreamingDestinationOutput,
45
47
  DescribeTableOutput,
@@ -84,6 +86,7 @@ from localstack.aws.api.dynamodb import (
84
86
  ScanInput,
85
87
  ScanOutput,
86
88
  StreamArn,
89
+ TableArn,
87
90
  TableDescription,
88
91
  TableName,
89
92
  TagKeyList,
@@ -97,6 +100,8 @@ from localstack.aws.api.dynamodb import (
97
100
  UpdateGlobalTableOutput,
98
101
  UpdateItemInput,
99
102
  UpdateItemOutput,
103
+ UpdateKinesisStreamingConfiguration,
104
+ UpdateKinesisStreamingDestinationOutput,
100
105
  UpdateTableInput,
101
106
  UpdateTableOutput,
102
107
  UpdateTimeToLiveOutput,
@@ -336,7 +341,7 @@ class ExpiredItemsWorker:
336
341
  def __init__(self) -> None:
337
342
  super().__init__()
338
343
  self.scheduler = Scheduler()
339
- self.thread: Optional[FuncThread] = None
344
+ self.thread: FuncThread | None = None
340
345
  self.mutex = threading.RLock()
341
346
 
342
347
  def start(self):
@@ -555,6 +560,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
555
560
  if "NumberOfDecreasesToday" not in table_description["ProvisionedThroughput"]:
556
561
  table_description["ProvisionedThroughput"]["NumberOfDecreasesToday"] = 0
557
562
 
563
+ if "WarmThroughput" in table_description:
564
+ table_description["WarmThroughput"]["Status"] = "UPDATING"
565
+
558
566
  tags = table_definitions.pop("Tags", [])
559
567
  if tags:
560
568
  get_store(context.account_id, context.region).TABLE_TAGS[table_arn] = {
@@ -572,6 +580,13 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
572
580
  ) -> DeleteTableOutput:
573
581
  global_table_region = self.get_global_table_region(context, table_name)
574
582
 
583
+ self.ensure_table_exists(
584
+ context.account_id,
585
+ global_table_region,
586
+ table_name,
587
+ error_message=f"Requested resource not found: Table: {table_name} not found",
588
+ )
589
+
575
590
  # Limitation note: On AWS, for a replicated table, if the source table is deleted, the replicated tables continue to exist.
576
591
  # This is not the case for LocalStack, where all replicated tables will also be removed if source is deleted.
577
592
 
@@ -603,7 +618,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
603
618
  store = get_store(context.account_id, context.region)
604
619
 
605
620
  # Update replication details
606
- replicas: Dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
621
+ replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
607
622
 
608
623
  replica_description_list = []
609
624
 
@@ -631,6 +646,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
631
646
  table_description["TableClassSummary"] = {
632
647
  "TableClass": table_definitions["TableClass"]
633
648
  }
649
+ if warm_throughput := table_definitions.get("WarmThroughput"):
650
+ table_description["WarmThroughput"] = warm_throughput.copy()
651
+ table_description["WarmThroughput"].setdefault("Status", "ACTIVE")
634
652
 
635
653
  if "GlobalSecondaryIndexes" in table_description:
636
654
  for gsi in table_description["GlobalSecondaryIndexes"]:
@@ -643,6 +661,17 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
643
661
  # Terraform depends on this parity for update operations
644
662
  gsi["ProvisionedThroughput"] = default_values | gsi.get("ProvisionedThroughput", {})
645
663
 
664
+ # Set defaults for warm throughput
665
+ if "WarmThroughput" not in table_description:
666
+ billing_mode = table_definitions.get("BillingMode") if table_definitions else None
667
+ table_description["WarmThroughput"] = {
668
+ "ReadUnitsPerSecond": 12000 if billing_mode == "PAY_PER_REQUEST" else 5,
669
+ "WriteUnitsPerSecond": 4000 if billing_mode == "PAY_PER_REQUEST" else 5,
670
+ }
671
+ table_description["WarmThroughput"]["Status"] = (
672
+ table_description.get("TableStatus") or "ACTIVE"
673
+ )
674
+
646
675
  return DescribeTableOutput(
647
676
  Table=select_from_typed_dict(TableDescription, table_description)
648
677
  )
@@ -672,7 +701,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
672
701
  store = get_store(context.account_id, global_table_region)
673
702
 
674
703
  # Dict with source region to set of replicated regions
675
- replicas: Dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
704
+ replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
676
705
 
677
706
  for replica_update in replica_updates:
678
707
  for key, details in replica_update.items():
@@ -754,6 +783,22 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
754
783
 
755
784
  return response
756
785
 
786
+ #
787
+ # Contributor Insights
788
+ #
789
+
790
+ @handler("DescribeContributorInsights", expand=False)
791
+ def describe_contributor_insights(
792
+ self,
793
+ context: RequestContext,
794
+ describe_contributor_insights_input: DescribeContributorInsightsInput,
795
+ ) -> DescribeContributorInsightsOutput:
796
+ return DescribeContributorInsightsOutput(
797
+ TableName=describe_contributor_insights_input["TableName"],
798
+ IndexName=describe_contributor_insights_input.get("IndexName"),
799
+ ContributorInsightsStatus="DISABLED",
800
+ )
801
+
757
802
  #
758
803
  # Item ops
759
804
  #
@@ -1032,7 +1077,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1032
1077
  replication_group: ReplicaList,
1033
1078
  **kwargs,
1034
1079
  ) -> CreateGlobalTableOutput:
1035
- global_tables: Dict = get_store(context.account_id, context.region).GLOBAL_TABLES
1080
+ global_tables: dict = get_store(context.account_id, context.region).GLOBAL_TABLES
1036
1081
  if global_table_name in global_tables:
1037
1082
  raise GlobalTableAlreadyExistsException("Global table with this name already exists")
1038
1083
  replication_group = [grp.copy() for grp in replication_group or []]
@@ -1110,7 +1155,14 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1110
1155
  enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
1111
1156
  **kwargs,
1112
1157
  ) -> KinesisStreamingDestinationOutput:
1113
- self.ensure_table_exists(context.account_id, context.region, table_name)
1158
+ self.ensure_table_exists(
1159
+ context.account_id,
1160
+ context.region,
1161
+ table_name,
1162
+ error_message=f"Requested resource not found: Table: {table_name} not found",
1163
+ )
1164
+
1165
+ enable_kinesis_streaming_configuration = enable_kinesis_streaming_configuration or {}
1114
1166
 
1115
1167
  if not kinesis_stream_exists(stream_arn=stream_arn):
1116
1168
  raise ValidationException("User does not have a permission to use kinesis stream")
@@ -1127,9 +1179,8 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1127
1179
  "to perform ENABLE operation."
1128
1180
  )
1129
1181
 
1130
- table_def["KinesisDataStreamDestinations"] = (
1131
- table_def.get("KinesisDataStreamDestinations") or []
1132
- )
1182
+ table_def.setdefault("KinesisDataStreamDestinations", [])
1183
+
1133
1184
  # remove the stream destination if already present
1134
1185
  table_def["KinesisDataStreamDestinations"] = [
1135
1186
  t for t in table_def["KinesisDataStreamDestinations"] if t["StreamArn"] != stream_arn
@@ -1140,11 +1191,15 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1140
1191
  "DestinationStatus": DestinationStatus.ACTIVE,
1141
1192
  "DestinationStatusDescription": "Stream is active",
1142
1193
  "StreamArn": stream_arn,
1194
+ "ApproximateCreationDateTimePrecision": ApproximateCreationDateTimePrecision.MILLISECOND,
1143
1195
  }
1144
1196
  )
1145
1197
  table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.ACTIVE
1146
1198
  return KinesisStreamingDestinationOutput(
1147
- DestinationStatus=DestinationStatus.ACTIVE, StreamArn=stream_arn, TableName=table_name
1199
+ DestinationStatus=DestinationStatus.ENABLING,
1200
+ StreamArn=stream_arn,
1201
+ TableName=table_name,
1202
+ EnableKinesisStreamingConfiguration=enable_kinesis_streaming_configuration,
1148
1203
  )
1149
1204
 
1150
1205
  def disable_kinesis_streaming_destination(
@@ -1155,8 +1210,14 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1155
1210
  enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
1156
1211
  **kwargs,
1157
1212
  ) -> KinesisStreamingDestinationOutput:
1158
- self.ensure_table_exists(context.account_id, context.region, table_name)
1159
- if not kinesis_stream_exists(stream_arn):
1213
+ self.ensure_table_exists(
1214
+ context.account_id,
1215
+ context.region,
1216
+ table_name,
1217
+ error_message=f"Requested resource not found: Table: {table_name} not found",
1218
+ )
1219
+
1220
+ if not kinesis_stream_exists(stream_arn=stream_arn):
1160
1221
  raise ValidationException(
1161
1222
  "User does not have a permission to use kinesis stream",
1162
1223
  )
@@ -1177,7 +1238,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1177
1238
  dest["DestinationStatusDescription"] = ("Stream is disabled",)
1178
1239
  table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.DISABLED
1179
1240
  return KinesisStreamingDestinationOutput(
1180
- DestinationStatus=DestinationStatus.DISABLED,
1241
+ DestinationStatus=DestinationStatus.DISABLING,
1181
1242
  StreamArn=stream_arn,
1182
1243
  TableName=table_name,
1183
1244
  )
@@ -1196,8 +1257,81 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1196
1257
  )
1197
1258
 
1198
1259
  stream_destinations = table_def.get("KinesisDataStreamDestinations") or []
1260
+ stream_destinations = copy.deepcopy(stream_destinations)
1261
+
1262
+ for destination in stream_destinations:
1263
+ destination.pop("ApproximateCreationDateTimePrecision", None)
1264
+ destination.pop("DestinationStatusDescription", None)
1265
+
1199
1266
  return DescribeKinesisStreamingDestinationOutput(
1200
- KinesisDataStreamDestinations=stream_destinations, TableName=table_name
1267
+ KinesisDataStreamDestinations=stream_destinations,
1268
+ TableName=table_name,
1269
+ )
1270
+
1271
+ def update_kinesis_streaming_destination(
1272
+ self,
1273
+ context: RequestContext,
1274
+ table_name: TableArn,
1275
+ stream_arn: StreamArn,
1276
+ update_kinesis_streaming_configuration: UpdateKinesisStreamingConfiguration | None = None,
1277
+ **kwargs,
1278
+ ) -> UpdateKinesisStreamingDestinationOutput:
1279
+ self.ensure_table_exists(context.account_id, context.region, table_name)
1280
+
1281
+ if not update_kinesis_streaming_configuration:
1282
+ raise ValidationException(
1283
+ "Streaming destination cannot be updated with given parameters: "
1284
+ "UpdateKinesisStreamingConfiguration cannot be null or contain only null values"
1285
+ )
1286
+
1287
+ time_precision = update_kinesis_streaming_configuration.get(
1288
+ "ApproximateCreationDateTimePrecision"
1289
+ )
1290
+ if time_precision not in (
1291
+ ApproximateCreationDateTimePrecision.MILLISECOND,
1292
+ ApproximateCreationDateTimePrecision.MICROSECOND,
1293
+ ):
1294
+ raise ValidationException(
1295
+ f"1 validation error detected: Value '{time_precision}' at "
1296
+ "'updateKinesisStreamingConfiguration.approximateCreationDateTimePrecision' failed to satisfy constraint: "
1297
+ "Member must satisfy enum value set: [MILLISECOND, MICROSECOND]"
1298
+ )
1299
+
1300
+ store = get_store(context.account_id, context.region)
1301
+
1302
+ table_def = store.table_definitions.get(table_name) or {}
1303
+ table_def.setdefault("KinesisDataStreamDestinations", [])
1304
+
1305
+ table_id = table_def["TableId"]
1306
+
1307
+ destination = None
1308
+ for stream in table_def["KinesisDataStreamDestinations"]:
1309
+ if stream["StreamArn"] == stream_arn:
1310
+ destination = stream
1311
+
1312
+ if destination is None:
1313
+ raise ValidationException(
1314
+ "Table is not in a valid state to enable Kinesis Streaming Destination: "
1315
+ f"No streaming destination with streamArn: {stream_arn} found for table with tableName: {table_name}"
1316
+ )
1317
+
1318
+ if (
1319
+ existing_precision := destination["ApproximateCreationDateTimePrecision"]
1320
+ ) == update_kinesis_streaming_configuration["ApproximateCreationDateTimePrecision"]:
1321
+ raise ValidationException(
1322
+ f"Invalid Request: Precision is already set to the desired value of {existing_precision} "
1323
+ f"for tableId: {table_id}, kdsArn: {stream_arn}"
1324
+ )
1325
+
1326
+ destination["ApproximateCreationDateTimePrecision"] = time_precision
1327
+
1328
+ return UpdateKinesisStreamingDestinationOutput(
1329
+ TableName=table_name,
1330
+ StreamArn=stream_arn,
1331
+ DestinationStatus=DestinationStatus.UPDATING,
1332
+ UpdateKinesisStreamingConfiguration=UpdateKinesisStreamingConfiguration(
1333
+ ApproximateCreationDateTimePrecision=time_precision,
1334
+ ),
1201
1335
  )
1202
1336
 
1203
1337
  #
@@ -1275,7 +1409,12 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1275
1409
  return dynamodb_table_exists(table_name, client)
1276
1410
 
1277
1411
  @staticmethod
1278
- def ensure_table_exists(account_id: str, region_name: str, table_name: str):
1412
+ def ensure_table_exists(
1413
+ account_id: str,
1414
+ region_name: str,
1415
+ table_name: str,
1416
+ error_message: str = "Cannot do operations on a non-existent table",
1417
+ ):
1279
1418
  """
1280
1419
  Raise ResourceNotFoundException if the given table does not exist.
1281
1420
 
@@ -1285,7 +1424,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1285
1424
  :raise: ResourceNotFoundException if table does not exist in DynamoDB Local
1286
1425
  """
1287
1426
  if not DynamoDBProvider.table_exists(account_id, region_name, table_name):
1288
- raise ResourceNotFoundException("Cannot do operations on a non-existent table")
1427
+ raise ResourceNotFoundException(error_message)
1289
1428
 
1290
1429
  @staticmethod
1291
1430
  def get_global_table_region(context: RequestContext, table_name: str) -> str:
@@ -1312,7 +1451,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1312
1451
  return context.region
1313
1452
 
1314
1453
  @staticmethod
1315
- def prepare_request_headers(headers: Dict, account_id: str, region_name: str):
1454
+ def prepare_request_headers(headers: dict, account_id: str, region_name: str):
1316
1455
  """
1317
1456
  Modify the Credentials field of Authorization header to achieve namespacing in DynamoDBLocal.
1318
1457
  """
@@ -1329,7 +1468,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1329
1468
  flags=re.IGNORECASE,
1330
1469
  )
1331
1470
 
1332
- def fix_consumed_capacity(self, request: Dict, result: Dict):
1471
+ def fix_consumed_capacity(self, request: dict, result: dict):
1333
1472
  # make sure we append 'ConsumedCapacity', which is properly
1334
1473
  # returned by dynalite, but not by AWS's DynamoDBLocal
1335
1474
  table_name = request.get("TableName")
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  import threading
3
- from typing import TYPE_CHECKING, Dict
3
+ from typing import TYPE_CHECKING
4
4
 
5
5
  from bson.json_util import dumps
6
6
 
@@ -206,7 +206,7 @@ def kinesis_shard_id(dynamodbstream_shard_id: str) -> str:
206
206
  return f"{shard_params[0]}-{shard_params[-1]}"
207
207
 
208
208
 
209
- def get_shard_id(stream: Dict, kinesis_shard_id: str) -> str:
209
+ def get_shard_id(stream: dict, kinesis_shard_id: str) -> str:
210
210
  ddb_stream_shard_id = stream.get("shards_id_map", {}).get(kinesis_shard_id)
211
211
  if not ddb_stream_shard_id:
212
212
  ddb_stream_shard_id = shard_id(kinesis_shard_id)