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,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 EC2VPCEndpointProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::EC2::VPCEndpoint"
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.ec2.resource_providers.aws_ec2_vpcendpoint 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 (
@@ -14,10 +14,10 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class EC2VPCGatewayAttachmentProperties(TypedDict):
17
- VpcId: Optional[str]
18
- Id: Optional[str]
19
- InternetGatewayId: Optional[str]
20
- VpnGatewayId: Optional[str]
17
+ VpcId: str | None
18
+ Id: str | None
19
+ InternetGatewayId: str | None
20
+ VpnGatewayId: str | None
21
21
 
22
22
 
23
23
  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 EC2VPCGatewayAttachmentProviderPlugin(CloudFormationResourceProviderPlugin
10
8
  name = "AWS::EC2::VPCGatewayAttachment"
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.ec2.resource_providers.aws_ec2_vpcgatewayattachment import (
@@ -3,10 +3,9 @@ from __future__ import annotations
3
3
 
4
4
  import logging
5
5
  from pathlib import Path
6
- from typing import Optional, TypedDict
6
+ from typing import TypedDict
7
7
 
8
8
  import localstack.services.cloudformation.provider_utils as util
9
- from localstack.constants import AWS_REGION_US_EAST_1, DEFAULT_AWS_ACCOUNT_ID
10
9
  from localstack.services.cloudformation.resource_provider import (
11
10
  OperationStatus,
12
11
  ProgressEvent,
@@ -22,34 +21,34 @@ default_repos_per_stack = {}
22
21
 
23
22
 
24
23
  class ECRRepositoryProperties(TypedDict):
25
- Arn: Optional[str]
26
- EncryptionConfiguration: Optional[EncryptionConfiguration]
27
- ImageScanningConfiguration: Optional[ImageScanningConfiguration]
28
- ImageTagMutability: Optional[str]
29
- LifecyclePolicy: Optional[LifecyclePolicy]
30
- RepositoryName: Optional[str]
31
- RepositoryPolicyText: Optional[dict | str]
32
- RepositoryUri: Optional[str]
33
- Tags: Optional[list[Tag]]
24
+ Arn: str | None
25
+ EncryptionConfiguration: EncryptionConfiguration | None
26
+ ImageScanningConfiguration: ImageScanningConfiguration | None
27
+ ImageTagMutability: str | None
28
+ LifecyclePolicy: LifecyclePolicy | None
29
+ RepositoryName: str | None
30
+ RepositoryPolicyText: dict | str | None
31
+ RepositoryUri: str | None
32
+ Tags: list[Tag] | None
34
33
 
35
34
 
36
35
  class LifecyclePolicy(TypedDict):
37
- LifecyclePolicyText: Optional[str]
38
- RegistryId: Optional[str]
36
+ LifecyclePolicyText: str | None
37
+ RegistryId: str | None
39
38
 
40
39
 
41
40
  class Tag(TypedDict):
42
- Key: Optional[str]
43
- Value: Optional[str]
41
+ Key: str | None
42
+ Value: str | None
44
43
 
45
44
 
46
45
  class ImageScanningConfiguration(TypedDict):
47
- ScanOnPush: Optional[bool]
46
+ ScanOnPush: bool | None
48
47
 
49
48
 
50
49
  class EncryptionConfiguration(TypedDict):
51
- EncryptionType: Optional[str]
52
- KmsKey: Optional[str]
50
+ EncryptionType: str | None
51
+ KmsKey: str | None
53
52
 
54
53
 
55
54
  REPEATED_INVOCATION = "repeated_invocation"
@@ -90,6 +89,10 @@ class ECRRepositoryProvider(ResourceProvider[ECRRepositoryProperties]):
90
89
 
91
90
  """
92
91
  model = request.desired_state
92
+ model["RepositoryName"] = (
93
+ model.get("RepositoryName")
94
+ or util.generate_default_name(request.stack_name, request.logical_resource_id).lower()
95
+ )
93
96
 
94
97
  default_repos_per_stack[request.stack_name] = model["RepositoryName"]
95
98
  LOG.warning(
@@ -98,7 +101,7 @@ class ECRRepositoryProvider(ResourceProvider[ECRRepositoryProperties]):
98
101
  model.update(
99
102
  {
100
103
  "Arn": arns.ecr_repository_arn(
101
- model["RepositoryName"], DEFAULT_AWS_ACCOUNT_ID, AWS_REGION_US_EAST_1
104
+ model["RepositoryName"], request.account_id, request.region_name
102
105
  ),
103
106
  "RepositoryUri": "http://localhost:4566",
104
107
  "ImageTagMutability": "MUTABLE",
@@ -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 ECRRepositoryProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::ECR::Repository"
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.ecr.resource_providers.aws_ecr_repository import (
@@ -3,7 +3,7 @@ import logging
3
3
  import shlex
4
4
  import subprocess
5
5
  import sys
6
- from typing import List, Optional, TypeVar
6
+ from typing import TypeVar
7
7
 
8
8
  from localstack import config, constants
9
9
  from localstack.config import HostAndPort
@@ -32,7 +32,7 @@ the actual AWS service call is made."""
32
32
 
33
33
 
34
34
  def do_start_edge(
35
- listen: HostAndPort | List[HostAndPort], use_ssl: bool, asynchronous: bool = False
35
+ listen: HostAndPort | list[HostAndPort], use_ssl: bool, asynchronous: bool = False
36
36
  ):
37
37
  from localstack.aws.serving.edge import serve_gateway
38
38
 
@@ -50,7 +50,7 @@ def can_use_sudo():
50
50
  def ensure_can_use_sudo():
51
51
  if not is_root() and not can_use_sudo():
52
52
  if not sys.stdin.isatty():
53
- raise IOError("cannot get sudo password from non-tty input")
53
+ raise OSError("cannot get sudo password from non-tty input")
54
54
  print("Please enter your sudo password (required to configure local network):")
55
55
  run("sudo -v", stdin=True)
56
56
 
@@ -72,7 +72,7 @@ def start_component(
72
72
  default_port=constants.DEFAULT_PORT_EDGE,
73
73
  ),
74
74
  )
75
- raise Exception("Unexpected component name '%s' received during start up" % component)
75
+ raise Exception(f"Unexpected component name '{component}' received during start up")
76
76
 
77
77
 
78
78
  def start_proxy(
@@ -166,7 +166,7 @@ def start_edge(listen_str: str, use_ssl: bool = True, asynchronous: bool = False
166
166
 
167
167
 
168
168
  def run_module_as_sudo(
169
- module: str, arguments: Optional[List[str]] = None, asynchronous=False, env_vars=None
169
+ module: str, arguments: list[str] | None = None, asynchronous=False, env_vars=None
170
170
  ):
171
171
  # prepare environment
172
172
  env_vars = env_vars or {}
@@ -195,7 +195,7 @@ def run_module_as_sudo(
195
195
  return result
196
196
 
197
197
 
198
- def parse_gateway_listen(listen: str, default_host: str, default_port: int) -> List[HostAndPort]:
198
+ def parse_gateway_listen(listen: str, default_host: str, default_port: int) -> list[HostAndPort]:
199
199
  addresses = []
200
200
  for address in listen.split(","):
201
201
  addresses.append(HostAndPort.parse(address, default_host, default_port))
@@ -1,9 +1,8 @@
1
1
  from contextlib import contextmanager
2
- from typing import Dict, Optional, cast
2
+ from typing import cast
3
3
 
4
4
  from botocore.exceptions import ClientError
5
5
 
6
- from localstack import constants
7
6
  from localstack.aws.api import RequestContext, handler
8
7
  from localstack.aws.api.es import (
9
8
  ARN,
@@ -68,11 +67,12 @@ from localstack.aws.api.opensearch import (
68
67
  VersionString,
69
68
  )
70
69
  from localstack.aws.connect import connect_to
70
+ from localstack.services.opensearch.packages import ELASTICSEARCH_DEFAULT_VERSION
71
71
 
72
72
 
73
73
  def _version_to_opensearch(
74
- version: Optional[ElasticsearchVersionString],
75
- ) -> Optional[VersionString]:
74
+ version: ElasticsearchVersionString | None,
75
+ ) -> VersionString | None:
76
76
  if version is not None:
77
77
  if version.startswith("OpenSearch_"):
78
78
  return version
@@ -81,8 +81,8 @@ def _version_to_opensearch(
81
81
 
82
82
 
83
83
  def _version_from_opensearch(
84
- version: Optional[VersionString],
85
- ) -> Optional[ElasticsearchVersionString]:
84
+ version: VersionString | None,
85
+ ) -> ElasticsearchVersionString | None:
86
86
  if version is not None:
87
87
  if version.startswith("Elasticsearch_"):
88
88
  return version.split("_")[1]
@@ -90,19 +90,19 @@ def _version_from_opensearch(
90
90
  return version
91
91
 
92
92
 
93
- def _instancetype_to_opensearch(instance_type: Optional[str]) -> Optional[str]:
93
+ def _instancetype_to_opensearch(instance_type: str | None) -> str | None:
94
94
  if instance_type is not None:
95
95
  return instance_type.replace("elasticsearch", "search")
96
96
 
97
97
 
98
- def _instancetype_from_opensearch(instance_type: Optional[str]) -> Optional[str]:
98
+ def _instancetype_from_opensearch(instance_type: str | None) -> str | None:
99
99
  if instance_type is not None:
100
100
  return instance_type.replace("search", "elasticsearch")
101
101
 
102
102
 
103
103
  def _clusterconfig_from_opensearch(
104
- cluster_config: Optional[ClusterConfig],
105
- ) -> Optional[ElasticsearchClusterConfig]:
104
+ cluster_config: ClusterConfig | None,
105
+ ) -> ElasticsearchClusterConfig | None:
106
106
  if cluster_config is not None:
107
107
  # Just take the whole typed dict and typecast it to our target type
108
108
  result = cast(ElasticsearchClusterConfig, cluster_config)
@@ -117,8 +117,8 @@ def _clusterconfig_from_opensearch(
117
117
 
118
118
 
119
119
  def _domainstatus_from_opensearch(
120
- domain_status: Optional[DomainStatus],
121
- ) -> Optional[ElasticsearchDomainStatus]:
120
+ domain_status: DomainStatus | None,
121
+ ) -> ElasticsearchDomainStatus | None:
122
122
  if domain_status is not None:
123
123
  # Just take the whole typed dict and typecast it to our target type
124
124
  result = cast(ElasticsearchDomainStatus, domain_status)
@@ -135,8 +135,8 @@ def _domainstatus_from_opensearch(
135
135
 
136
136
 
137
137
  def _clusterconfig_to_opensearch(
138
- elasticsearch_cluster_config: Optional[ElasticsearchClusterConfig],
139
- ) -> Optional[ClusterConfig]:
138
+ elasticsearch_cluster_config: ElasticsearchClusterConfig | None,
139
+ ) -> ClusterConfig | None:
140
140
  if elasticsearch_cluster_config is not None:
141
141
  result = cast(ClusterConfig, elasticsearch_cluster_config)
142
142
  if instance_type := result.get("InstanceType"):
@@ -149,8 +149,8 @@ def _clusterconfig_to_opensearch(
149
149
 
150
150
 
151
151
  def _domainconfig_from_opensearch(
152
- domain_config: Optional[DomainConfig],
153
- ) -> Optional[ElasticsearchDomainConfig]:
152
+ domain_config: DomainConfig | None,
153
+ ) -> ElasticsearchDomainConfig | None:
154
154
  if domain_config is not None:
155
155
  result = cast(ElasticsearchDomainConfig, domain_config)
156
156
  engine_version = domain_config.get("EngineVersion", {})
@@ -169,8 +169,8 @@ def _domainconfig_from_opensearch(
169
169
 
170
170
 
171
171
  def _compatible_version_list_from_opensearch(
172
- compatible_version_list: Optional[CompatibleVersionsList],
173
- ) -> Optional[CompatibleElasticsearchVersionsList]:
172
+ compatible_version_list: CompatibleVersionsList | None,
173
+ ) -> CompatibleElasticsearchVersionsList | None:
174
174
  if compatible_version_list is not None:
175
175
  return [
176
176
  CompatibleVersionsMap(
@@ -236,7 +236,7 @@ class EsProvider(EsApi):
236
236
  engine_version = (
237
237
  _version_to_opensearch(elasticsearch_version)
238
238
  if elasticsearch_version
239
- else constants.ELASTICSEARCH_DEFAULT_VERSION
239
+ else ELASTICSEARCH_DEFAULT_VERSION
240
240
  )
241
241
  kwargs = {
242
242
  "DomainName": domain_name,
@@ -304,7 +304,7 @@ class EsProvider(EsApi):
304
304
  region_name=context.region, aws_access_key_id=context.account_id
305
305
  ).opensearch
306
306
 
307
- payload: Dict
307
+ payload: dict
308
308
  if "ElasticsearchClusterConfig" in payload:
309
309
  payload["ClusterConfig"] = payload["ElasticsearchClusterConfig"]
310
310
  payload["ClusterConfig"]["InstanceType"] = _instancetype_to_opensearch(
@@ -347,7 +347,7 @@ class EsProvider(EsApi):
347
347
  with exception_mapper():
348
348
  domain_names = opensearch_client.list_domain_names(**kwargs)["DomainNames"]
349
349
 
350
- return ListDomainNamesResponse(DomainNames=cast(Optional[DomainInfoList], domain_names))
350
+ return ListDomainNamesResponse(DomainNames=cast(DomainInfoList | None, domain_names))
351
351
 
352
352
  def list_elasticsearch_versions(
353
353
  self,
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  import logging
3
- from datetime import datetime, timezone
3
+ from datetime import UTC, datetime
4
4
  from typing import Self
5
5
 
6
6
  from botocore.client import BaseClient
@@ -95,7 +95,7 @@ class ArchiveService:
95
95
  self.archive.state = state
96
96
 
97
97
  def set_creation_time(self) -> None:
98
- self.archive.creation_time = datetime.now(timezone.utc)
98
+ self.archive.creation_time = datetime.now(UTC)
99
99
 
100
100
  def update(
101
101
  self,
@@ -2,7 +2,7 @@ import json
2
2
  import logging
3
3
  import re
4
4
  import uuid
5
- from datetime import datetime, timezone
5
+ from datetime import UTC, datetime
6
6
 
7
7
  from localstack.aws.api.events import (
8
8
  Arn,
@@ -138,7 +138,7 @@ class ConnectionService:
138
138
  auth_parameters,
139
139
  )
140
140
  self.connection.secret_arn = secret_arn
141
- self.connection.last_authorized_time = datetime.now(timezone.utc)
141
+ self.connection.last_authorized_time = datetime.now(UTC)
142
142
 
143
143
  # Set new values
144
144
  self.connection.authorization_type = auth_type
@@ -149,7 +149,7 @@ class ConnectionService:
149
149
  )
150
150
  self.connection.auth_parameters = public_auth_parameters
151
151
  self.set_state(ConnectionState.AUTHORIZED)
152
- self.connection.last_modified_time = datetime.now(timezone.utc)
152
+ self.connection.last_modified_time = datetime.now(UTC)
153
153
 
154
154
  except Exception as error:
155
155
  LOG.warning(
@@ -162,7 +162,7 @@ class ConnectionService:
162
162
  self.set_state(ConnectionState.DELETING)
163
163
  self.delete_connection_secret(self.connection.secret_arn)
164
164
  self.set_state(ConnectionState.DELETING) # required for AWS parity
165
- self.connection.last_modified_time = datetime.now(timezone.utc)
165
+ self.connection.last_modified_time = datetime.now(UTC)
166
166
 
167
167
  def create_connection_secret(
168
168
  self,
@@ -204,7 +204,7 @@ class ConnectionService:
204
204
  try:
205
205
  secretsmanager_client.update_secret(SecretId=secret_arn, SecretString=secret_value)
206
206
  self.set_state(ConnectionState.AUTHORIZED)
207
- self.connection.last_authorized_time = datetime.now(timezone.utc)
207
+ self.connection.last_authorized_time = datetime.now(UTC)
208
208
  except Exception as error:
209
209
  LOG.warning("Secret with id %s updating failed with errors: %s.", secret_arn, error)
210
210
 
@@ -1,6 +1,6 @@
1
1
  import json
2
- from datetime import datetime, timezone
3
- from typing import Optional, Self
2
+ from datetime import UTC, datetime
3
+ from typing import Self
4
4
 
5
5
  from localstack.aws.api.events import (
6
6
  Action,
@@ -34,11 +34,11 @@ class EventBusService:
34
34
  name: EventBusName,
35
35
  region: str,
36
36
  account_id: str,
37
- event_source_name: Optional[str] = None,
38
- description: Optional[str] = None,
39
- tags: Optional[TagList] = None,
40
- policy: Optional[str] = None,
41
- rules: Optional[RuleDict] = None,
37
+ event_source_name: str | None = None,
38
+ description: str | None = None,
39
+ tags: TagList | None = None,
40
+ policy: str | None = None,
41
+ rules: RuleDict | None = None,
42
42
  ) -> Self:
43
43
  return cls(
44
44
  EventBus(
@@ -68,7 +68,7 @@ class EventBusService:
68
68
  # TODO: cover via test
69
69
  # if policy and any([action, principal, statement_id, condition]):
70
70
  # raise ValueError("Combination of policy with other arguments is not allowed")
71
- self.event_bus.last_modified_time = datetime.now(timezone.utc)
71
+ self.event_bus.last_modified_time = datetime.now(UTC)
72
72
  if policy: # policy document replaces all existing permissions
73
73
  policy = json.loads(policy)
74
74
  parsed_policy = ResourcePolicy(**policy)
@@ -102,7 +102,7 @@ class EventBusService:
102
102
  for statement in policy["Statement"]
103
103
  if statement.get("Sid") != statement_id
104
104
  ]
105
- self.event_bus.last_modified_time = datetime.now(timezone.utc)
105
+ self.event_bus.last_modified_time = datetime.now(UTC)
106
106
 
107
107
  def _parse_statement(
108
108
  self,
@@ -59,14 +59,21 @@ class EventRuleEngine:
59
59
  for flat_pattern in flat_pattern_conditions
60
60
  )
61
61
 
62
- def _evaluate_condition(self, value, condition, field_exists: bool):
62
+ def _evaluate_condition(self, value: t.Any, condition: t.Any, field_exists: bool) -> bool:
63
63
  if not isinstance(condition, dict):
64
64
  return field_exists and value == condition
65
+
65
66
  elif (must_exist := condition.get("exists")) is not None:
66
67
  # if must_exists is True then field_exists must be True
67
68
  # if must_exists is False then fields_exists must be False
68
69
  return must_exist == field_exists
70
+
69
71
  elif (anything_but := condition.get("anything-but")) is not None:
72
+ if not field_exists:
73
+ # anything-but can handle None `value`, but it needs to differentiate between user-set `null` and
74
+ # missing value
75
+ return False
76
+
70
77
  if isinstance(anything_but, dict):
71
78
  if (not_condition := anything_but.get("prefix")) is not None:
72
79
  predicate = self._evaluate_prefix
@@ -95,6 +102,7 @@ class EventRuleEngine:
95
102
  elif value is None:
96
103
  # the remaining conditions require the value to not be None
97
104
  return False
105
+
98
106
  elif (prefix := condition.get("prefix")) is not None:
99
107
  if isinstance(prefix, dict):
100
108
  if (prefix_equal_ignore_case := prefix.get("equals-ignore-case")) is not None:
@@ -104,7 +112,7 @@ class EventRuleEngine:
104
112
 
105
113
  elif (suffix := condition.get("suffix")) is not None:
106
114
  if isinstance(suffix, dict):
107
- if suffix_equal_ignore_case := suffix.get("equals-ignore-case"):
115
+ if (suffix_equal_ignore_case := suffix.get("equals-ignore-case")) is not None:
108
116
  return self._evaluate_suffix(suffix_equal_ignore_case.lower(), value.lower())
109
117
  else:
110
118
  return self._evaluate_suffix(suffix, value)
@@ -126,19 +134,19 @@ class EventRuleEngine:
126
134
  return False
127
135
 
128
136
  @staticmethod
129
- def _evaluate_prefix(condition: str | list, value: str) -> bool:
130
- return value.startswith(condition)
137
+ def _evaluate_prefix(condition: str | list, value: t.Any) -> bool:
138
+ return isinstance(value, str) and value.startswith(condition)
131
139
 
132
140
  @staticmethod
133
- def _evaluate_suffix(condition: str | list, value: str) -> bool:
134
- return value.endswith(condition)
141
+ def _evaluate_suffix(condition: str | list, value: t.Any) -> bool:
142
+ return isinstance(value, str) and value.endswith(condition)
135
143
 
136
144
  @staticmethod
137
- def _evaluate_equal_ignore_case(condition: str, value: str) -> bool:
138
- return condition.lower() == value.lower()
145
+ def _evaluate_equal_ignore_case(condition: str, value: t.Any) -> bool:
146
+ return isinstance(value, str) and condition.lower() == value.lower()
139
147
 
140
148
  @staticmethod
141
- def _evaluate_cidr(condition: str, value: str) -> bool:
149
+ def _evaluate_cidr(condition: str, value: t.Any) -> bool:
142
150
  try:
143
151
  ip = ipaddress.ip_address(value)
144
152
  return ip in ipaddress.ip_network(condition)
@@ -146,8 +154,10 @@ class EventRuleEngine:
146
154
  return False
147
155
 
148
156
  @staticmethod
149
- def _evaluate_wildcard(condition: str, value: str) -> bool:
150
- return bool(re.match(re.escape(condition).replace("\\*", ".+") + "$", value))
157
+ def _evaluate_wildcard(condition: str, value: t.Any) -> bool:
158
+ return isinstance(value, str) and bool(
159
+ re.match(re.escape(condition).replace("\\*", ".+") + "$", value)
160
+ )
151
161
 
152
162
  @staticmethod
153
163
  def _evaluate_numeric_condition(conditions: list, value: t.Any) -> bool:
@@ -457,10 +467,18 @@ class EventPatternCompiler:
457
467
  return
458
468
 
459
469
  elif operator == "anything-but":
460
- # anything-but can actually contain any kind of simple rule (str, number, and list)
470
+ # anything-but can actually contain any kind of simple rule (str, number, and list) except Null
471
+ if value is None:
472
+ raise InvalidEventPatternException(
473
+ f"{self.error_prefix}Value of anything-but must be an array or single string/number value."
474
+ )
461
475
  if isinstance(value, list):
462
476
  for v in value:
463
- self._validate_rule(v)
477
+ if v is None:
478
+ raise InvalidEventPatternException(
479
+ f"{self.error_prefix}Inside anything but list, start|null|boolean is not supported."
480
+ )
481
+ self._validate_rule(v, from_="anything-but")
464
482
 
465
483
  return
466
484
 
@@ -1,10 +1,10 @@
1
1
  import uuid
2
2
  from dataclasses import dataclass, field
3
- from datetime import datetime, timezone
3
+ from datetime import UTC, datetime
4
4
  from enum import Enum
5
- from typing import Literal, Optional, TypeAlias, TypedDict
5
+ from typing import Literal, TypeAlias, TypedDict
6
6
 
7
- from localstack.aws.api.core import ServiceException
7
+ from localstack.aws.api import CommonServiceException
8
8
  from localstack.aws.api.events import (
9
9
  ApiDestinationDescription,
10
10
  ApiDestinationHttpMethod,
@@ -66,10 +66,9 @@ from localstack.utils.tagging import TaggingService
66
66
  TargetDict = dict[TargetId, Target]
67
67
 
68
68
 
69
- class ValidationException(ServiceException):
70
- code: str = "ValidationException"
71
- sender_fault: bool = True
72
- status_code: int = 400
69
+ class ValidationException(CommonServiceException):
70
+ def __init__(self, message: str):
71
+ super().__init__("ValidationException", message, 400, True)
73
72
 
74
73
 
75
74
  class InvalidEventPatternException(Exception):
@@ -85,14 +84,14 @@ FormattedEvent = TypedDict( # functional syntax required due to name-name keys
85
84
  {
86
85
  "version": str,
87
86
  "id": str,
88
- "detail-type": Optional[str],
89
- "source": Optional[EventSourceName],
87
+ "detail-type": str | None,
88
+ "source": EventSourceName | None,
90
89
  "account": str,
91
90
  "time": EventTime,
92
91
  "region": str,
93
- "resources": Optional[EventResourceList],
92
+ "resources": EventResourceList | None,
94
93
  "detail": dict[str, str | dict],
95
- "replay-name": Optional[ReplayName],
94
+ "replay-name": ReplayName | None,
96
95
  "event-bus-name": EventBusName,
97
96
  },
98
97
  )
@@ -134,15 +133,15 @@ class Rule:
134
133
  name: RuleName
135
134
  region: str
136
135
  account_id: str
137
- schedule_expression: Optional[ScheduleExpression] = None
138
- event_pattern: Optional[EventPattern] = None
139
- state: Optional[RuleState] = None
140
- description: Optional[RuleDescription] = None
141
- role_arn: Optional[RoleArn] = None
136
+ schedule_expression: ScheduleExpression | None = None
137
+ event_pattern: EventPattern | None = None
138
+ state: RuleState | None = None
139
+ description: RuleDescription | None = None
140
+ role_arn: RoleArn | None = None
142
141
  tags: TagList = field(default_factory=list)
143
142
  event_bus_name: EventBusName = "default"
144
143
  targets: TargetDict = field(default_factory=dict)
145
- managed_by: Optional[ManagedBy] = None # can only be set by AWS services
144
+ managed_by: ManagedBy | None = None # can only be set by AWS services
146
145
  created_by: CreatedBy = field(init=False)
147
146
 
148
147
  def __post_init__(self):
@@ -171,12 +170,12 @@ class Replay:
171
170
  destination: ReplayDestination # Event Bus Arn or Rule Arns
172
171
  event_start_time: Timestamp
173
172
  event_end_time: Timestamp
174
- description: Optional[ReplayDescription] = None
175
- state: Optional[ReplayState] = None
176
- state_reason: Optional[ReplayStateReason] = None
177
- event_last_replayed_time: Optional[Timestamp] = None
178
- replay_start_time: Optional[Timestamp] = None
179
- replay_end_time: Optional[Timestamp] = None
173
+ description: ReplayDescription | None = None
174
+ state: ReplayState | None = None
175
+ state_reason: ReplayStateReason | None = None
176
+ event_last_replayed_time: Timestamp | None = None
177
+ replay_start_time: Timestamp | None = None
178
+ replay_end_time: Timestamp | None = None
180
179
 
181
180
  @property
182
181
  def arn(self) -> Arn:
@@ -217,17 +216,17 @@ class EventBus:
217
216
  name: EventBusName
218
217
  region: str
219
218
  account_id: str
220
- event_source_name: Optional[str] = None
221
- description: Optional[str] = None
219
+ event_source_name: str | None = None
220
+ description: str | None = None
222
221
  tags: TagList = field(default_factory=list)
223
- policy: Optional[ResourcePolicy] = None
222
+ policy: ResourcePolicy | None = None
224
223
  rules: RuleDict = field(default_factory=dict)
225
224
  creation_time: Timestamp = field(init=False)
226
225
  last_modified_time: Timestamp = field(init=False)
227
226
 
228
227
  def __post_init__(self):
229
- self.creation_time = datetime.now(timezone.utc)
230
- self.last_modified_time = datetime.now(timezone.utc)
228
+ self.creation_time = datetime.now(UTC)
229
+ self.last_modified_time = datetime.now(UTC)
231
230
  if self.rules is None:
232
231
  self.rules = {}
233
232
  if self.tags is None:
@@ -259,7 +258,7 @@ class Connection:
259
258
  id: str = str(uuid.uuid4())
260
259
 
261
260
  def __post_init__(self):
262
- timestamp_now = datetime.now(timezone.utc)
261
+ timestamp_now = datetime.now(UTC)
263
262
  self.creation_time = timestamp_now
264
263
  self.last_modified_time = timestamp_now
265
264
  self.last_authorized_time = timestamp_now
@@ -292,7 +291,7 @@ class ApiDestination:
292
291
  id: str = str(short_uid())
293
292
 
294
293
  def __post_init__(self):
295
- timestamp_now = datetime.now(timezone.utc)
294
+ timestamp_now = datetime.now(UTC)
296
295
  self.creation_time = timestamp_now
297
296
  self.last_modified_time = timestamp_now
298
297
  self.last_authorized_time = timestamp_now