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,8 +1,9 @@
1
1
  import queue
2
2
  import threading
3
3
  import time
4
+ from collections.abc import Callable, Mapping
4
5
  from concurrent.futures import Executor
5
- from typing import Any, Callable, List, Mapping, Optional, Tuple, Union
6
+ from typing import Any
6
7
 
7
8
 
8
9
  class ScheduledTask:
@@ -13,12 +14,12 @@ class ScheduledTask:
13
14
  def __init__(
14
15
  self,
15
16
  task: Callable,
16
- period: Optional[float] = None,
17
+ period: float | None = None,
17
18
  fixed_rate: bool = True,
18
- start: Optional[float] = None,
19
+ start: float | None = None,
19
20
  on_error: Callable[[Exception], None] = None,
20
- args: Optional[Union[tuple, list]] = None,
21
- kwargs: Optional[Mapping[str, Any]] = None,
21
+ args: tuple | list | None = None,
22
+ kwargs: Mapping[str, Any] | None = None,
22
23
  ) -> None:
23
24
  super().__init__()
24
25
  self.task = task
@@ -26,8 +27,8 @@ class ScheduledTask:
26
27
  self.period = period
27
28
  self.start = start
28
29
  self.on_error = on_error
29
- self.args = args or tuple()
30
- self.kwargs = kwargs or dict()
30
+ self.args = args or ()
31
+ self.kwargs = kwargs or {}
31
32
 
32
33
  self.deadline = None
33
34
  self.error = None
@@ -75,7 +76,7 @@ class Scheduler:
75
76
 
76
77
  POISON = (-1, "__POISON__")
77
78
 
78
- def __init__(self, executor: Optional[Executor] = None) -> None:
79
+ def __init__(self, executor: Executor | None = None) -> None:
79
80
  """
80
81
  Creates a new Scheduler. If an executor is passed, then that executor will be used to run the scheduled tasks
81
82
  asynchronously, otherwise they will be executed synchronously inside the event loop. Running tasks
@@ -93,12 +94,12 @@ class Scheduler:
93
94
  def schedule(
94
95
  self,
95
96
  func: Callable,
96
- period: Optional[float] = None,
97
+ period: float | None = None,
97
98
  fixed_rate: bool = True,
98
- start: Optional[float] = None,
99
+ start: float | None = None,
99
100
  on_error: Callable[[Exception], None] = None,
100
- args: Optional[Union[Tuple, List[Any]]] = None,
101
- kwargs: Optional[Mapping[str, Any]] = None,
101
+ args: tuple | list[Any] | None = None,
102
+ kwargs: Mapping[str, Any] | None = None,
102
103
  ) -> ScheduledTask:
103
104
  """
104
105
  Schedules a given task (function call).
@@ -1,8 +1,8 @@
1
1
  import logging
2
2
  import select
3
3
  import socket
4
+ from collections.abc import Callable
4
5
  from concurrent.futures import ThreadPoolExecutor
5
- from typing import Callable
6
6
 
7
7
  from localstack.utils.serving import Server
8
8
 
@@ -93,7 +93,7 @@ class TCPProxy(Server):
93
93
  try:
94
94
  src_socket, _ = self._server_socket.accept()
95
95
  self._thread_pool.submit(self._handle_request, src_socket)
96
- except socket.timeout:
96
+ except TimeoutError:
97
97
  pass
98
98
  except OSError as e:
99
99
  # avoid creating an error message if OSError is thrown due to socket closing
@@ -1,7 +1,6 @@
1
1
  import abc
2
2
  import logging
3
3
  import threading
4
- from typing import Optional
5
4
 
6
5
  from localstack.utils.net import is_port_open
7
6
  from localstack.utils.sync import poll_condition
@@ -21,7 +20,7 @@ class Server(abc.ABC):
21
20
 
22
21
  def __init__(self, port: int, host: str = "localhost") -> None:
23
22
  super().__init__()
24
- self._thread: Optional[FuncThread] = None
23
+ self._thread: FuncThread | None = None
25
24
 
26
25
  self._lifecycle_lock = threading.RLock()
27
26
  self._stopped = threading.Event()
@@ -44,9 +43,9 @@ class Server(abc.ABC):
44
43
 
45
44
  @property
46
45
  def url(self):
47
- return "%s://%s:%s" % (self.protocol, self.host, self.port)
46
+ return f"{self.protocol}://{self.host}:{self.port}"
48
47
 
49
- def get_error(self) -> Optional[Exception]:
48
+ def get_error(self) -> Exception | None:
50
49
  """
51
50
  If the thread running the server returned with an Exception, then this function will return that exception.
52
51
  """
@@ -7,7 +7,6 @@ import re
7
7
  import string
8
8
  import uuid
9
9
  import zlib
10
- from typing import Dict, List, Union
11
10
 
12
11
  from localstack.config import DEFAULT_ENCODING
13
12
 
@@ -28,13 +27,13 @@ REGEX_UNPRINTABLE_CHARS = re.compile(
28
27
  )
29
28
 
30
29
 
31
- def to_str(obj: Union[str, bytes], encoding: str = DEFAULT_ENCODING, errors="strict") -> str:
30
+ def to_str(obj: str | bytes, encoding: str = DEFAULT_ENCODING, errors="strict") -> str:
32
31
  """If ``obj`` is an instance of ``binary_type``, return
33
32
  ``obj.decode(encoding, errors)``, otherwise return ``obj``"""
34
33
  return obj.decode(encoding, errors) if isinstance(obj, bytes) else obj
35
34
 
36
35
 
37
- def to_bytes(obj: Union[str, bytes], encoding: str = DEFAULT_ENCODING, errors="strict") -> bytes:
36
+ def to_bytes(obj: str | bytes, encoding: str = DEFAULT_ENCODING, errors="strict") -> bytes:
38
37
  """If ``obj`` is an instance of ``text_type``, return
39
38
  ``obj.encode(encoding, errors)``, otherwise return ``obj``"""
40
39
  return obj.encode(encoding, errors) if isinstance(obj, str) else obj
@@ -42,7 +41,7 @@ def to_bytes(obj: Union[str, bytes], encoding: str = DEFAULT_ENCODING, errors="s
42
41
 
43
42
  def truncate(data: str, max_length: int = 100) -> str:
44
43
  data = str(data or "")
45
- return ("%s..." % data[:max_length]) if len(data) > max_length else data
44
+ return (f"{data[:max_length]}...") if len(data) > max_length else data
46
45
 
47
46
 
48
47
  def is_string(s, include_unicode=True, exclude_binary=False):
@@ -86,7 +85,7 @@ def canonicalize_bool_to_str(val: bool) -> str:
86
85
  return "true" if str(val).lower() == "true" else "false"
87
86
 
88
87
 
89
- def convert_to_printable_chars(value: Union[List, Dict, str]) -> str:
88
+ def convert_to_printable_chars(value: list | dict | str) -> str:
90
89
  """Removes all unprintable characters from the given string."""
91
90
  from localstack.utils.objects import recurse_object
92
91
 
@@ -104,11 +103,11 @@ def convert_to_printable_chars(value: Union[List, Dict, str]) -> str:
104
103
 
105
104
 
106
105
  def first_char_to_lower(s: str) -> str:
107
- return s and "%s%s" % (s[0].lower(), s[1:])
106
+ return s and f"{s[0].lower()}{s[1:]}"
108
107
 
109
108
 
110
109
  def first_char_to_upper(s: str) -> str:
111
- return s and "%s%s" % (s[0].upper(), s[1:])
110
+ return s and f"{s[0].upper()}{s[1:]}"
112
111
 
113
112
 
114
113
  def str_to_bool(value):
@@ -121,13 +120,13 @@ def str_to_bool(value):
121
120
 
122
121
  def str_insert(string, index, content):
123
122
  """Insert a substring into an existing string at a certain index."""
124
- return "%s%s%s" % (string[:index], content, string[index:])
123
+ return f"{string[:index]}{content}{string[index:]}"
125
124
 
126
125
 
127
126
  def str_remove(string, index, end_index=None):
128
127
  """Remove a substring from an existing string at a certain from-to index range."""
129
128
  end_index = end_index or (index + 1)
130
- return "%s%s" % (string[:index], string[end_index:])
129
+ return f"{string[:index]}{string[end_index:]}"
131
130
 
132
131
 
133
132
  def str_startswith_ignore_case(value: str, prefix: str) -> bool:
@@ -148,19 +147,19 @@ def long_uid() -> str:
148
147
  return str(uuid.uuid4())
149
148
 
150
149
 
151
- def md5(string: Union[str, bytes]) -> str:
150
+ def md5(string: str | bytes) -> str:
152
151
  m = hashlib.md5()
153
152
  m.update(to_bytes(string))
154
153
  return m.hexdigest()
155
154
 
156
155
 
157
- def checksum_crc32(string: Union[str, bytes]) -> str:
156
+ def checksum_crc32(string: str | bytes) -> str:
158
157
  bytes = to_bytes(string)
159
158
  checksum = zlib.crc32(bytes)
160
159
  return base64.b64encode(checksum.to_bytes(4, "big")).decode()
161
160
 
162
161
 
163
- def checksum_crc32c(string: Union[str, bytes]):
162
+ def checksum_crc32c(string: str | bytes):
164
163
  # import botocore locally here to avoid a dependency of the CLI to botocore
165
164
  from botocore.httpchecksum import CrtCrc32cChecksum
166
165
 
@@ -169,7 +168,7 @@ def checksum_crc32c(string: Union[str, bytes]):
169
168
  return base64.b64encode(checksum.digest()).decode()
170
169
 
171
170
 
172
- def checksum_crc64nvme(string: Union[str, bytes]):
171
+ def checksum_crc64nvme(string: str | bytes):
173
172
  # import botocore locally here to avoid a dependency of the CLI to botocore
174
173
  from botocore.httpchecksum import CrtCrc64NvmeChecksum
175
174
 
@@ -178,12 +177,12 @@ def checksum_crc64nvme(string: Union[str, bytes]):
178
177
  return base64.b64encode(checksum.digest()).decode()
179
178
 
180
179
 
181
- def hash_sha1(string: Union[str, bytes]) -> str:
180
+ def hash_sha1(string: str | bytes) -> str:
182
181
  digest = hashlib.sha1(to_bytes(string)).digest()
183
182
  return base64.b64encode(digest).decode()
184
183
 
185
184
 
186
- def hash_sha256(string: Union[str, bytes]) -> str:
185
+ def hash_sha256(string: str | bytes) -> str:
187
186
  digest = hashlib.sha256(to_bytes(string)).digest()
188
187
  return base64.b64encode(digest).decode()
189
188
 
@@ -192,7 +191,7 @@ def base64_to_hex(b64_string: str) -> bytes:
192
191
  return binascii.hexlify(base64.b64decode(b64_string))
193
192
 
194
193
 
195
- def base64_decode(data: Union[str, bytes]) -> bytes:
194
+ def base64_decode(data: str | bytes) -> bytes:
196
195
  """Decode base64 data - with optional padding, and able to handle urlsafe encoding (containing -/_)."""
197
196
  data = to_str(data)
198
197
  missing_padding = len(data) % 4
localstack/utils/sync.py CHANGED
@@ -4,7 +4,8 @@ import functools
4
4
  import threading
5
5
  import time
6
6
  from collections import defaultdict
7
- from typing import Callable, Literal, TypeVar
7
+ from collections.abc import Callable
8
+ from typing import Literal, TypeVar
8
9
 
9
10
 
10
11
  class ShortCircuitWaitException(Exception):
@@ -140,3 +141,127 @@ class SynchronizedDefaultDict(defaultdict):
140
141
  def __str__(self):
141
142
  with self._lock:
142
143
  return super().__str__()
144
+
145
+
146
+ class Once:
147
+ """
148
+ An object that will perform an action exactly once.
149
+ Inspired by Golang's [sync.Once](https://pkg.go.dev/sync#Once) operation.
150
+
151
+
152
+ ### Example 1
153
+
154
+ Multiple threads using `Once::do` to ensure only 1 line is printed.
155
+
156
+ ```python
157
+ import threading
158
+ import time
159
+ import random
160
+
161
+ greet_once = Once()
162
+ def greet():
163
+ print("This should happen only once.")
164
+
165
+ greet_threads = []
166
+ for _ in range(10):
167
+ t = threading.Thread(target=lambda: greet_once.do(greet))
168
+ greet_threads.append(t)
169
+ t.start()
170
+
171
+ for t in greet_threads:
172
+ t.join()
173
+ ```
174
+
175
+
176
+ ### Example 2
177
+
178
+ Ensuring idemponent calling to prevent exceptions on multiple calls.
179
+
180
+ ```python
181
+ import os
182
+
183
+ class Service:
184
+ close_once: sync.Once
185
+
186
+ def start(self):
187
+ with open("my-service.txt) as f:
188
+ myfile.write("Started service")
189
+
190
+ def close(self):
191
+ # Ensure we only ever delete the file once on close
192
+ self.close_once.do(lambda: os.remove("my-service.txt"))
193
+
194
+ ```
195
+
196
+
197
+ """
198
+
199
+ _is_done: bool = False
200
+ _mu: threading.Lock = threading.Lock()
201
+
202
+ def do(self, fn: Callable[[], None]):
203
+ """
204
+ `do` calls the function `fn()` if-and-only-if `do` has never been called before.
205
+
206
+ This ensures idempotent and thread-safe execution.
207
+
208
+ If the function raises an exception, `do` considers `fn` as done, where subsequent calls are still no-ops.
209
+ """
210
+ if self._is_done:
211
+ return
212
+
213
+ with self._mu:
214
+ if not self._is_done:
215
+ try:
216
+ fn()
217
+ finally:
218
+ self._is_done = True
219
+
220
+
221
+ def once_func(fn: Callable[..., T]) -> Callable[..., T | None]:
222
+ """
223
+ Wraps and returns a function that can only ever execute once.
224
+
225
+ The first call to the returned function will permanently set the result.
226
+ If the wrapped function raises an exception, this will be re-raised on each subsequent call.
227
+
228
+ This function can be used either as a decorator or called directly.
229
+
230
+ Direct usage:
231
+ ```python
232
+ delete_file = once_func(os.remove)
233
+
234
+ delete_file("myfile.txt") # deletes the file
235
+ delete_file("myfile.txt") # does nothing
236
+ ```
237
+
238
+ As a decorator:
239
+ ```python
240
+ @once_func
241
+ def delete_file():
242
+ os.remove("myfile.txt")
243
+
244
+ delete_file() # deletes the file
245
+ delete_file() # does nothing
246
+ ```
247
+ """
248
+ once = Once()
249
+
250
+ result, exception = None, None
251
+
252
+ def _do(*args, **kwargs):
253
+ nonlocal result, exception
254
+ try:
255
+ result = fn(*args, **kwargs)
256
+ except Exception as e:
257
+ exception = e
258
+ raise
259
+
260
+ @functools.wraps(fn)
261
+ def wrapper(*args, **kwargs):
262
+ once.do(lambda: _do(*args, **kwargs))
263
+ if exception is not None:
264
+ raise exception
265
+ return result
266
+
267
+ return wrapper
@@ -1,18 +1,20 @@
1
- from typing import Dict, List, Optional
1
+ class TaggingService:
2
+ key_field: str
3
+ value_field: str
2
4
 
5
+ tags: dict[str, dict[str, str]]
3
6
 
4
- class TaggingService:
5
- def __init__(self, key_field: str = None, value_field: str = None):
7
+ def __init__(self, key_field: str = "Key", value_field: str = "Value"):
6
8
  """
7
9
  :param key_field: the field name representing the tag key as used by botocore specs
8
10
  :param value_field: the field name representing the tag value as used by botocore specs
9
11
  """
10
- self.key_field = key_field or "Key"
11
- self.value_field = value_field or "Value"
12
+ self.key_field = key_field
13
+ self.value_field = value_field
12
14
 
13
15
  self.tags = {}
14
16
 
15
- def list_tags_for_resource(self, arn: str, root_name: Optional[str] = None):
17
+ def list_tags_for_resource(self, arn: str, root_name: str | None = None):
16
18
  root_name = root_name or "Tags"
17
19
 
18
20
  result = []
@@ -21,7 +23,7 @@ class TaggingService:
21
23
  result.append({self.key_field: k, self.value_field: v})
22
24
  return {root_name: result}
23
25
 
24
- def tag_resource(self, arn: str, tags: List[Dict[str, str]]):
26
+ def tag_resource(self, arn: str, tags: list[dict[str, str]]):
25
27
  if not tags:
26
28
  return
27
29
  if arn not in self.tags:
@@ -29,7 +31,7 @@ class TaggingService:
29
31
  for t in tags:
30
32
  self.tags[arn][t[self.key_field]] = t[self.value_field]
31
33
 
32
- def untag_resource(self, arn: str, tag_names: List[str]):
34
+ def untag_resource(self, arn: str, tag_names: list[str]):
33
35
  tags = self.tags.get(arn, {})
34
36
  for name in tag_names:
35
37
  tags.pop(name, None)
@@ -7,7 +7,8 @@ import re
7
7
  import shutil
8
8
  import tempfile
9
9
  import time
10
- from typing import Any, Callable, Dict, List, Optional
10
+ from collections.abc import Callable
11
+ from typing import Any
11
12
 
12
13
  from localstack.aws.api.lambda_ import Runtime
13
14
  from localstack.aws.connect import connect_externally_to, connect_to
@@ -20,7 +21,7 @@ from localstack.utils.urls import localstack_host
20
21
  try:
21
22
  from typing import Literal
22
23
  except ImportError:
23
- from typing_extensions import Literal
24
+ from typing import Literal
24
25
 
25
26
  import boto3
26
27
  import requests
@@ -71,7 +72,7 @@ def is_local_test_mode():
71
72
  def create_lambda_archive(
72
73
  script: str,
73
74
  get_content: bool = False,
74
- libs: List[str] = None,
75
+ libs: list[str] = None,
75
76
  runtime: str = None,
76
77
  file_name: str = None,
77
78
  exclude_func: Callable[[str], bool] = None,
@@ -94,7 +95,7 @@ def create_lambda_archive(
94
95
  chmod_r(script_file, 0o777)
95
96
  # copy libs
96
97
  for lib in libs:
97
- paths = [lib, "%s.py" % lib]
98
+ paths = [lib, f"{lib}.py"]
98
99
  try:
99
100
  module = importlib.import_module(lib)
100
101
  paths.append(module.__file__)
@@ -255,7 +256,7 @@ def create_lambda_function(
255
256
  "Role": role or LAMBDA_TEST_ROLE.format(account_id=TEST_AWS_ACCOUNT_ID),
256
257
  "Code": lambda_code,
257
258
  "Timeout": timeout or LAMBDA_TIMEOUT_SEC,
258
- "Environment": dict(Variables=envvars),
259
+ "Environment": {"Variables": envvars},
259
260
  "Tags": tags,
260
261
  }
261
262
  kwargs.update(additional_kwargs)
@@ -382,7 +383,7 @@ def assert_object(expected_object, all_objects):
382
383
  all_objects = [all_objects]
383
384
  found = find_object(expected_object, all_objects)
384
385
  if not found:
385
- raise Exception("Expected object not found: %s in list %s" % (expected_object, all_objects))
386
+ raise Exception(f"Expected object not found: {expected_object} in list {all_objects}")
386
387
 
387
388
 
388
389
  def find_object(expected_object, object_list):
@@ -425,7 +426,7 @@ def list_all_s3_objects(s3_client):
425
426
  return map_all_s3_objects(s3_client=s3_client).values()
426
427
 
427
428
 
428
- def delete_all_s3_objects(s3_client, buckets: str | List[str]):
429
+ def delete_all_s3_objects(s3_client, buckets: str | list[str]):
429
430
  buckets = ensure_list(buckets)
430
431
  for bucket in buckets:
431
432
  keys = all_s3_object_keys(s3_client, bucket)
@@ -444,15 +445,15 @@ def download_s3_object(s3_client, bucket, path):
444
445
  return result
445
446
 
446
447
 
447
- def all_s3_object_keys(s3_client, bucket: str) -> List[str]:
448
+ def all_s3_object_keys(s3_client, bucket: str) -> list[str]:
448
449
  response = s3_client.list_objects_v2(Bucket=bucket)
449
450
  keys = [obj["Key"] for obj in response.get("Contents", [])]
450
451
  return keys
451
452
 
452
453
 
453
454
  def map_all_s3_objects(
454
- s3_client, to_json: bool = True, buckets: str | List[str] = None
455
- ) -> Dict[str, Any]:
455
+ s3_client, to_json: bool = True, buckets: str | list[str] = None
456
+ ) -> dict[str, Any]:
456
457
  result = {}
457
458
  buckets = ensure_list(buckets)
458
459
  if not buckets:
@@ -499,7 +500,7 @@ def send_update_dynamodb_ttl_request(table_name, ttl_status):
499
500
  def send_dynamodb_request(path, action, request_body):
500
501
  headers = {
501
502
  "Host": "dynamodb.amazonaws.com",
502
- "x-amz-target": "DynamoDB_20120810.{}".format(action),
503
+ "x-amz-target": f"DynamoDB_20120810.{action}",
503
504
  "Authorization": mock_aws_request_headers(
504
505
  "dynamodb", aws_access_key_id=TEST_AWS_ACCESS_KEY_ID, region_name=TEST_AWS_REGION_NAME
505
506
  )["Authorization"],
@@ -509,7 +510,7 @@ def send_dynamodb_request(path, action, request_body):
509
510
 
510
511
 
511
512
  def get_lambda_log_group_name(function_name):
512
- return "/aws/lambda/{}".format(function_name)
513
+ return f"/aws/lambda/{function_name}"
513
514
 
514
515
 
515
516
  # TODO: make logs_client mandatory
@@ -522,8 +523,7 @@ def check_expected_lambda_log_events_length(
522
523
  events = [line for line in events if line not in ["\x1b[0m", "\\x1b[0m"]]
523
524
  if len(events) != expected_length:
524
525
  print(
525
- "Invalid # of Lambda %s log events: %s / %s: %s"
526
- % (
526
+ "Invalid # of Lambda {} log events: {} / {}: {}".format(
527
527
  function_name,
528
528
  len(events),
529
529
  expected_length,
@@ -537,7 +537,7 @@ def check_expected_lambda_log_events_length(
537
537
  return events
538
538
 
539
539
 
540
- def list_all_log_events(log_group_name: str, logs_client=None) -> List[Dict]:
540
+ def list_all_log_events(log_group_name: str, logs_client=None) -> list[dict]:
541
541
  logs = logs_client or connect_to().logs
542
542
  return list_all_resources(
543
543
  lambda kwargs: logs.filter_log_events(logGroupName=log_group_name, **kwargs),
@@ -549,7 +549,7 @@ def list_all_log_events(log_group_name: str, logs_client=None) -> List[Dict]:
549
549
  def get_lambda_log_events(
550
550
  function_name,
551
551
  delay_time=DEFAULT_GET_LOG_EVENTS_DELAY,
552
- regex_filter: Optional[str] = None,
552
+ regex_filter: str | None = None,
553
553
  log_group=None,
554
554
  logs_client=None,
555
555
  ):
@@ -597,7 +597,7 @@ def list_all_resources(
597
597
  page_function: Callable[[dict], Any],
598
598
  last_token_attr_name: str,
599
599
  list_attr_name: str,
600
- next_token_attr_name: Optional[str] = None,
600
+ next_token_attr_name: str | None = None,
601
601
  ) -> list:
602
602
  """
603
603
  List all available resources by loading all available pages using `page_function`.
@@ -3,9 +3,9 @@ import inspect
3
3
  import logging
4
4
  import threading
5
5
  import traceback
6
+ from collections.abc import Callable
6
7
  from concurrent.futures import Future
7
8
  from multiprocessing.dummy import Pool
8
- from typing import Callable, List, Optional
9
9
 
10
10
  LOG = logging.getLogger(__name__)
11
11
 
@@ -26,7 +26,7 @@ class FuncThread(threading.Thread):
26
26
  params=None,
27
27
  quiet=False,
28
28
  on_stop: Callable[["FuncThread"], None] = None,
29
- name: Optional[str] = None,
29
+ name: str | None = None,
30
30
  daemon=True,
31
31
  ):
32
32
  global counter
@@ -153,7 +153,7 @@ def cleanup_threads_and_processes(quiet=True):
153
153
  TMP_PROCESSES.clear()
154
154
 
155
155
 
156
- def parallelize(func: Callable, arr: List, size: int = None):
156
+ def parallelize(func: Callable, arr: list, size: int = None):
157
157
  if not size:
158
158
  size = len(arr)
159
159
  if size <= 0:
localstack/utils/time.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import time
2
2
  from datetime import date, datetime, timezone, tzinfo
3
- from typing import Optional
3
+ from zoneinfo import ZoneInfo
4
4
 
5
5
  TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S"
6
6
  TIMESTAMP_FORMAT_TZ = "%Y-%m-%dT%H:%M:%SZ"
@@ -42,6 +42,11 @@ def epoch_timestamp() -> float:
42
42
 
43
43
 
44
44
  def parse_timestamp(ts_str: str) -> datetime:
45
+ """
46
+ Parse the incoming date string into a timezone aware datetime object
47
+ :param ts_str:
48
+ :return:
49
+ """
45
50
  for ts_format in [
46
51
  TIMESTAMP_FORMAT,
47
52
  TIMESTAMP_FORMAT_TZ,
@@ -49,13 +54,16 @@ def parse_timestamp(ts_str: str) -> datetime:
49
54
  TIMESTAMP_READABLE_FORMAT,
50
55
  ]:
51
56
  try:
52
- return datetime.strptime(ts_str, ts_format)
57
+ value = datetime.strptime(ts_str, ts_format)
58
+ if value.tzinfo is None:
59
+ value = value.replace(tzinfo=ZoneInfo("UTC"))
60
+ return value
53
61
  except ValueError:
54
62
  pass
55
- raise Exception("Unable to parse timestamp string with any known formats: %s" % ts_str)
63
+ raise Exception(f"Unable to parse timestamp string with any known formats: {ts_str}")
56
64
 
57
65
 
58
- def now(millis: bool = False, tz: Optional[tzinfo] = None) -> int:
66
+ def now(millis: bool = False, tz: tzinfo | None = None) -> int:
59
67
  return mktime(datetime.now(tz=tz), millis=millis)
60
68
 
61
69
 
localstack/utils/urls.py CHANGED
@@ -1,5 +1,3 @@
1
- from typing import Optional
2
-
3
1
  from localstack import config
4
2
  from localstack.config import HostAndPort
5
3
 
@@ -12,7 +10,7 @@ def hostname_from_url(url: str) -> str:
12
10
  return url.split("://")[-1].split("/")[0].split(":")[0]
13
11
 
14
12
 
15
- def localstack_host(custom_port: Optional[int] = None) -> HostAndPort:
13
+ def localstack_host(custom_port: int | None = None) -> HostAndPort:
16
14
  """
17
15
  Determine the host and port to return to the user based on:
18
16
  - the user's configuration (e.g environment variable overrides)
localstack/utils/xml.py CHANGED
@@ -9,7 +9,7 @@ def obj_to_xml(obj: Any) -> str:
9
9
  if isinstance(obj, list):
10
10
  return "".join([obj_to_xml(o) for o in obj])
11
11
  if isinstance(obj, dict):
12
- return "".join(["<{k}>{v}</{k}>".format(k=k, v=obj_to_xml(v)) for (k, v) in obj.items()])
12
+ return "".join([f"<{k}>{obj_to_xml(v)}</{k}>" for (k, v) in obj.items()])
13
13
  return str(obj)
14
14
 
15
15
 
@@ -29,7 +29,7 @@ class TraceId:
29
29
  """
30
30
  Convert TraceId object to a string.
31
31
  """
32
- return "%s%s%s%s%s" % (
32
+ return "{}{}{}{}{}".format(
33
33
  TraceId.VERSION,
34
34
  TraceId.DELIMITER,
35
35
  format(self.start_time, "x"),