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
@@ -6,9 +6,10 @@ import queue
6
6
  import re
7
7
  import socket
8
8
  import threading
9
- from functools import lru_cache
9
+ from collections.abc import Callable
10
+ from functools import cache
10
11
  from time import sleep
11
- from typing import Callable, Dict, List, Optional, Tuple, Union, cast
12
+ from typing import cast
12
13
  from urllib.parse import quote
13
14
 
14
15
  import docker
@@ -56,7 +57,7 @@ class SdkDockerClient(ContainerClient):
56
57
  is doing some of the heavy lifting for us to support both target platforms.
57
58
  """
58
59
 
59
- docker_client: Optional[DockerClient]
60
+ docker_client: DockerClient | None
60
61
 
61
62
  def __init__(self):
62
63
  try:
@@ -264,21 +265,23 @@ class SdkDockerClient(ContainerClient):
264
265
  except APIError as e:
265
266
  raise ContainerException() from e
266
267
 
267
- def remove_container(self, container_name: str, force=True, check_existence=False) -> None:
268
- LOG.debug("Removing container: %s", container_name)
269
- if check_existence and container_name not in self.get_running_container_names():
268
+ def remove_container(
269
+ self, container_name: str, force=True, check_existence=False, volumes=False
270
+ ) -> None:
271
+ LOG.debug("Removing container: %s, with volumes: %s", container_name, volumes)
272
+ if check_existence and container_name not in self.get_all_container_names():
270
273
  LOG.debug("Aborting removing due to check_existence check")
271
274
  return
272
275
  try:
273
276
  container = self.client().containers.get(container_name)
274
- container.remove(force=force)
277
+ container.remove(force=force, v=volumes)
275
278
  except NotFound:
276
279
  if not force:
277
280
  raise NoSuchContainer(container_name)
278
281
  except APIError as e:
279
282
  raise ContainerException() from e
280
283
 
281
- def list_containers(self, filter: Union[List[str], str, None] = None, all=True) -> List[dict]:
284
+ def list_containers(self, filter: list[str] | str | None = None, all=True) -> list[dict]:
282
285
  if filter:
283
286
  filter = [filter] if isinstance(filter, str) else filter
284
287
  filter = dict([f.split("=", 1) for f in filter])
@@ -337,14 +340,14 @@ class SdkDockerClient(ContainerClient):
337
340
  def pull_image(
338
341
  self,
339
342
  docker_image: str,
340
- platform: Optional[DockerPlatform] = None,
341
- log_handler: Optional[Callable[[str], None]] = None,
343
+ platform: DockerPlatform | None = None,
344
+ log_handler: Callable[[str], None] | None = None,
342
345
  ) -> None:
343
346
  LOG.debug("Pulling Docker image: %s", docker_image)
344
347
  # some path in the docker image string indicates a custom repository
345
348
 
346
349
  docker_image = self.registry_resolver_strategy.resolve(docker_image)
347
- kwargs: Dict[str, Union[str, bool]] = {"platform": platform}
350
+ kwargs: dict[str, str | bool] = {"platform": platform}
348
351
  try:
349
352
  if log_handler:
350
353
  # Use a lower-level API, as the 'stream' argument is not available in the higher-level `pull`-API
@@ -389,7 +392,7 @@ class SdkDockerClient(ContainerClient):
389
392
  dockerfile_path: str,
390
393
  image_name: str,
391
394
  context_path: str = None,
392
- platform: Optional[DockerPlatform] = None,
395
+ platform: DockerPlatform | None = None,
393
396
  ):
394
397
  try:
395
398
  dockerfile_path = Util.resolve_dockerfile_path(dockerfile_path)
@@ -466,7 +469,7 @@ class SdkDockerClient(ContainerClient):
466
469
  except APIError as e:
467
470
  raise ContainerException() from e
468
471
 
469
- def inspect_container(self, container_name_or_id: str) -> Dict[str, Union[Dict, str]]:
472
+ def inspect_container(self, container_name_or_id: str) -> dict[str, dict | str]:
470
473
  try:
471
474
  return self.client().containers.get(container_name_or_id).attrs
472
475
  except NotFound:
@@ -479,7 +482,7 @@ class SdkDockerClient(ContainerClient):
479
482
  image_name: str,
480
483
  pull: bool = True,
481
484
  strip_wellknown_repo_prefixes: bool = True,
482
- ) -> Dict[str, Union[dict, list, str]]:
485
+ ) -> dict[str, dict | list | str]:
483
486
  image_name = self.registry_resolver_strategy.resolve(image_name)
484
487
  try:
485
488
  result = self.client().images.get(image_name).attrs
@@ -513,7 +516,7 @@ class SdkDockerClient(ContainerClient):
513
516
  except APIError as e:
514
517
  raise ContainerException() from e
515
518
 
516
- def inspect_network(self, network_name: str) -> Dict[str, Union[Dict, str]]:
519
+ def inspect_network(self, network_name: str) -> dict[str, dict | str]:
517
520
  try:
518
521
  return self.client().networks.get(network_name).attrs
519
522
  except NotFound:
@@ -525,8 +528,8 @@ class SdkDockerClient(ContainerClient):
525
528
  self,
526
529
  network_name: str,
527
530
  container_name_or_id: str,
528
- aliases: Optional[List] = None,
529
- link_local_ips: List[str] = None,
531
+ aliases: list | None = None,
532
+ link_local_ips: list[str] = None,
530
533
  ) -> None:
531
534
  LOG.debug(
532
535
  "Connecting container '%s' to network '%s' with aliases '%s'",
@@ -574,7 +577,7 @@ class SdkDockerClient(ContainerClient):
574
577
  LOG.info("Container has more than one assigned network. Picking the first one...")
575
578
  return networks[network_names[0]]["IPAddress"]
576
579
 
577
- @lru_cache(maxsize=None)
580
+ @cache
578
581
  def has_docker(self) -> bool:
579
582
  try:
580
583
  if not self.docker_client:
@@ -619,8 +622,8 @@ class SdkDockerClient(ContainerClient):
619
622
  stdin=None,
620
623
  interactive: bool = False,
621
624
  attach: bool = False,
622
- flags: Optional[str] = None,
623
- ) -> Tuple[bytes, bytes]:
625
+ flags: str | None = None,
626
+ ) -> tuple[bytes, bytes]:
624
627
  LOG.debug("Starting container %s", container_name_or_id)
625
628
  try:
626
629
  container = self.client().containers.get(container_name_or_id)
@@ -668,7 +671,7 @@ class SdkDockerClient(ContainerClient):
668
671
  sock.sendall(to_bytes(stdin))
669
672
  sock.shutdown(socket.SHUT_WR)
670
673
  stdout, stderr = self._read_from_sock(sock, False)
671
- except socket.timeout:
674
+ except TimeoutError:
672
675
  LOG.debug(
673
676
  "Socket timeout when talking to the I/O streams of Docker container '%s'",
674
677
  container_name_or_id,
@@ -701,31 +704,31 @@ class SdkDockerClient(ContainerClient):
701
704
  self,
702
705
  image_name: str,
703
706
  *,
704
- name: Optional[str] = None,
705
- entrypoint: Optional[Union[List[str], str]] = None,
707
+ name: str | None = None,
708
+ entrypoint: list[str] | str | None = None,
706
709
  remove: bool = False,
707
710
  interactive: bool = False,
708
711
  tty: bool = False,
709
712
  detach: bool = False,
710
- command: Optional[Union[List[str], str]] = None,
711
- volumes: Optional[List[SimpleVolumeBind]] = None,
712
- ports: Optional[PortMappings] = None,
713
- exposed_ports: Optional[List[str]] = None,
714
- env_vars: Optional[Dict[str, str]] = None,
715
- user: Optional[str] = None,
716
- cap_add: Optional[List[str]] = None,
717
- cap_drop: Optional[List[str]] = None,
718
- security_opt: Optional[List[str]] = None,
719
- network: Optional[str] = None,
720
- dns: Optional[Union[str, List[str]]] = None,
721
- additional_flags: Optional[str] = None,
722
- workdir: Optional[str] = None,
723
- privileged: Optional[bool] = None,
724
- labels: Optional[Dict[str, str]] = None,
725
- platform: Optional[DockerPlatform] = None,
726
- ulimits: Optional[List[Ulimit]] = None,
727
- init: Optional[bool] = None,
728
- log_config: Optional[LogConfig] = None,
713
+ command: list[str] | str | None = None,
714
+ volumes: list[SimpleVolumeBind] | None = None,
715
+ ports: PortMappings | None = None,
716
+ exposed_ports: list[str] | None = None,
717
+ env_vars: dict[str, str] | None = None,
718
+ user: str | None = None,
719
+ cap_add: list[str] | None = None,
720
+ cap_drop: list[str] | None = None,
721
+ security_opt: list[str] | None = None,
722
+ network: str | None = None,
723
+ dns: str | list[str] | None = None,
724
+ additional_flags: str | None = None,
725
+ workdir: str | None = None,
726
+ privileged: bool | None = None,
727
+ labels: dict[str, str] | None = None,
728
+ platform: DockerPlatform | None = None,
729
+ ulimits: list[Ulimit] | None = None,
730
+ init: bool | None = None,
731
+ log_config: LogConfig | None = None,
729
732
  ) -> str:
730
733
  LOG.debug("Creating container with attributes: %s", locals())
731
734
  extra_hosts = None
@@ -832,32 +835,32 @@ class SdkDockerClient(ContainerClient):
832
835
  image_name: str,
833
836
  stdin=None,
834
837
  *,
835
- name: Optional[str] = None,
836
- entrypoint: Optional[str] = None,
838
+ name: str | None = None,
839
+ entrypoint: str | None = None,
837
840
  remove: bool = False,
838
841
  interactive: bool = False,
839
842
  tty: bool = False,
840
843
  detach: bool = False,
841
- command: Optional[Union[List[str], str]] = None,
842
- volumes: Optional[List[SimpleVolumeBind]] = None,
843
- ports: Optional[PortMappings] = None,
844
- exposed_ports: Optional[List[str]] = None,
845
- env_vars: Optional[Dict[str, str]] = None,
846
- user: Optional[str] = None,
847
- cap_add: Optional[List[str]] = None,
848
- cap_drop: Optional[List[str]] = None,
849
- security_opt: Optional[List[str]] = None,
850
- network: Optional[str] = None,
851
- dns: Optional[str] = None,
852
- additional_flags: Optional[str] = None,
853
- workdir: Optional[str] = None,
854
- labels: Optional[Dict[str, str]] = None,
855
- platform: Optional[DockerPlatform] = None,
856
- privileged: Optional[bool] = None,
857
- ulimits: Optional[List[Ulimit]] = None,
858
- init: Optional[bool] = None,
859
- log_config: Optional[LogConfig] = None,
860
- ) -> Tuple[bytes, bytes]:
844
+ command: list[str] | str | None = None,
845
+ volumes: list[SimpleVolumeBind] | None = None,
846
+ ports: PortMappings | None = None,
847
+ exposed_ports: list[str] | None = None,
848
+ env_vars: dict[str, str] | None = None,
849
+ user: str | None = None,
850
+ cap_add: list[str] | None = None,
851
+ cap_drop: list[str] | None = None,
852
+ security_opt: list[str] | None = None,
853
+ network: str | None = None,
854
+ dns: str | None = None,
855
+ additional_flags: str | None = None,
856
+ workdir: str | None = None,
857
+ labels: dict[str, str] | None = None,
858
+ platform: DockerPlatform | None = None,
859
+ privileged: bool | None = None,
860
+ ulimits: list[Ulimit] | None = None,
861
+ init: bool | None = None,
862
+ log_config: LogConfig | None = None,
863
+ ) -> tuple[bytes, bytes]:
861
864
  LOG.debug("Running container with image: %s", image_name)
862
865
  container = None
863
866
  try:
@@ -903,14 +906,14 @@ class SdkDockerClient(ContainerClient):
903
906
  def exec_in_container(
904
907
  self,
905
908
  container_name_or_id: str,
906
- command: Union[List[str], str],
909
+ command: list[str] | str,
907
910
  interactive=False,
908
911
  detach=False,
909
- env_vars: Optional[Dict[str, Optional[str]]] = None,
910
- stdin: Optional[bytes] = None,
911
- user: Optional[str] = None,
912
- workdir: Optional[str] = None,
913
- ) -> Tuple[bytes, bytes]:
912
+ env_vars: dict[str, str | None] | None = None,
913
+ stdin: bytes | None = None,
914
+ user: str | None = None,
915
+ workdir: str | None = None,
916
+ ) -> tuple[bytes, bytes]:
914
917
  LOG.debug("Executing command in container %s: %s", container_name_or_id, command)
915
918
  try:
916
919
  container: Container = self.client().containers.get(container_name_or_id)
@@ -936,7 +939,7 @@ class SdkDockerClient(ContainerClient):
936
939
  sock.shutdown(socket.SHUT_WR)
937
940
  stdout, stderr = self._read_from_sock(sock, tty)
938
941
  return stdout, stderr
939
- except socket.timeout:
942
+ except TimeoutError:
940
943
  pass
941
944
  else:
942
945
  if detach:
@@ -957,7 +960,7 @@ class SdkDockerClient(ContainerClient):
957
960
  except APIError as e:
958
961
  raise ContainerException() from e
959
962
 
960
- def login(self, username: str, password: str, registry: Optional[str] = None) -> None:
963
+ def login(self, username: str, password: str, registry: str | None = None) -> None:
961
964
  LOG.debug("Docker login for %s", username)
962
965
  try:
963
966
  self.client().login(username, password=password, registry=registry, reauth=True)
@@ -3,7 +3,6 @@ import logging
3
3
  import os
4
4
  import re
5
5
  import threading
6
- from typing import Tuple
7
6
 
8
7
  from cryptography.hazmat.backends import default_backend
9
8
  from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
@@ -44,8 +43,8 @@ def generate_ssl_cert(
44
43
  return all(os.path.exists(f) for f in files)
45
44
 
46
45
  def store_cert_key_files(base_filename):
47
- key_file_name = "%s.key" % base_filename
48
- cert_file_name = "%s.crt" % base_filename
46
+ key_file_name = f"{base_filename}.key"
47
+ cert_file_name = f"{base_filename}.crt"
49
48
  # TODO: Cleaner code to load the cert dynamically
50
49
  # extract key and cert from target_file and store into separate files
51
50
  content = load_file(target_file)
@@ -75,9 +74,9 @@ def generate_ssl_cert(
75
74
  return target_file, cert_file_name, key_file_name
76
75
  if random and target_file:
77
76
  if "." in target_file:
78
- target_file = target_file.replace(".", ".%s." % short_uid(), 1)
77
+ target_file = target_file.replace(".", f".{short_uid()}.", 1)
79
78
  else:
80
- target_file = "%s.%s" % (target_file, short_uid())
79
+ target_file = f"{target_file}.{short_uid()}"
81
80
 
82
81
  # create a key pair
83
82
  k = crypto.PKey()
@@ -105,7 +104,7 @@ def generate_ssl_cert(
105
104
  cert.set_pubkey(k)
106
105
  alt_names = (
107
106
  f"DNS:localhost,DNS:test.localhost.atlassian.io,DNS:localhost.localstack.cloud,DNS:{host_definition.host}IP:127.0.0.1"
108
- ).encode("utf8")
107
+ ).encode()
109
108
  cert.add_extensions(
110
109
  [
111
110
  crypto.X509Extension(b"subjectAltName", False, alt_names),
@@ -124,10 +123,10 @@ def generate_ssl_cert(
124
123
  key_file.write(to_str(crypto.dump_privatekey(crypto.FILETYPE_PEM, k)))
125
124
  cert_file_content = cert_file.getvalue().strip()
126
125
  key_file_content = key_file.getvalue().strip()
127
- file_content = "%s\n%s" % (key_file_content, cert_file_content)
126
+ file_content = f"{key_file_content}\n{cert_file_content}"
128
127
  if target_file:
129
- key_file_name = "%s.key" % target_file
130
- cert_file_name = "%s.crt" % target_file
128
+ key_file_name = f"{target_file}.key"
129
+ cert_file_name = f"{target_file}.crt"
131
130
  # check existence to avoid permission denied issues:
132
131
  # https://github.com/localstack/localstack/issues/1607
133
132
  if not all_exist(target_file, key_file_name, cert_file_name):
@@ -146,9 +145,9 @@ def generate_ssl_cert(
146
145
  e,
147
146
  )
148
147
  # Fix for https://github.com/localstack/localstack/issues/1743
149
- target_file = "%s.pem" % new_tmp_file()
150
- key_file_name = "%s.key" % target_file
151
- cert_file_name = "%s.crt" % target_file
148
+ target_file = f"{new_tmp_file()}.pem"
149
+ key_file_name = f"{target_file}.key"
150
+ cert_file_name = f"{target_file}.crt"
152
151
  TMP_FILES.append(target_file)
153
152
  TMP_FILES.append(key_file_name)
154
153
  TMP_FILES.append(cert_file_name)
@@ -165,7 +164,7 @@ def unpad(s: bytes) -> bytes:
165
164
  return s[0 : -s[-1]]
166
165
 
167
166
 
168
- def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) -> Tuple[bytes, bytes]:
167
+ def encrypt(key: bytes, message: bytes, iv: bytes = None, aad: bytes = None) -> tuple[bytes, bytes]:
169
168
  iv = iv or b"0" * BLOCK_SIZE
170
169
  cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
171
170
  encryptor = cipher.encryptor()
@@ -3,7 +3,6 @@
3
3
  import inspect
4
4
  import os
5
5
  import socket
6
- from typing import Dict, List, Optional, Union
7
6
 
8
7
  from localstack import config
9
8
  from localstack.constants import DEFAULT_VOLUME_DIR
@@ -41,7 +40,7 @@ ENDPOINT_RESOLVE_LIST = ["localhost.localstack.cloud", "api.localstack.cloud"]
41
40
  INSPECT_DIRECTORIES = [DEFAULT_VOLUME_DIR, "/tmp"]
42
41
 
43
42
 
44
- def get_localstack_logs() -> Dict:
43
+ def get_localstack_logs() -> dict:
45
44
  try:
46
45
  result = DOCKER_CLIENT.get_container_logs(get_main_container_name())
47
46
  except Exception as e:
@@ -50,7 +49,7 @@ def get_localstack_logs() -> Dict:
50
49
  return {"docker": result}
51
50
 
52
51
 
53
- def get_localstack_config() -> Dict:
52
+ def get_localstack_config() -> dict:
54
53
  result = {}
55
54
  for k, v in inspect.getmembers(config):
56
55
  if k in EXCLUDE_CONFIG_KEYS:
@@ -77,14 +76,14 @@ def get_localstack_config() -> Dict:
77
76
  return result
78
77
 
79
78
 
80
- def inspect_main_container() -> Union[str, Dict]:
79
+ def inspect_main_container() -> str | dict:
81
80
  try:
82
81
  return DOCKER_CLIENT.inspect_container(get_main_container_name())
83
82
  except Exception as e:
84
83
  return f"inspect failed: {e}"
85
84
 
86
85
 
87
- def get_localstack_version() -> Dict[str, Optional[str]]:
86
+ def get_localstack_version() -> dict[str, str | None]:
88
87
  return {
89
88
  "build-date": os.environ.get("LOCALSTACK_BUILD_DATE"),
90
89
  "build-git-hash": os.environ.get("LOCALSTACK_BUILD_GIT_HASH"),
@@ -92,7 +91,7 @@ def get_localstack_version() -> Dict[str, Optional[str]]:
92
91
  }
93
92
 
94
93
 
95
- def resolve_endpoints() -> Dict[str, str]:
94
+ def resolve_endpoints() -> dict[str, str]:
96
95
  result = {}
97
96
  for endpoint in ENDPOINT_RESOLVE_LIST:
98
97
  try:
@@ -103,7 +102,7 @@ def resolve_endpoints() -> Dict[str, str]:
103
102
  return result
104
103
 
105
104
 
106
- def get_important_image_hashes() -> Dict[str, str]:
105
+ def get_important_image_hashes() -> dict[str, str]:
107
106
  result = {}
108
107
  for image in DIAGNOSE_IMAGES:
109
108
  try:
@@ -116,17 +115,17 @@ def get_important_image_hashes() -> Dict[str, str]:
116
115
  return result
117
116
 
118
117
 
119
- def get_service_stats() -> Dict[str, str]:
118
+ def get_service_stats() -> dict[str, str]:
120
119
  from localstack.services.plugins import SERVICE_PLUGINS
121
120
 
122
121
  return {service: state.value for service, state in SERVICE_PLUGINS.get_states().items()}
123
122
 
124
123
 
125
- def get_file_tree() -> Dict[str, List[str]]:
124
+ def get_file_tree() -> dict[str, list[str]]:
126
125
  return {d: traverse_file_tree(d) for d in INSPECT_DIRECTORIES}
127
126
 
128
127
 
129
- def traverse_file_tree(root: str) -> List[str]:
128
+ def traverse_file_tree(root: str) -> list[str]:
130
129
  try:
131
130
  result = []
132
131
  if config.in_docker():
@@ -134,10 +133,10 @@ def traverse_file_tree(root: str) -> List[str]:
134
133
  result.append(dirpath)
135
134
  return result
136
135
  except Exception as e:
137
- return ["traversing files failed %s" % e]
136
+ return [f"traversing files failed {e}"]
138
137
 
139
138
 
140
- def get_docker_image_details() -> Dict[str, str]:
139
+ def get_docker_image_details() -> dict[str, str]:
141
140
  try:
142
141
  image = DOCKER_CLIENT.inspect_container(get_main_container_name())["Config"]["Image"]
143
142
  except ContainerException:
@@ -2,13 +2,13 @@ import functools
2
2
  import logging
3
3
  import platform
4
4
  import random
5
- from typing import List, Optional, Union
6
5
 
7
6
  from localstack import config
8
7
  from localstack.constants import DEFAULT_VOLUME_DIR, DOCKER_IMAGE_NAME
9
8
  from localstack.utils.collections import ensure_list
10
9
  from localstack.utils.container_utils.container_client import (
11
10
  ContainerClient,
11
+ DockerNotAvailable,
12
12
  PortMappings,
13
13
  VolumeInfo,
14
14
  )
@@ -74,12 +74,12 @@ def get_current_container_id() -> str:
74
74
  return container_id
75
75
 
76
76
 
77
- def inspect_current_container_mounts() -> List[VolumeInfo]:
77
+ def inspect_current_container_mounts() -> list[VolumeInfo]:
78
78
  return DOCKER_CLIENT.inspect_container_volumes(get_current_container_id())
79
79
 
80
80
 
81
- @functools.lru_cache()
82
- def get_default_volume_dir_mount() -> Optional[VolumeInfo]:
81
+ @functools.lru_cache
82
+ def get_default_volume_dir_mount() -> VolumeInfo | None:
83
83
  """
84
84
  Returns the volume information of LocalStack's DEFAULT_VOLUME_DIR (/var/lib/localstack), if mounted,
85
85
  else it returns None. If we're not currently in docker a VauleError is raised. in a container, a ValueError is
@@ -132,8 +132,8 @@ def get_host_path_for_path_in_docker(path):
132
132
 
133
133
 
134
134
  def container_ports_can_be_bound(
135
- ports: Union[IntOrPort, List[IntOrPort]],
136
- address: Optional[str] = None,
135
+ ports: IntOrPort | list[IntOrPort],
136
+ address: str | None = None,
137
137
  ) -> bool:
138
138
  """Determine whether a given list of ports can be bound by Docker containers
139
139
 
@@ -153,10 +153,14 @@ def container_ports_can_be_bound(
153
153
  ports=port_mappings,
154
154
  remove=True,
155
155
  )
156
+ except DockerNotAvailable as e:
157
+ LOG.warning("Cannot perform port check because Docker is not available.")
158
+ raise e
156
159
  except Exception as e:
157
160
  if "port is already allocated" not in str(e) and "address already in use" not in str(e):
158
161
  LOG.warning(
159
- "Unexpected error when attempting to determine container port status", exc_info=e
162
+ "Unexpected error when attempting to determine container port status",
163
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
160
164
  )
161
165
  return False
162
166
  # TODO(srw): sometimes the command output from the docker container is "None", particularly when this function is
localstack/utils/files.py CHANGED
@@ -6,13 +6,12 @@ import shutil
6
6
  import stat
7
7
  import tempfile
8
8
  from pathlib import Path
9
- from typing import Dict
10
9
 
11
10
  LOG = logging.getLogger(__name__)
12
11
  TMP_FILES = []
13
12
 
14
13
 
15
- def parse_config_file(file_or_str: str, single_section: bool = True) -> Dict:
14
+ def parse_config_file(file_or_str: str, single_section: bool = True) -> dict:
16
15
  """Parse the given properties config file/string and return a dict of section->key->value.
17
16
  If the config contains a single section, and 'single_section' is True, returns"""
18
17
 
@@ -81,9 +80,26 @@ def save_file(file, content, append=False, permissions=None):
81
80
  f.flush()
82
81
 
83
82
 
84
- def load_file(file_path: str, default=None, mode=None):
83
+ def load_file(
84
+ file_path: str | os.PathLike,
85
+ default: str | bytes | None = None,
86
+ mode: str | None = None,
87
+ strict: bool = False,
88
+ ) -> str | bytes | None:
89
+ """
90
+ Return file contents
91
+
92
+ :param file_path: path of the file
93
+ :param default: if strict=False then return this value if the file does not exist
94
+ :param mode: mode to open the file with (e.g. `r`, `rw`)
95
+ :param strict: raise an error if the file path is not a file
96
+ :return: the file contents
97
+ """
85
98
  if not os.path.isfile(file_path):
86
- return default
99
+ if strict:
100
+ raise FileNotFoundError(file_path)
101
+ else:
102
+ return default
87
103
  if not mode:
88
104
  mode = "r"
89
105
  with open(file_path, mode) as f:
@@ -202,7 +218,7 @@ def rm_rf(path: str):
202
218
  # Running the native command can be an order of magnitude faster in Alpine on Travis-CI
203
219
  if is_debian():
204
220
  try:
205
- return run('rm -rf "%s"' % path)
221
+ return run(f'rm -rf "{path}"')
206
222
  except Exception:
207
223
  pass
208
224
  # Make sure all files are writeable and dirs executable to remove
@@ -248,11 +264,7 @@ def cp_r(src: str, dst: str, rm_dest_on_conflict=False, ignore_copystat_errors=F
248
264
  except Exception as e:
249
265
 
250
266
  def _info(_path):
251
- return "%s (file=%s, symlink=%s)" % (
252
- _path,
253
- os.path.isfile(_path),
254
- os.path.islink(_path),
255
- )
267
+ return f"{_path} (file={os.path.isfile(_path)}, symlink={os.path.islink(_path)})"
256
268
 
257
269
  LOG.debug("Error copying files from %s to %s: %s", _info(src), _info(dst), e)
258
270
  raise
@@ -293,7 +305,7 @@ def cleanup_tmp_files():
293
305
  del TMP_FILES[:]
294
306
 
295
307
 
296
- def new_tmp_file(suffix: str = None, dir: str = None) -> str:
308
+ def new_tmp_file(suffix: str | None = None, dir: str | None = None) -> str:
297
309
  """Return a path to a new temporary file."""
298
310
  tmp_file, tmp_path = tempfile.mkstemp(suffix=suffix, dir=dir)
299
311
  os.close(tmp_file)
@@ -301,8 +313,15 @@ def new_tmp_file(suffix: str = None, dir: str = None) -> str:
301
313
  return tmp_path
302
314
 
303
315
 
304
- def new_tmp_dir(dir: str = None):
305
- folder = new_tmp_file(dir=dir)
306
- rm_rf(folder)
307
- mkdir(folder)
316
+ def new_tmp_dir(dir: str | None = None, mode: int = 0o777) -> str:
317
+ """
318
+ Create a new temporary directory with the specified permissions. The directory is added to the tracked temporary
319
+ files.
320
+ :param dir: parent directory for the temporary directory to be created. Systems's default otherwise.
321
+ :param mode: file permission for the directory (default: 0o777)
322
+ :return: the absolute path of the created directory
323
+ """
324
+ folder = tempfile.mkdtemp(dir=dir)
325
+ TMP_FILES.append(folder)
326
+ idempotent_chmod(folder, mode=mode)
308
327
  return folder
@@ -3,7 +3,8 @@
3
3
  import functools
4
4
  import inspect
5
5
  import logging
6
- from typing import Any, Callable, Dict, Optional, Tuple
6
+ from collections.abc import Callable
7
+ from typing import Any
7
8
 
8
9
  LOG = logging.getLogger(__name__)
9
10
 
@@ -19,8 +20,8 @@ def run_safe(_python_lambda, *args, _default=None, **kwargs):
19
20
 
20
21
 
21
22
  def call_safe(
22
- func: Callable, args: Tuple = None, kwargs: Dict = None, exception_message: str = None
23
- ) -> Optional[Any]:
23
+ func: Callable, args: tuple = None, kwargs: dict = None, exception_message: str = None
24
+ ) -> Any | None:
24
25
  """
25
26
  Call the given function with the given arguments, and if it fails, log the given exception_message.
26
27
  If logging.DEBUG is set for the logger, then we also log the traceback.
@@ -32,7 +33,7 @@ def call_safe(
32
33
  :return: whatever the func returns
33
34
  """
34
35
  if exception_message is None:
35
- exception_message = "error calling function %s" % func.__name__
36
+ exception_message = f"error calling function {func.__name__}"
36
37
  if args is None:
37
38
  args = ()
38
39
  if kwargs is None: