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
@@ -0,0 +1,38 @@
1
+ from datetime import datetime
2
+ from typing import NotRequired, TypedDict
3
+
4
+ from localstack.aws.api.cloudformation import ResourceStatus
5
+
6
+
7
+ class EngineParameter(TypedDict):
8
+ """
9
+ Parameters supplied by the user. The resolved value field is populated by the engine
10
+ """
11
+
12
+ type_: str
13
+ given_value: NotRequired[str | None]
14
+ resolved_value: NotRequired[str | None]
15
+ default_value: NotRequired[str | None]
16
+ no_echo: NotRequired[bool | None]
17
+
18
+
19
+ def engine_parameter_value(parameter: EngineParameter) -> str:
20
+ given_value = parameter.get("given_value")
21
+ if given_value is not None:
22
+ return given_value
23
+
24
+ default_value = parameter.get("default_value")
25
+ if default_value is not None:
26
+ return default_value
27
+
28
+ raise RuntimeError("Parameter value is None")
29
+
30
+
31
+ class ResolvedResource(TypedDict):
32
+ LogicalResourceId: str
33
+ Type: str
34
+ Properties: dict
35
+ LastUpdatedTimestamp: datetime
36
+ ResourceStatus: NotRequired[ResourceStatus]
37
+ PhysicalResourceId: NotRequired[str]
38
+ ResourceStatusReason: NotRequired[str]
@@ -2,4 +2,7 @@ from localstack import config
2
2
 
3
3
 
4
4
  def is_v2_engine() -> bool:
5
- return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation") == "engine-v2"
5
+ return config.SERVICE_PROVIDER_CONFIG.get_provider("cloudformation") not in {
6
+ "engine-legacy",
7
+ "engine-legacy_pro",
8
+ }
@@ -2,8 +2,8 @@ import json
2
2
  import logging
3
3
  import math
4
4
  import threading
5
- from datetime import datetime, timedelta, timezone
6
- from typing import TYPE_CHECKING, List, Optional
5
+ from datetime import UTC, datetime, timedelta
6
+ from typing import TYPE_CHECKING
7
7
 
8
8
  from localstack.aws.api.cloudwatch import MetricAlarm, MetricDataQuery, MetricStat, StateValue
9
9
  from localstack.aws.connect import connect_to
@@ -69,7 +69,10 @@ class AlarmScheduler:
69
69
  schedule_period = evaluation_periods * period
70
70
 
71
71
  def on_error(e):
72
- LOG.exception("Error executing scheduled alarm", exc_info=e)
72
+ if LOG.isEnabledFor(logging.DEBUG):
73
+ LOG.exception("Error executing scheduled alarm", exc_info=e)
74
+ else:
75
+ LOG.error("Error executing scheduled alarm")
73
76
 
74
77
  task = self.scheduler.schedule(
75
78
  func=calculate_alarm_state,
@@ -120,7 +123,7 @@ class AlarmScheduler:
120
123
  return True
121
124
 
122
125
 
123
- def get_metric_alarm_details_for_alarm_arn(alarm_arn: str) -> Optional[MetricAlarm]:
126
+ def get_metric_alarm_details_for_alarm_arn(alarm_arn: str) -> MetricAlarm | None:
124
127
  alarm_name = arns.extract_resource_from_arn(alarm_arn).split(":", 1)[1]
125
128
  client = get_cloudwatch_client_for_region_of_alarm(alarm_arn)
126
129
  metric_alarms = client.describe_alarms(AlarmNames=[alarm_name])["MetricAlarms"]
@@ -155,7 +158,7 @@ def generate_metric_query(alarm_details: MetricAlarm) -> MetricDataQuery:
155
158
  )
156
159
 
157
160
 
158
- def is_threshold_exceeded(metric_values: List[float], alarm_details: MetricAlarm) -> bool:
161
+ def is_threshold_exceeded(metric_values: list[float], alarm_details: MetricAlarm) -> bool:
159
162
  """Evaluates if the threshold is exceeded for the configured alarm and given metric values
160
163
 
161
164
  :param metric_values: values to compare against threshold
@@ -185,7 +188,7 @@ def is_threshold_exceeded(metric_values: List[float], alarm_details: MetricAlarm
185
188
  return False
186
189
 
187
190
 
188
- def is_triggering_premature_alarm(metric_values: List[float], alarm_details: MetricAlarm) -> bool:
191
+ def is_triggering_premature_alarm(metric_values: list[float], alarm_details: MetricAlarm) -> bool:
189
192
  """
190
193
  Checks if a premature alarm should be triggered.
191
194
  https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html#CloudWatch-alarms-avoiding-premature-transition:
@@ -217,7 +220,7 @@ def is_triggering_premature_alarm(metric_values: List[float], alarm_details: Met
217
220
  return False
218
221
 
219
222
 
220
- def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient") -> List[float]:
223
+ def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient") -> list[float]:
221
224
  """
222
225
  Collects the metric data for the evaluation interval.
223
226
 
@@ -236,7 +239,7 @@ def collect_metric_data(alarm_details: MetricAlarm, client: "CloudWatchClient")
236
239
  magic_number = max(math.floor(evaluation_periods / 3), 2)
237
240
  collected_periods = evaluation_periods + magic_number
238
241
 
239
- now = datetime.utcnow().replace(tzinfo=timezone.utc)
242
+ now = datetime.utcnow().replace(tzinfo=UTC)
240
243
  metric_query = generate_metric_query(alarm_details)
241
244
 
242
245
  # get_metric_data needs to be run in a loop, so we also collect empty data points on the right position
@@ -2,8 +2,7 @@ import logging
2
2
  import os
3
3
  import sqlite3
4
4
  import threading
5
- from datetime import datetime, timezone
6
- from typing import Dict, List, Optional
5
+ from datetime import UTC, datetime
7
6
 
8
7
  from localstack import config
9
8
  from localstack.aws.api.cloudwatch import MetricData, MetricDataQuery, ScanBy
@@ -92,7 +91,7 @@ class CloudwatchDatabase:
92
91
  self, account_id: str, region: str, namespace: str, metric_data: MetricData
93
92
  ):
94
93
  def _get_current_unix_timestamp_utc():
95
- now = datetime.utcnow().replace(tzinfo=timezone.utc)
94
+ now = datetime.utcnow().replace(tzinfo=UTC)
96
95
  return int(now.timestamp())
97
96
 
98
97
  for metric in metric_data:
@@ -218,7 +217,7 @@ class CloudwatchDatabase:
218
217
  start_time: datetime,
219
218
  end_time: datetime,
220
219
  scan_by: str,
221
- ) -> Dict[str, List]:
220
+ ) -> dict[str, list]:
222
221
  metric_stat = query.get("MetricStat")
223
222
  metric = metric_stat.get("Metric")
224
223
  period = metric_stat.get("Period")
@@ -389,7 +388,7 @@ class CloudwatchDatabase:
389
388
  cur.execute("VACUUM")
390
389
  conn.commit()
391
390
 
392
- def _get_ordered_dimensions_with_separator(self, dims: Optional[List[Dict]], for_search=False):
391
+ def _get_ordered_dimensions_with_separator(self, dims: list[dict] | None, for_search=False):
393
392
  """
394
393
  Returns a string with the dimensions in the format "Name=Value\tName=Value\tName=Value" in order to store the metric
395
394
  with the dimensions in a single column in the database
@@ -1,6 +1,4 @@
1
1
  import datetime
2
- from datetime import timezone
3
- from typing import Dict, List
4
2
 
5
3
  from localstack.aws.api.cloudwatch import CompositeAlarm, DashboardBody, MetricAlarm, StateValue
6
4
  from localstack.services.stores import (
@@ -25,7 +23,7 @@ class LocalStackMetricAlarm:
25
23
  self.set_default_attributes()
26
24
 
27
25
  def set_default_attributes(self):
28
- current_time = datetime.datetime.now(timezone.utc)
26
+ current_time = datetime.datetime.now(datetime.UTC)
29
27
  self.alarm["AlarmArn"] = arns.cloudwatch_alarm_arn(
30
28
  self.alarm["AlarmName"], account_id=self.account_id, region_name=self.region
31
29
  )
@@ -53,7 +51,7 @@ class LocalStackCompositeAlarm:
53
51
  self.set_default_attributes()
54
52
 
55
53
  def set_default_attributes(self):
56
- current_time = datetime.datetime.now(timezone.utc)
54
+ current_time = datetime.datetime.now(datetime.UTC)
57
55
  self.alarm["AlarmArn"] = arns.cloudwatch_alarm_arn(
58
56
  self.alarm["AlarmName"], account_id=self.account_id, region_name=self.region
59
57
  )
@@ -97,13 +95,13 @@ class CloudWatchStore(BaseStore):
97
95
  TAGS: TaggingService = CrossRegionAttribute(default=TaggingService)
98
96
 
99
97
  # maps resource ARN to alarms
100
- alarms: Dict[str, LocalStackAlarm] = LocalAttribute(default=dict)
98
+ alarms: dict[str, LocalStackAlarm] = LocalAttribute(default=dict)
101
99
 
102
100
  # Contains all the Alarm Histories. Per documentation, an alarm history is retained even if the alarm is deleted,
103
101
  # making it necessary to save this at store level
104
- histories: List[Dict] = LocalAttribute(default=list)
102
+ histories: list[dict] = LocalAttribute(default=list)
105
103
 
106
- dashboards: Dict[str, LocalStackDashboard] = LocalAttribute(default=dict)
104
+ dashboards: dict[str, LocalStackDashboard] = LocalAttribute(default=dict)
107
105
 
108
106
 
109
107
  cloudwatch_stores = AccountRegionBundle("cloudwatch", CloudWatchStore)
@@ -1,11 +1,11 @@
1
1
  import json
2
2
  import logging
3
3
  import uuid
4
- from typing import Any, Optional
5
- from xml.sax.saxutils import escape
4
+ from datetime import datetime
5
+ from typing import Any
6
6
 
7
7
  from moto.cloudwatch import cloudwatch_backends
8
- from moto.cloudwatch.models import CloudWatchBackend, FakeAlarm, MetricDatum
8
+ from moto.cloudwatch.models import Alarm, CloudWatchBackend, MetricDatum
9
9
 
10
10
  from localstack.aws.accounts import get_account_id_from_access_key_id
11
11
  from localstack.aws.api import CommonServiceException, RequestContext, handler
@@ -54,7 +54,7 @@ MOTO_INITIAL_UNCHECKED_REASON = "Unchecked: Initial alarm creation"
54
54
  LOG = logging.getLogger(__name__)
55
55
 
56
56
 
57
- @patch(target=FakeAlarm.update_state)
57
+ @patch(target=Alarm.update_state)
58
58
  def update_state(target, self, reason, reason_data, state_value):
59
59
  if reason_data is None:
60
60
  reason_data = ""
@@ -115,21 +115,19 @@ def put_metric_alarm(
115
115
  description: str,
116
116
  dimensions: list[dict[str, str]],
117
117
  alarm_actions: list[str],
118
- metric_data_queries: Optional[list[Any]] = None,
119
- datapoints_to_alarm: Optional[int] = None,
120
- extended_statistic: Optional[str] = None,
121
- ok_actions: Optional[list[str]] = None,
122
- insufficient_data_actions: Optional[list[str]] = None,
123
- unit: Optional[str] = None,
118
+ metric_data_queries: list[Any] | None = None,
119
+ datapoints_to_alarm: int | None = None,
120
+ extended_statistic: str | None = None,
121
+ ok_actions: list[str] | None = None,
122
+ insufficient_data_actions: list[str] | None = None,
123
+ unit: str | None = None,
124
124
  actions_enabled: bool = True,
125
- treat_missing_data: Optional[str] = None,
126
- evaluate_low_sample_count_percentile: Optional[str] = None,
127
- threshold_metric_id: Optional[str] = None,
128
- rule: Optional[str] = None,
129
- tags: Optional[list[dict[str, str]]] = None,
130
- ) -> FakeAlarm:
131
- if description:
132
- description = escape(description)
125
+ treat_missing_data: str | None = None,
126
+ evaluate_low_sample_count_percentile: str | None = None,
127
+ threshold_metric_id: str | None = None,
128
+ rule: str | None = None,
129
+ tags: list[dict[str, str]] | None = None,
130
+ ) -> Alarm:
133
131
  return target(
134
132
  self,
135
133
  name,
@@ -158,7 +156,7 @@ def put_metric_alarm(
158
156
  )
159
157
 
160
158
 
161
- def create_metric_data_query_from_alarm(alarm: FakeAlarm):
159
+ def create_metric_data_query_from_alarm(alarm: Alarm):
162
160
  # TODO may need to be adapted for other use cases
163
161
  # verified return value with a snapshot test
164
162
  return [
@@ -179,7 +177,7 @@ def create_metric_data_query_from_alarm(alarm: FakeAlarm):
179
177
 
180
178
 
181
179
  def create_message_response_update_state_lambda(
182
- alarm: FakeAlarm, old_state, old_state_reason, old_state_timestamp
180
+ alarm: Alarm, old_state, old_state_reason, old_state_timestamp
183
181
  ):
184
182
  response = {
185
183
  "accountId": extract_account_id_from_arn(alarm.alarm_arn),
@@ -189,12 +187,12 @@ def create_message_response_update_state_lambda(
189
187
  "state": {
190
188
  "value": alarm.state_value,
191
189
  "reason": alarm.state_reason,
192
- "timestamp": alarm.state_updated_timestamp,
190
+ "timestamp": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
193
191
  },
194
192
  "previousState": {
195
193
  "value": old_state,
196
194
  "reason": old_state_reason,
197
- "timestamp": old_state_timestamp,
195
+ "timestamp": _to_iso_8601_datetime_with_nanoseconds(old_state_timestamp),
198
196
  },
199
197
  "configuration": {
200
198
  "description": alarm.description or "",
@@ -204,7 +202,7 @@ def create_message_response_update_state_lambda(
204
202
  ), # TODO: add test with metric_data_queries
205
203
  },
206
204
  },
207
- "time": alarm.state_updated_timestamp,
205
+ "time": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
208
206
  "region": alarm.region_name,
209
207
  "source": "aws.cloudwatch",
210
208
  }
@@ -217,10 +215,12 @@ def create_message_response_update_state_sns(alarm, old_state):
217
215
  "OldStateValue": old_state,
218
216
  "AlarmName": alarm.name,
219
217
  "AlarmDescription": alarm.description or "",
220
- "AlarmConfigurationUpdatedTimestamp": alarm.configuration_updated_timestamp,
218
+ "AlarmConfigurationUpdatedTimestamp": _to_iso_8601_datetime_with_nanoseconds(
219
+ alarm.configuration_updated_timestamp
220
+ ),
221
221
  "NewStateValue": alarm.state_value,
222
222
  "NewStateReason": alarm.state_reason,
223
- "StateChangeTime": alarm.state_updated_timestamp,
223
+ "StateChangeTime": _to_iso_8601_datetime_with_nanoseconds(alarm.state_updated_timestamp),
224
224
  # the long-name for 'region' should be used - as we don't have it, we use the short name
225
225
  # which needs to be slightly changed to make snapshot tests work
226
226
  "Region": alarm.region_name.replace("-", " ").capitalize(),
@@ -268,6 +268,11 @@ class ValidationError(CommonServiceException):
268
268
  super().__init__("ValidationError", message, 400, True)
269
269
 
270
270
 
271
+ def _to_iso_8601_datetime_with_nanoseconds(date: datetime | None) -> str | None:
272
+ if date is not None:
273
+ return date.strftime("%Y-%m-%dT%H:%M:%S.%f000Z")
274
+
275
+
271
276
  def _set_alarm_actions(context, alarm_names, enabled):
272
277
  backend = cloudwatch_backends[context.account_id][context.region]
273
278
  for name in alarm_names:
@@ -4,8 +4,6 @@ import logging
4
4
  import re
5
5
  import threading
6
6
  import uuid
7
- from datetime import timezone
8
- from typing import List
9
7
 
10
8
  from localstack.aws.api import CommonServiceException, RequestContext, handler
11
9
  from localstack.aws.api.cloudwatch import (
@@ -17,6 +15,7 @@ from localstack.aws.api.cloudwatch import (
17
15
  AlarmTypes,
18
16
  AmazonResourceName,
19
17
  CloudwatchApi,
18
+ ContributorId,
20
19
  DashboardBody,
21
20
  DashboardName,
22
21
  DashboardNamePrefix,
@@ -109,17 +108,11 @@ _STORE_LOCK = threading.RLock()
109
108
  AWS_MAX_DATAPOINTS_ACCEPTED: int = 1440
110
109
 
111
110
 
112
- class ValidationError(CommonServiceException):
113
- # TODO: check this error against AWS (doesn't exist in the API)
111
+ class ValidationException(CommonServiceException):
114
112
  def __init__(self, message: str):
115
113
  super().__init__("ValidationError", message, 400, True)
116
114
 
117
115
 
118
- class InvalidParameterCombination(CommonServiceException):
119
- def __init__(self, message: str):
120
- super().__init__("InvalidParameterCombination", message, 400, True)
121
-
122
-
123
116
  def _validate_parameters_for_put_metric_data(metric_data: MetricData) -> None:
124
117
  for index, metric_item in enumerate(metric_data):
125
118
  indexplusone = index + 1
@@ -244,10 +237,10 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
244
237
  label_options: LabelOptions = None,
245
238
  **kwargs,
246
239
  ) -> GetMetricDataOutput:
247
- results: List[MetricDataResult] = []
240
+ results: list[MetricDataResult] = []
248
241
  limit = max_datapoints or 100_800
249
242
  messages: MetricDataResultMessages = []
250
- nxt = None
243
+ nxt: str | None = None
251
244
  label_additions = []
252
245
 
253
246
  for diff in LABEL_DIFFERENTIATORS:
@@ -281,14 +274,14 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
281
274
  timestamp_value_dicts = [
282
275
  {
283
276
  "Timestamp": timestamp,
284
- "Value": value,
277
+ "Value": float(value),
285
278
  }
286
279
  for timestamp, value in zip(timestamps, values, strict=False)
287
280
  ]
288
281
 
289
282
  pagination = PaginatedList(timestamp_value_dicts)
290
283
  timestamp_page, nxt = pagination.get_page(
291
- lambda item: item.get("Timestamp"),
284
+ lambda item: str(item.get("Timestamp")),
292
285
  next_token=next_token,
293
286
  page_size=limit,
294
287
  )
@@ -316,6 +309,11 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
316
309
  state_reason_data: StateReasonData = None,
317
310
  **kwargs,
318
311
  ) -> None:
312
+ if state_value not in ("OK", "ALARM", "INSUFFICIENT_DATA"):
313
+ raise ValidationException(
314
+ f"1 validation error detected: Value '{state_value}' at 'stateValue' failed to satisfy constraint: Member must satisfy enum value set: [INSUFFICIENT_DATA, ALARM, OK]"
315
+ )
316
+
319
317
  try:
320
318
  if state_reason_data:
321
319
  state_reason_data = json.loads(state_reason_data)
@@ -334,10 +332,6 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
334
332
  raise ResourceNotFound()
335
333
 
336
334
  old_state = alarm.alarm["StateValue"]
337
- if state_value not in ("OK", "ALARM", "INSUFFICIENT_DATA"):
338
- raise ValidationError(
339
- f"1 validation error detected: Value '{state_value}' at 'stateValue' failed to satisfy constraint: Member must satisfy enum value set: [INSUFFICIENT_DATA, ALARM, OK]"
340
- )
341
335
 
342
336
  old_state_reason = alarm.alarm["StateReason"]
343
337
  old_state_update_timestamp = alarm.alarm["StateUpdatedTimestamp"]
@@ -345,7 +339,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
345
339
  if old_state == state_value:
346
340
  return
347
341
 
348
- alarm.alarm["StateTransitionedTimestamp"] = datetime.datetime.now(timezone.utc)
342
+ alarm.alarm["StateTransitionedTimestamp"] = datetime.datetime.now(datetime.UTC)
349
343
  # update startDate (=last ALARM date) - should only update when a new alarm is triggered
350
344
  # the date is only updated if we have a reason-data, which is set by an alarm
351
345
  if state_reason_data:
@@ -417,7 +411,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
417
411
  "ignore",
418
412
  "missing",
419
413
  ]:
420
- raise ValidationError(
414
+ raise ValidationException(
421
415
  f"The value {request['TreatMissingData']} is not supported for TreatMissingData parameter. Supported values are [breaching, notBreaching, ignore, missing]."
422
416
  )
423
417
  # do some sanity checks:
@@ -426,7 +420,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
426
420
  value = request.get("Period")
427
421
  if value not in (10, 30):
428
422
  if value % 60 != 0:
429
- raise ValidationError("Period must be 10, 30 or a multiple of 60")
423
+ raise ValidationException("Period must be 10, 30 or a multiple of 60")
430
424
  if request.get("Statistic"):
431
425
  if request.get("Statistic") not in [
432
426
  "SampleCount",
@@ -435,7 +429,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
435
429
  "Minimum",
436
430
  "Maximum",
437
431
  ]:
438
- raise ValidationError(
432
+ raise ValidationException(
439
433
  f"Value '{request.get('Statistic')}' at 'statistic' failed to satisfy constraint: Member must satisfy enum value set: [Maximum, SampleCount, Sum, Minimum, Average]"
440
434
  )
441
435
 
@@ -449,7 +443,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
449
443
  "evaluate",
450
444
  "ignore",
451
445
  ):
452
- raise ValidationError(
446
+ raise ValidationException(
453
447
  f"Option {evaluate_low_sample_count_percentile} is not supported. "
454
448
  "Supported options for parameter EvaluateLowSampleCountPercentile are evaluate and ignore."
455
449
  )
@@ -692,7 +686,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
692
686
  expected_datapoints = (end_time_unix - start_time_unix) / period
693
687
 
694
688
  if expected_datapoints > AWS_MAX_DATAPOINTS_ACCEPTED:
695
- raise InvalidParameterCombination(
689
+ raise InvalidParameterCombinationException(
696
690
  f"You have requested up to {int(expected_datapoints)} datapoints, which exceeds the limit of {AWS_MAX_DATAPOINTS_ACCEPTED}. "
697
691
  f"You may reduce the datapoints requested by increasing Period, or decreasing the time range."
698
692
  )
@@ -739,7 +733,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
739
733
  for i, timestamp in enumerate(timestamps):
740
734
  stat_datapoints.setdefault(selected_unit, {})
741
735
  stat_datapoints[selected_unit].setdefault(timestamp, {})
742
- stat_datapoints[selected_unit][timestamp][stat] = values[i]
736
+ stat_datapoints[selected_unit][timestamp][stat] = float(values[i])
743
737
  stat_datapoints[selected_unit][timestamp]["Unit"] = selected_unit
744
738
 
745
739
  datapoints: list[Datapoint] = []
@@ -824,14 +818,15 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
824
818
  def describe_alarm_history(
825
819
  self,
826
820
  context: RequestContext,
827
- alarm_name: AlarmName = None,
828
- alarm_types: AlarmTypes = None,
829
- history_item_type: HistoryItemType = None,
830
- start_date: Timestamp = None,
831
- end_date: Timestamp = None,
832
- max_records: MaxRecords = None,
833
- next_token: NextToken = None,
834
- scan_by: ScanBy = None,
821
+ alarm_name: AlarmName | None = None,
822
+ alarm_contributor_id: ContributorId | None = None,
823
+ alarm_types: AlarmTypes | None = None,
824
+ history_item_type: HistoryItemType | None = None,
825
+ start_date: Timestamp | None = None,
826
+ end_date: Timestamp | None = None,
827
+ max_records: MaxRecords | None = None,
828
+ next_token: NextToken | None = None,
829
+ scan_by: ScanBy | None = None,
835
830
  **kwargs,
836
831
  ) -> DescribeAlarmHistoryOutput:
837
832
  store = self.get_store(context.account_id, context.region)
@@ -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,57 +14,57 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class CloudWatchAlarmProperties(TypedDict):
17
- ComparisonOperator: Optional[str]
18
- EvaluationPeriods: Optional[int]
19
- ActionsEnabled: Optional[bool]
20
- AlarmActions: Optional[list[str]]
21
- AlarmDescription: Optional[str]
22
- AlarmName: Optional[str]
23
- Arn: Optional[str]
24
- DatapointsToAlarm: Optional[int]
25
- Dimensions: Optional[list[Dimension]]
26
- EvaluateLowSampleCountPercentile: Optional[str]
27
- ExtendedStatistic: Optional[str]
28
- Id: Optional[str]
29
- InsufficientDataActions: Optional[list[str]]
30
- MetricName: Optional[str]
31
- Metrics: Optional[list[MetricDataQuery]]
32
- Namespace: Optional[str]
33
- OKActions: Optional[list[str]]
34
- Period: Optional[int]
35
- Statistic: Optional[str]
36
- Threshold: Optional[float]
37
- ThresholdMetricId: Optional[str]
38
- TreatMissingData: Optional[str]
39
- Unit: Optional[str]
17
+ ComparisonOperator: str | None
18
+ EvaluationPeriods: int | None
19
+ ActionsEnabled: bool | None
20
+ AlarmActions: list[str] | None
21
+ AlarmDescription: str | None
22
+ AlarmName: str | None
23
+ Arn: str | None
24
+ DatapointsToAlarm: int | None
25
+ Dimensions: list[Dimension] | None
26
+ EvaluateLowSampleCountPercentile: str | None
27
+ ExtendedStatistic: str | None
28
+ Id: str | None
29
+ InsufficientDataActions: list[str] | None
30
+ MetricName: str | None
31
+ Metrics: list[MetricDataQuery] | None
32
+ Namespace: str | None
33
+ OKActions: list[str] | None
34
+ Period: int | None
35
+ Statistic: str | None
36
+ Threshold: float | None
37
+ ThresholdMetricId: str | None
38
+ TreatMissingData: str | None
39
+ Unit: str | None
40
40
 
41
41
 
42
42
  class Dimension(TypedDict):
43
- Name: Optional[str]
44
- Value: Optional[str]
43
+ Name: str | None
44
+ Value: str | None
45
45
 
46
46
 
47
47
  class Metric(TypedDict):
48
- Dimensions: Optional[list[Dimension]]
49
- MetricName: Optional[str]
50
- Namespace: Optional[str]
48
+ Dimensions: list[Dimension] | None
49
+ MetricName: str | None
50
+ Namespace: str | None
51
51
 
52
52
 
53
53
  class MetricStat(TypedDict):
54
- Metric: Optional[Metric]
55
- Period: Optional[int]
56
- Stat: Optional[str]
57
- Unit: Optional[str]
54
+ Metric: Metric | None
55
+ Period: int | None
56
+ Stat: str | None
57
+ Unit: str | None
58
58
 
59
59
 
60
60
  class MetricDataQuery(TypedDict):
61
- Id: Optional[str]
62
- AccountId: Optional[str]
63
- Expression: Optional[str]
64
- Label: Optional[str]
65
- MetricStat: Optional[MetricStat]
66
- Period: Optional[int]
67
- ReturnData: Optional[bool]
61
+ Id: str | None
62
+ AccountId: str | None
63
+ Expression: str | None
64
+ Label: str | None
65
+ MetricStat: MetricStat | None
66
+ Period: int | None
67
+ ReturnData: bool | None
68
68
 
69
69
 
70
70
  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 CloudWatchAlarmProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::CloudWatch::Alarm"
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.cloudwatch.resource_providers.aws_cloudwatch_alarm import (
@@ -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 (
@@ -15,17 +15,17 @@ from localstack.utils.strings import str_to_bool
15
15
 
16
16
 
17
17
  class CloudWatchCompositeAlarmProperties(TypedDict):
18
- AlarmRule: Optional[str]
19
- ActionsEnabled: Optional[bool]
20
- ActionsSuppressor: Optional[str]
21
- ActionsSuppressorExtensionPeriod: Optional[int]
22
- ActionsSuppressorWaitPeriod: Optional[int]
23
- AlarmActions: Optional[list[str]]
24
- AlarmDescription: Optional[str]
25
- AlarmName: Optional[str]
26
- Arn: Optional[str]
27
- InsufficientDataActions: Optional[list[str]]
28
- OKActions: Optional[list[str]]
18
+ AlarmRule: str | None
19
+ ActionsEnabled: bool | None
20
+ ActionsSuppressor: str | None
21
+ ActionsSuppressorExtensionPeriod: int | None
22
+ ActionsSuppressorWaitPeriod: int | None
23
+ AlarmActions: list[str] | None
24
+ AlarmDescription: str | None
25
+ AlarmName: str | None
26
+ Arn: str | None
27
+ InsufficientDataActions: list[str] | None
28
+ OKActions: list[str] | None
29
29
 
30
30
 
31
31
  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 CloudWatchCompositeAlarmProviderPlugin(CloudFormationResourceProviderPlugi
10
8
  name = "AWS::CloudWatch::CompositeAlarm"
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.cloudwatch.resource_providers.aws_cloudwatch_compositealarm import (