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
@@ -1,5 +1,4 @@
1
1
  import os
2
- from typing import List
3
2
 
4
3
  from localstack import config
5
4
  from localstack.constants import ARTIFACTS_REPO, MAVEN_REPO_URL
@@ -18,7 +17,8 @@ from localstack.utils.run import run
18
17
  DDB_AGENT_JAR_URL = f"{ARTIFACTS_REPO}/raw/e4e8c8e294b1fcda90c678ff6af5d5ebe1f091eb/dynamodb-local-patch/target/ddb-local-loader-0.2.jar"
19
18
  JAVASSIST_JAR_URL = f"{MAVEN_REPO_URL}/org/javassist/javassist/3.30.2-GA/javassist-3.30.2-GA.jar"
20
19
 
21
- DDBLOCAL_URL = "https://d1ni2b6xgvw0s0.cloudfront.net/v3.x/dynamodb_local_latest.zip"
20
+ # URL points to 2.x here - however the latest 3.x builds are available under this URL
21
+ DDBLOCAL_URL = "https://d1ni2b6xgvw0s0.cloudfront.net/v2.x/dynamodb_local_latest.zip"
22
22
 
23
23
 
24
24
  class DynamoDBLocalPackage(Package):
@@ -28,7 +28,7 @@ class DynamoDBLocalPackage(Package):
28
28
  def _get_installer(self, _) -> PackageInstaller:
29
29
  return DynamoDBLocalPackageInstaller()
30
30
 
31
- def get_versions(self) -> List[str]:
31
+ def get_versions(self) -> list[str]:
32
32
  return ["2"]
33
33
 
34
34
 
@@ -12,7 +12,6 @@ from concurrent.futures import ThreadPoolExecutor
12
12
  from contextlib import contextmanager
13
13
  from datetime import datetime
14
14
  from operator import itemgetter
15
- from typing import Dict, List, Optional
16
15
 
17
16
  import requests
18
17
  import werkzeug
@@ -27,6 +26,7 @@ from localstack.aws.api import (
27
26
  handler,
28
27
  )
29
28
  from localstack.aws.api.dynamodb import (
29
+ ApproximateCreationDateTimePrecision,
30
30
  AttributeMap,
31
31
  BatchExecuteStatementOutput,
32
32
  BatchGetItemOutput,
@@ -47,6 +47,8 @@ from localstack.aws.api.dynamodb import (
47
47
  DeleteRequest,
48
48
  DeleteTableOutput,
49
49
  DescribeContinuousBackupsOutput,
50
+ DescribeContributorInsightsInput,
51
+ DescribeContributorInsightsOutput,
50
52
  DescribeGlobalTableOutput,
51
53
  DescribeKinesisStreamingDestinationOutput,
52
54
  DescribeTableOutput,
@@ -92,6 +94,7 @@ from localstack.aws.api.dynamodb import (
92
94
  ScanInput,
93
95
  ScanOutput,
94
96
  StreamArn,
97
+ TableArn,
95
98
  TableDescription,
96
99
  TableName,
97
100
  TagKeyList,
@@ -108,6 +111,8 @@ from localstack.aws.api.dynamodb import (
108
111
  UpdateGlobalTableOutput,
109
112
  UpdateItemInput,
110
113
  UpdateItemOutput,
114
+ UpdateKinesisStreamingConfiguration,
115
+ UpdateKinesisStreamingDestinationOutput,
111
116
  UpdateTableInput,
112
117
  UpdateTableOutput,
113
118
  UpdateTimeToLiveOutput,
@@ -488,7 +493,7 @@ class ExpiredItemsWorker:
488
493
  def __init__(self) -> None:
489
494
  super().__init__()
490
495
  self.scheduler = Scheduler()
491
- self.thread: Optional[FuncThread] = None
496
+ self.thread: FuncThread | None = None
492
497
  self.mutex = threading.RLock()
493
498
 
494
499
  def start(self):
@@ -743,6 +748,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
743
748
  if "NumberOfDecreasesToday" not in table_description["ProvisionedThroughput"]:
744
749
  table_description["ProvisionedThroughput"]["NumberOfDecreasesToday"] = 0
745
750
 
751
+ if "WarmThroughput" in table_description:
752
+ table_description["WarmThroughput"]["Status"] = "UPDATING"
753
+
746
754
  tags = table_definitions.pop("Tags", [])
747
755
  if tags:
748
756
  get_store(context.account_id, context.region).TABLE_TAGS[table_arn] = {
@@ -760,6 +768,13 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
760
768
  ) -> DeleteTableOutput:
761
769
  global_table_region = self.get_global_table_region(context, table_name)
762
770
 
771
+ self.ensure_table_exists(
772
+ context.account_id,
773
+ global_table_region,
774
+ table_name,
775
+ error_message=f"Requested resource not found: Table: {table_name} not found",
776
+ )
777
+
763
778
  # Limitation note: On AWS, for a replicated table, if the source table is deleted, the replicated tables continue to exist.
764
779
  # This is not the case for LocalStack, where all replicated tables will also be removed if source is deleted.
765
780
 
@@ -792,7 +807,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
792
807
  store = get_store(context.account_id, context.region)
793
808
 
794
809
  # Update replication details
795
- replicas: Dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
810
+ replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
796
811
 
797
812
  replica_description_list = []
798
813
 
@@ -820,6 +835,9 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
820
835
  table_description["TableClassSummary"] = {
821
836
  "TableClass": table_definitions["TableClass"]
822
837
  }
838
+ if warm_throughput := table_definitions.get("WarmThroughput"):
839
+ table_description["WarmThroughput"] = warm_throughput.copy()
840
+ table_description["WarmThroughput"].setdefault("Status", "ACTIVE")
823
841
 
824
842
  if "GlobalSecondaryIndexes" in table_description:
825
843
  for gsi in table_description["GlobalSecondaryIndexes"]:
@@ -832,6 +850,17 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
832
850
  # Terraform depends on this parity for update operations
833
851
  gsi["ProvisionedThroughput"] = default_values | gsi.get("ProvisionedThroughput", {})
834
852
 
853
+ # Set defaults for warm throughput
854
+ if "WarmThroughput" not in table_description:
855
+ billing_mode = table_definitions.get("BillingMode") if table_definitions else None
856
+ table_description["WarmThroughput"] = {
857
+ "ReadUnitsPerSecond": 12000 if billing_mode == "PAY_PER_REQUEST" else 5,
858
+ "WriteUnitsPerSecond": 4000 if billing_mode == "PAY_PER_REQUEST" else 5,
859
+ }
860
+ table_description["WarmThroughput"]["Status"] = (
861
+ table_description.get("TableStatus") or "ACTIVE"
862
+ )
863
+
835
864
  return DescribeTableOutput(
836
865
  Table=select_from_typed_dict(TableDescription, table_description)
837
866
  )
@@ -861,7 +890,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
861
890
  store = get_store(context.account_id, global_table_region)
862
891
 
863
892
  # Dict with source region to set of replicated regions
864
- replicas: Dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
893
+ replicas: dict[RegionName, ReplicaDescription] = store.REPLICAS.get(table_name, {})
865
894
 
866
895
  for replica_update in replica_updates:
867
896
  for key, details in replica_update.items():
@@ -952,6 +981,22 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
952
981
 
953
982
  return response
954
983
 
984
+ #
985
+ # Contributor Insights
986
+ #
987
+
988
+ @handler("DescribeContributorInsights", expand=False)
989
+ def describe_contributor_insights(
990
+ self,
991
+ context: RequestContext,
992
+ describe_contributor_insights_input: DescribeContributorInsightsInput,
993
+ ) -> DescribeContributorInsightsOutput:
994
+ return DescribeContributorInsightsOutput(
995
+ TableName=describe_contributor_insights_input["TableName"],
996
+ IndexName=describe_contributor_insights_input.get("IndexName"),
997
+ ContributorInsightsStatus="DISABLED",
998
+ )
999
+
955
1000
  #
956
1001
  # Item ops
957
1002
  #
@@ -1508,7 +1553,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1508
1553
  replication_group: ReplicaList,
1509
1554
  **kwargs,
1510
1555
  ) -> CreateGlobalTableOutput:
1511
- global_tables: Dict = get_store(context.account_id, context.region).GLOBAL_TABLES
1556
+ global_tables: dict = get_store(context.account_id, context.region).GLOBAL_TABLES
1512
1557
  if global_table_name in global_tables:
1513
1558
  raise GlobalTableAlreadyExistsException("Global table with this name already exists")
1514
1559
  replication_group = [grp.copy() for grp in replication_group or []]
@@ -1586,7 +1631,15 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1586
1631
  enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
1587
1632
  **kwargs,
1588
1633
  ) -> KinesisStreamingDestinationOutput:
1589
- self.ensure_table_exists(context.account_id, context.region, table_name)
1634
+ self.ensure_table_exists(
1635
+ context.account_id,
1636
+ context.region,
1637
+ table_name,
1638
+ error_message=f"Requested resource not found: Table: {table_name} not found",
1639
+ )
1640
+
1641
+ # TODO: Use the time precision in config if set
1642
+ enable_kinesis_streaming_configuration = enable_kinesis_streaming_configuration or {}
1590
1643
 
1591
1644
  stream = self._event_forwarder.is_kinesis_stream_exists(stream_arn=stream_arn)
1592
1645
  if not stream:
@@ -1604,9 +1657,8 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1604
1657
  "to perform ENABLE operation."
1605
1658
  )
1606
1659
 
1607
- table_def["KinesisDataStreamDestinations"] = (
1608
- table_def.get("KinesisDataStreamDestinations") or []
1609
- )
1660
+ table_def.setdefault("KinesisDataStreamDestinations", [])
1661
+
1610
1662
  # remove the stream destination if already present
1611
1663
  table_def["KinesisDataStreamDestinations"] = [
1612
1664
  t for t in table_def["KinesisDataStreamDestinations"] if t["StreamArn"] != stream_arn
@@ -1617,11 +1669,15 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1617
1669
  "DestinationStatus": DestinationStatus.ACTIVE,
1618
1670
  "DestinationStatusDescription": "Stream is active",
1619
1671
  "StreamArn": stream_arn,
1672
+ "ApproximateCreationDateTimePrecision": ApproximateCreationDateTimePrecision.MILLISECOND,
1620
1673
  }
1621
1674
  )
1622
1675
  table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.ACTIVE
1623
1676
  return KinesisStreamingDestinationOutput(
1624
- DestinationStatus=DestinationStatus.ACTIVE, StreamArn=stream_arn, TableName=table_name
1677
+ DestinationStatus=DestinationStatus.ENABLING,
1678
+ StreamArn=stream_arn,
1679
+ TableName=table_name,
1680
+ EnableKinesisStreamingConfiguration=enable_kinesis_streaming_configuration,
1625
1681
  )
1626
1682
 
1627
1683
  def disable_kinesis_streaming_destination(
@@ -1632,7 +1688,14 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1632
1688
  enable_kinesis_streaming_configuration: EnableKinesisStreamingConfiguration = None,
1633
1689
  **kwargs,
1634
1690
  ) -> KinesisStreamingDestinationOutput:
1635
- self.ensure_table_exists(context.account_id, context.region, table_name)
1691
+ self.ensure_table_exists(
1692
+ context.account_id,
1693
+ context.region,
1694
+ table_name,
1695
+ error_message=f"Requested resource not found: Table: {table_name} not found",
1696
+ )
1697
+
1698
+ # TODO: Must raise if invoked before KinesisStreamingDestination is ACTIVE
1636
1699
 
1637
1700
  stream = self._event_forwarder.is_kinesis_stream_exists(stream_arn=stream_arn)
1638
1701
  if not stream:
@@ -1656,7 +1719,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1656
1719
  dest["DestinationStatusDescription"] = ("Stream is disabled",)
1657
1720
  table_def["KinesisDataStreamDestinationStatus"] = DestinationStatus.DISABLED
1658
1721
  return KinesisStreamingDestinationOutput(
1659
- DestinationStatus=DestinationStatus.DISABLED,
1722
+ DestinationStatus=DestinationStatus.DISABLING,
1660
1723
  StreamArn=stream_arn,
1661
1724
  TableName=table_name,
1662
1725
  )
@@ -1675,8 +1738,81 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1675
1738
  )
1676
1739
 
1677
1740
  stream_destinations = table_def.get("KinesisDataStreamDestinations") or []
1741
+ stream_destinations = copy.deepcopy(stream_destinations)
1742
+
1743
+ for destination in stream_destinations:
1744
+ destination.pop("ApproximateCreationDateTimePrecision", None)
1745
+ destination.pop("DestinationStatusDescription", None)
1746
+
1678
1747
  return DescribeKinesisStreamingDestinationOutput(
1679
- KinesisDataStreamDestinations=stream_destinations, TableName=table_name
1748
+ KinesisDataStreamDestinations=stream_destinations,
1749
+ TableName=table_name,
1750
+ )
1751
+
1752
+ def update_kinesis_streaming_destination(
1753
+ self,
1754
+ context: RequestContext,
1755
+ table_name: TableArn,
1756
+ stream_arn: StreamArn,
1757
+ update_kinesis_streaming_configuration: UpdateKinesisStreamingConfiguration | None = None,
1758
+ **kwargs,
1759
+ ) -> UpdateKinesisStreamingDestinationOutput:
1760
+ self.ensure_table_exists(context.account_id, context.region, table_name)
1761
+
1762
+ if not update_kinesis_streaming_configuration:
1763
+ raise ValidationException(
1764
+ "Streaming destination cannot be updated with given parameters: "
1765
+ "UpdateKinesisStreamingConfiguration cannot be null or contain only null values"
1766
+ )
1767
+
1768
+ time_precision = update_kinesis_streaming_configuration.get(
1769
+ "ApproximateCreationDateTimePrecision"
1770
+ )
1771
+ if time_precision not in (
1772
+ ApproximateCreationDateTimePrecision.MILLISECOND,
1773
+ ApproximateCreationDateTimePrecision.MICROSECOND,
1774
+ ):
1775
+ raise ValidationException(
1776
+ f"1 validation error detected: Value '{time_precision}' at "
1777
+ "'updateKinesisStreamingConfiguration.approximateCreationDateTimePrecision' failed to satisfy constraint: "
1778
+ "Member must satisfy enum value set: [MILLISECOND, MICROSECOND]"
1779
+ )
1780
+
1781
+ store = get_store(context.account_id, context.region)
1782
+
1783
+ table_def = store.table_definitions.get(table_name) or {}
1784
+ table_def.setdefault("KinesisDataStreamDestinations", [])
1785
+
1786
+ table_id = table_def["TableId"]
1787
+
1788
+ destination = None
1789
+ for stream in table_def["KinesisDataStreamDestinations"]:
1790
+ if stream["StreamArn"] == stream_arn:
1791
+ destination = stream
1792
+
1793
+ if destination is None:
1794
+ raise ValidationException(
1795
+ "Table is not in a valid state to enable Kinesis Streaming Destination: "
1796
+ f"No streaming destination with streamArn: {stream_arn} found for table with tableName: {table_name}"
1797
+ )
1798
+
1799
+ if (
1800
+ existing_precision := destination["ApproximateCreationDateTimePrecision"]
1801
+ ) == update_kinesis_streaming_configuration["ApproximateCreationDateTimePrecision"]:
1802
+ raise ValidationException(
1803
+ f"Invalid Request: Precision is already set to the desired value of {existing_precision} "
1804
+ f"for tableId: {table_id}, kdsArn: {stream_arn}"
1805
+ )
1806
+
1807
+ destination["ApproximateCreationDateTimePrecision"] = time_precision
1808
+
1809
+ return UpdateKinesisStreamingDestinationOutput(
1810
+ TableName=table_name,
1811
+ StreamArn=stream_arn,
1812
+ DestinationStatus=DestinationStatus.UPDATING,
1813
+ UpdateKinesisStreamingConfiguration=UpdateKinesisStreamingConfiguration(
1814
+ ApproximateCreationDateTimePrecision=time_precision,
1815
+ ),
1680
1816
  )
1681
1817
 
1682
1818
  #
@@ -1754,7 +1890,12 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1754
1890
  return dynamodb_table_exists(table_name, client)
1755
1891
 
1756
1892
  @staticmethod
1757
- def ensure_table_exists(account_id: str, region_name: str, table_name: str):
1893
+ def ensure_table_exists(
1894
+ account_id: str,
1895
+ region_name: str,
1896
+ table_name: str,
1897
+ error_message: str = "Cannot do operations on a non-existent table",
1898
+ ):
1758
1899
  """
1759
1900
  Raise ResourceNotFoundException if the given table does not exist.
1760
1901
 
@@ -1764,7 +1905,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1764
1905
  :raise: ResourceNotFoundException if table does not exist in DynamoDB Local
1765
1906
  """
1766
1907
  if not DynamoDBProvider.table_exists(account_id, region_name, table_name):
1767
- raise ResourceNotFoundException("Cannot do operations on a non-existent table")
1908
+ raise ResourceNotFoundException(error_message)
1768
1909
 
1769
1910
  @staticmethod
1770
1911
  def get_global_table_region(context: RequestContext, table_name: str) -> str:
@@ -1791,7 +1932,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1791
1932
  return context.region
1792
1933
 
1793
1934
  @staticmethod
1794
- def prepare_request_headers(headers: Dict, account_id: str, region_name: str):
1935
+ def prepare_request_headers(headers: dict, account_id: str, region_name: str):
1795
1936
  """
1796
1937
  Modify the Credentials field of Authorization header to achieve namespacing in DynamoDBLocal.
1797
1938
  """
@@ -1808,7 +1949,7 @@ class DynamoDBProvider(DynamodbApi, ServiceLifecycleHook):
1808
1949
  flags=re.IGNORECASE,
1809
1950
  )
1810
1951
 
1811
- def fix_consumed_capacity(self, request: Dict, result: Dict):
1952
+ def fix_consumed_capacity(self, request: dict, result: dict):
1812
1953
  # make sure we append 'ConsumedCapacity', which is properly
1813
1954
  # returned by dynalite, but not by AWS's DynamoDBLocal
1814
1955
  table_name = request.get("TableName")
@@ -2182,7 +2323,7 @@ def get_updated_records(
2182
2323
  account_id: str,
2183
2324
  region_name: str,
2184
2325
  table_name: str,
2185
- existing_items: List,
2326
+ existing_items: list,
2186
2327
  server_url: str,
2187
2328
  table_stream_type: TableStreamType,
2188
2329
  ) -> RecordsMap:
@@ -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,125 +14,125 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class DynamoDBGlobalTableProperties(TypedDict):
17
- AttributeDefinitions: Optional[list[AttributeDefinition]]
18
- KeySchema: Optional[list[KeySchema]]
19
- Replicas: Optional[list[ReplicaSpecification]]
20
- Arn: Optional[str]
21
- BillingMode: Optional[str]
22
- GlobalSecondaryIndexes: Optional[list[GlobalSecondaryIndex]]
23
- LocalSecondaryIndexes: Optional[list[LocalSecondaryIndex]]
24
- SSESpecification: Optional[SSESpecification]
25
- StreamArn: Optional[str]
26
- StreamSpecification: Optional[StreamSpecification]
27
- TableId: Optional[str]
28
- TableName: Optional[str]
29
- TimeToLiveSpecification: Optional[TimeToLiveSpecification]
30
- WriteProvisionedThroughputSettings: Optional[WriteProvisionedThroughputSettings]
17
+ AttributeDefinitions: list[AttributeDefinition] | None
18
+ KeySchema: list[KeySchema] | None
19
+ Replicas: list[ReplicaSpecification] | None
20
+ Arn: str | None
21
+ BillingMode: str | None
22
+ GlobalSecondaryIndexes: list[GlobalSecondaryIndex] | None
23
+ LocalSecondaryIndexes: list[LocalSecondaryIndex] | None
24
+ SSESpecification: SSESpecification | None
25
+ StreamArn: str | None
26
+ StreamSpecification: StreamSpecification | None
27
+ TableId: str | None
28
+ TableName: str | None
29
+ TimeToLiveSpecification: TimeToLiveSpecification | None
30
+ WriteProvisionedThroughputSettings: WriteProvisionedThroughputSettings | None
31
31
 
32
32
 
33
33
  class AttributeDefinition(TypedDict):
34
- AttributeName: Optional[str]
35
- AttributeType: Optional[str]
34
+ AttributeName: str | None
35
+ AttributeType: str | None
36
36
 
37
37
 
38
38
  class KeySchema(TypedDict):
39
- AttributeName: Optional[str]
40
- KeyType: Optional[str]
39
+ AttributeName: str | None
40
+ KeyType: str | None
41
41
 
42
42
 
43
43
  class Projection(TypedDict):
44
- NonKeyAttributes: Optional[list[str]]
45
- ProjectionType: Optional[str]
44
+ NonKeyAttributes: list[str] | None
45
+ ProjectionType: str | None
46
46
 
47
47
 
48
48
  class TargetTrackingScalingPolicyConfiguration(TypedDict):
49
- TargetValue: Optional[float]
50
- DisableScaleIn: Optional[bool]
51
- ScaleInCooldown: Optional[int]
52
- ScaleOutCooldown: Optional[int]
49
+ TargetValue: float | None
50
+ DisableScaleIn: bool | None
51
+ ScaleInCooldown: int | None
52
+ ScaleOutCooldown: int | None
53
53
 
54
54
 
55
55
  class CapacityAutoScalingSettings(TypedDict):
56
- MaxCapacity: Optional[int]
57
- MinCapacity: Optional[int]
58
- TargetTrackingScalingPolicyConfiguration: Optional[TargetTrackingScalingPolicyConfiguration]
59
- SeedCapacity: Optional[int]
56
+ MaxCapacity: int | None
57
+ MinCapacity: int | None
58
+ TargetTrackingScalingPolicyConfiguration: TargetTrackingScalingPolicyConfiguration | None
59
+ SeedCapacity: int | None
60
60
 
61
61
 
62
62
  class WriteProvisionedThroughputSettings(TypedDict):
63
- WriteCapacityAutoScalingSettings: Optional[CapacityAutoScalingSettings]
63
+ WriteCapacityAutoScalingSettings: CapacityAutoScalingSettings | None
64
64
 
65
65
 
66
66
  class GlobalSecondaryIndex(TypedDict):
67
- IndexName: Optional[str]
68
- KeySchema: Optional[list[KeySchema]]
69
- Projection: Optional[Projection]
70
- WriteProvisionedThroughputSettings: Optional[WriteProvisionedThroughputSettings]
67
+ IndexName: str | None
68
+ KeySchema: list[KeySchema] | None
69
+ Projection: Projection | None
70
+ WriteProvisionedThroughputSettings: WriteProvisionedThroughputSettings | None
71
71
 
72
72
 
73
73
  class LocalSecondaryIndex(TypedDict):
74
- IndexName: Optional[str]
75
- KeySchema: Optional[list[KeySchema]]
76
- Projection: Optional[Projection]
74
+ IndexName: str | None
75
+ KeySchema: list[KeySchema] | None
76
+ Projection: Projection | None
77
77
 
78
78
 
79
79
  class ContributorInsightsSpecification(TypedDict):
80
- Enabled: Optional[bool]
80
+ Enabled: bool | None
81
81
 
82
82
 
83
83
  class ReadProvisionedThroughputSettings(TypedDict):
84
- ReadCapacityAutoScalingSettings: Optional[CapacityAutoScalingSettings]
85
- ReadCapacityUnits: Optional[int]
84
+ ReadCapacityAutoScalingSettings: CapacityAutoScalingSettings | None
85
+ ReadCapacityUnits: int | None
86
86
 
87
87
 
88
88
  class ReplicaGlobalSecondaryIndexSpecification(TypedDict):
89
- IndexName: Optional[str]
90
- ContributorInsightsSpecification: Optional[ContributorInsightsSpecification]
91
- ReadProvisionedThroughputSettings: Optional[ReadProvisionedThroughputSettings]
89
+ IndexName: str | None
90
+ ContributorInsightsSpecification: ContributorInsightsSpecification | None
91
+ ReadProvisionedThroughputSettings: ReadProvisionedThroughputSettings | None
92
92
 
93
93
 
94
94
  class PointInTimeRecoverySpecification(TypedDict):
95
- PointInTimeRecoveryEnabled: Optional[bool]
95
+ PointInTimeRecoveryEnabled: bool | None
96
96
 
97
97
 
98
98
  class ReplicaSSESpecification(TypedDict):
99
- KMSMasterKeyId: Optional[str]
99
+ KMSMasterKeyId: str | None
100
100
 
101
101
 
102
102
  class Tag(TypedDict):
103
- Key: Optional[str]
104
- Value: Optional[str]
103
+ Key: str | None
104
+ Value: str | None
105
105
 
106
106
 
107
107
  class KinesisStreamSpecification(TypedDict):
108
- StreamArn: Optional[str]
108
+ StreamArn: str | None
109
109
 
110
110
 
111
111
  class ReplicaSpecification(TypedDict):
112
- Region: Optional[str]
113
- ContributorInsightsSpecification: Optional[ContributorInsightsSpecification]
114
- DeletionProtectionEnabled: Optional[bool]
115
- GlobalSecondaryIndexes: Optional[list[ReplicaGlobalSecondaryIndexSpecification]]
116
- KinesisStreamSpecification: Optional[KinesisStreamSpecification]
117
- PointInTimeRecoverySpecification: Optional[PointInTimeRecoverySpecification]
118
- ReadProvisionedThroughputSettings: Optional[ReadProvisionedThroughputSettings]
119
- SSESpecification: Optional[ReplicaSSESpecification]
120
- TableClass: Optional[str]
121
- Tags: Optional[list[Tag]]
112
+ Region: str | None
113
+ ContributorInsightsSpecification: ContributorInsightsSpecification | None
114
+ DeletionProtectionEnabled: bool | None
115
+ GlobalSecondaryIndexes: list[ReplicaGlobalSecondaryIndexSpecification] | None
116
+ KinesisStreamSpecification: KinesisStreamSpecification | None
117
+ PointInTimeRecoverySpecification: PointInTimeRecoverySpecification | None
118
+ ReadProvisionedThroughputSettings: ReadProvisionedThroughputSettings | None
119
+ SSESpecification: ReplicaSSESpecification | None
120
+ TableClass: str | None
121
+ Tags: list[Tag] | None
122
122
 
123
123
 
124
124
  class SSESpecification(TypedDict):
125
- SSEEnabled: Optional[bool]
126
- SSEType: Optional[str]
125
+ SSEEnabled: bool | None
126
+ SSEType: str | None
127
127
 
128
128
 
129
129
  class StreamSpecification(TypedDict):
130
- StreamViewType: Optional[str]
130
+ StreamViewType: str | None
131
131
 
132
132
 
133
133
  class TimeToLiveSpecification(TypedDict):
134
- Enabled: Optional[bool]
135
- AttributeName: Optional[str]
134
+ Enabled: bool | None
135
+ AttributeName: str | None
136
136
 
137
137
 
138
138
  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 DynamoDBGlobalTableProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::DynamoDB::GlobalTable"
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_globaltable import (