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
@@ -5,24 +5,17 @@ import logging
5
5
  import os
6
6
  import re
7
7
  import shlex
8
- import sys
9
8
  import tarfile
10
9
  import tempfile
11
10
  from abc import ABCMeta, abstractmethod
11
+ from collections.abc import Callable
12
12
  from enum import Enum, unique
13
13
  from pathlib import Path
14
14
  from typing import (
15
- Callable,
16
- Dict,
17
- List,
18
15
  Literal,
19
16
  NamedTuple,
20
- Optional,
21
17
  Protocol,
22
- Tuple,
23
18
  TypedDict,
24
- Union,
25
- get_args,
26
19
  )
27
20
 
28
21
  import dotenv
@@ -60,7 +53,7 @@ class DockerContainerStats(TypedDict):
60
53
  MemUsage: tuple[int, int]
61
54
  NetIO: tuple[int, int]
62
55
  PIDs: int
63
- SDKStats: Optional[dict]
56
+ SDKStats: dict | None
64
57
 
65
58
 
66
59
  class ContainerException(Exception):
@@ -146,7 +139,7 @@ class Ulimit:
146
139
 
147
140
  name: str
148
141
  soft_limit: int
149
- hard_limit: Optional[int] = None
142
+ hard_limit: int | None = None
150
143
 
151
144
  def __repr__(self):
152
145
  """Format: <type>=<soft limit>[:<hard limit>]"""
@@ -157,26 +150,18 @@ class Ulimit:
157
150
 
158
151
 
159
152
  # defines the type for port mappings (source->target port range)
160
- PortRange = Union[List, HashableList]
153
+ PortRange = list | HashableList
161
154
  # defines the protocol for a port range ("tcp" or "udp")
162
155
  PortProtocol = str
163
156
 
164
157
 
165
- def isinstance_union(obj, class_or_tuple):
166
- # that's some dirty hack
167
- if sys.version_info < (3, 10):
168
- return isinstance(obj, get_args(PortRange))
169
- else:
170
- return isinstance(obj, class_or_tuple)
171
-
172
-
173
158
  class PortMappings:
174
159
  """Maps source to target port ranges for Docker port mappings."""
175
160
 
176
161
  # bind host to be used for defining port mappings
177
162
  bind_host: str
178
163
  # maps `from` port range to `to` port range for port mappings
179
- mappings: Dict[Tuple[PortRange, PortProtocol], List]
164
+ mappings: dict[tuple[PortRange, PortProtocol], list]
180
165
 
181
166
  def __init__(self, bind_host: str = None):
182
167
  self.bind_host = bind_host if bind_host else ""
@@ -184,14 +169,14 @@ class PortMappings:
184
169
 
185
170
  def add(
186
171
  self,
187
- port: Union[int, PortRange],
188
- mapped: Union[int, PortRange] = None,
172
+ port: int | PortRange,
173
+ mapped: int | PortRange = None,
189
174
  protocol: PortProtocol = "tcp",
190
175
  ):
191
176
  mapped = mapped or port
192
- if isinstance_union(port, PortRange):
177
+ if isinstance(port, PortRange):
193
178
  for i in range(port[1] - port[0] + 1):
194
- if isinstance_union(mapped, PortRange):
179
+ if isinstance(mapped, PortRange):
195
180
  self.add(port[0] + i, mapped[0] + i, protocol)
196
181
  else:
197
182
  self.add(port[0] + i, mapped, protocol)
@@ -253,7 +238,7 @@ class PortMappings:
253
238
 
254
239
  return " ".join([entry(k, v) for k, v in self.mappings.items()])
255
240
 
256
- def to_list(self) -> List[str]: # TODO test
241
+ def to_list(self) -> list[str]: # TODO test
257
242
  bind_address = f"{self.bind_host}:" if self.bind_host else ""
258
243
 
259
244
  def entry(k, v):
@@ -269,7 +254,7 @@ class PortMappings:
269
254
 
270
255
  return [item for k, v in self.mappings.items() for item in entry(k, v)]
271
256
 
272
- def to_dict(self) -> Dict[str, Union[Tuple[str, Union[int, List[int]]], int]]:
257
+ def to_dict(self) -> dict[str, tuple[str, int | list[int]] | int]:
273
258
  bind_address = self.bind_host or ""
274
259
 
275
260
  def bind_port(bind_address, host_port):
@@ -367,7 +352,7 @@ class PortMappings:
367
352
  return f"<PortMappings: {self.to_dict()}>"
368
353
 
369
354
 
370
- SimpleVolumeBind = Tuple[str, str]
355
+ SimpleVolumeBind = tuple[str, str]
371
356
  """Type alias for a simple version of VolumeBind"""
372
357
 
373
358
 
@@ -455,27 +440,23 @@ class VolumeDirMount:
455
440
 
456
441
 
457
442
  class VolumeMappings:
458
- mappings: List[Union[SimpleVolumeBind, BindMount]]
443
+ mappings: list[SimpleVolumeBind | BindMount]
459
444
 
460
- def __init__(self, mappings: List[Union[SimpleVolumeBind, BindMount, VolumeDirMount]] = None):
445
+ def __init__(self, mappings: list[SimpleVolumeBind | BindMount | VolumeDirMount] = None):
461
446
  self.mappings = mappings if mappings is not None else []
462
447
 
463
- def add(self, mapping: Union[SimpleVolumeBind, BindMount, VolumeDirMount]):
448
+ def add(self, mapping: SimpleVolumeBind | BindMount | VolumeDirMount):
464
449
  self.append(mapping)
465
450
 
466
451
  def append(
467
452
  self,
468
- mapping: Union[
469
- SimpleVolumeBind,
470
- BindMount,
471
- VolumeDirMount,
472
- ],
453
+ mapping: SimpleVolumeBind | BindMount | VolumeDirMount,
473
454
  ):
474
455
  self.mappings.append(mapping)
475
456
 
476
457
  def find_target_mapping(
477
458
  self, container_dir: str
478
- ) -> Optional[Union[SimpleVolumeBind, BindMount, VolumeDirMount]]:
459
+ ) -> SimpleVolumeBind | BindMount | VolumeDirMount | None:
479
460
  """
480
461
  Looks through the volumes and returns the one where the container dir matches ``container_dir``.
481
462
  Returns None if there is no volume mapping to the given container directory.
@@ -514,27 +495,27 @@ class VolumeInfo(NamedTuple):
514
495
  mode: str
515
496
  rw: bool
516
497
  propagation: str
517
- name: Optional[str] = None
518
- driver: Optional[str] = None
498
+ name: str | None = None
499
+ driver: str | None = None
519
500
 
520
501
 
521
502
  @dataclasses.dataclass
522
503
  class LogConfig:
523
504
  type: Literal["json-file", "syslog", "journald", "gelf", "fluentd", "none", "awslogs", "splunk"]
524
- config: Dict[str, str] = dataclasses.field(default_factory=dict)
505
+ config: dict[str, str] = dataclasses.field(default_factory=dict)
525
506
 
526
507
 
527
508
  @dataclasses.dataclass
528
509
  class ContainerConfiguration:
529
510
  image_name: str
530
- name: Optional[str] = None
511
+ name: str | None = None
531
512
  volumes: VolumeMappings = dataclasses.field(default_factory=VolumeMappings)
532
513
  ports: PortMappings = dataclasses.field(default_factory=PortMappings)
533
- exposed_ports: List[str] = dataclasses.field(default_factory=list)
534
- entrypoint: Optional[Union[List[str], str]] = None
535
- additional_flags: Optional[str] = None
536
- command: Optional[List[str]] = None
537
- env_vars: Dict[str, str] = dataclasses.field(default_factory=dict)
514
+ exposed_ports: list[str] = dataclasses.field(default_factory=list)
515
+ entrypoint: list[str] | str | None = None
516
+ additional_flags: str | None = None
517
+ command: list[str] | None = None
518
+ env_vars: dict[str, str] = dataclasses.field(default_factory=dict)
538
519
 
539
520
  privileged: bool = False
540
521
  remove: bool = False
@@ -542,19 +523,19 @@ class ContainerConfiguration:
542
523
  tty: bool = False
543
524
  detach: bool = False
544
525
 
545
- stdin: Optional[str] = None
546
- user: Optional[str] = None
547
- cap_add: Optional[List[str]] = None
548
- cap_drop: Optional[List[str]] = None
549
- security_opt: Optional[List[str]] = None
550
- network: Optional[str] = None
551
- dns: Optional[str] = None
552
- workdir: Optional[str] = None
553
- platform: Optional[str] = None
554
- ulimits: Optional[List[Ulimit]] = None
555
- labels: Optional[Dict[str, str]] = None
556
- init: Optional[bool] = None
557
- log_config: Optional[LogConfig] = None
526
+ stdin: str | None = None
527
+ user: str | None = None
528
+ cap_add: list[str] | None = None
529
+ cap_drop: list[str] | None = None
530
+ security_opt: list[str] | None = None
531
+ network: str | None = None
532
+ dns: str | None = None
533
+ workdir: str | None = None
534
+ platform: str | None = None
535
+ ulimits: list[Ulimit] | None = None
536
+ labels: dict[str, str] | None = None
537
+ init: bool | None = None
538
+ log_config: LogConfig | None = None
558
539
 
559
540
 
560
541
  class ContainerConfigurator(Protocol):
@@ -577,17 +558,17 @@ class DockerRunFlags:
577
558
  create: https://docs.docker.com/engine/reference/commandline/create/
578
559
  """
579
560
 
580
- env_vars: Optional[Dict[str, str]]
581
- extra_hosts: Optional[Dict[str, str]]
582
- labels: Optional[Dict[str, str]]
583
- volumes: Optional[List[SimpleVolumeBind]]
584
- network: Optional[str]
585
- platform: Optional[DockerPlatform]
586
- privileged: Optional[bool]
587
- ports: Optional[PortMappings]
588
- ulimits: Optional[List[Ulimit]]
589
- user: Optional[str]
590
- dns: Optional[List[str]]
561
+ env_vars: dict[str, str] | None
562
+ extra_hosts: dict[str, str] | None
563
+ labels: dict[str, str] | None
564
+ volumes: list[SimpleVolumeBind] | None
565
+ network: str | None
566
+ platform: DockerPlatform | None
567
+ privileged: bool | None
568
+ ports: PortMappings | None
569
+ ulimits: list[Ulimit] | None
570
+ user: str | None
571
+ dns: list[str] | None
591
572
 
592
573
 
593
574
  class RegistryResolverStrategy(Protocol):
@@ -621,7 +602,7 @@ class ContainerClient(metaclass=ABCMeta):
621
602
  """Returns the usage statistics of the container with the given name"""
622
603
  pass
623
604
 
624
- def get_networks(self, container_name: str) -> List[str]:
605
+ def get_networks(self, container_name: str) -> list[str]:
625
606
  LOG.debug("Getting networks for container: %s", container_name)
626
607
  container_attrs = self.inspect_container(container_name_or_id=container_name)
627
608
  return list(container_attrs["NetworkSettings"].get("Networks", {}).keys())
@@ -689,8 +670,16 @@ class ContainerClient(metaclass=ABCMeta):
689
670
  """Unpauses a container with the given name."""
690
671
 
691
672
  @abstractmethod
692
- def remove_container(self, container_name: str, force=True, check_existence=False) -> None:
693
- """Removes container with given name"""
673
+ def remove_container(
674
+ self, container_name: str, force=True, check_existence=False, volumes=False
675
+ ) -> None:
676
+ """Removes container
677
+
678
+ :param container_name: Name of the container
679
+ :param force: Force the removal of a running container (uses SIGKILL)
680
+ :param check_existence: Return if container doesn't exist
681
+ :param volumes: Remove anonymous volumes associated with the container
682
+ """
694
683
 
695
684
  @abstractmethod
696
685
  def remove_image(self, image: str, force: bool = True) -> None:
@@ -701,17 +690,19 @@ class ContainerClient(metaclass=ABCMeta):
701
690
  """
702
691
 
703
692
  @abstractmethod
704
- def list_containers(self, filter: Union[List[str], str, None] = None, all=True) -> List[dict]:
693
+ def list_containers(self, filter: list[str] | str | None = None, all=True) -> list[dict]:
705
694
  """List all containers matching the given filters
706
695
 
707
696
  :return: A list of dicts with keys id, image, name, labels, status
708
697
  """
709
698
 
710
- def get_running_container_names(self) -> List[str]:
699
+ def get_running_container_names(self) -> list[str]:
711
700
  """Returns a list of the names of all running containers"""
712
- result = self.list_containers(all=False)
713
- result = [container["name"] for container in result]
714
- return result
701
+ return self.__get_container_names(return_all=False)
702
+
703
+ def get_all_container_names(self) -> list[str]:
704
+ """Returns a list of the names of all containers including stopped ones"""
705
+ return self.__get_container_names(return_all=True)
715
706
 
716
707
  def is_container_running(self, container_name: str) -> bool:
717
708
  """Checks whether a container with a given name is currently running"""
@@ -722,7 +713,7 @@ class ContainerClient(metaclass=ABCMeta):
722
713
  container_name,
723
714
  file_contents: bytes,
724
715
  container_path: str,
725
- chmod_mode: Optional[int] = None,
716
+ chmod_mode: int | None = None,
726
717
  ) -> None:
727
718
  """
728
719
  Create a file in container with the provided content. Provide the 'chmod_mode' argument if you want the file to have specific permissions.
@@ -754,8 +745,8 @@ class ContainerClient(metaclass=ABCMeta):
754
745
  def pull_image(
755
746
  self,
756
747
  docker_image: str,
757
- platform: Optional[DockerPlatform] = None,
758
- log_handler: Optional[Callable[[str], None]] = None,
748
+ platform: DockerPlatform | None = None,
749
+ log_handler: Callable[[str], None] | None = None,
759
750
  ) -> None:
760
751
  """
761
752
  Pulls an image with a given name from a Docker registry
@@ -773,7 +764,7 @@ class ContainerClient(metaclass=ABCMeta):
773
764
  dockerfile_path: str,
774
765
  image_name: str,
775
766
  context_path: str = None,
776
- platform: Optional[DockerPlatform] = None,
767
+ platform: DockerPlatform | None = None,
777
768
  ) -> str:
778
769
  """Builds an image from the given Dockerfile
779
770
 
@@ -798,7 +789,7 @@ class ContainerClient(metaclass=ABCMeta):
798
789
  strip_latest: bool = True,
799
790
  include_tags: bool = True,
800
791
  strip_wellknown_repo_prefixes: bool = True,
801
- ) -> List[str]:
792
+ ) -> list[str]:
802
793
  """
803
794
  Get all names of docker images available to the container engine
804
795
  :param strip_latest: return images both with and without :latest tag
@@ -817,13 +808,13 @@ class ContainerClient(metaclass=ABCMeta):
817
808
  """Returns a blocking generator you can iterate over to retrieve log output as it happens."""
818
809
 
819
810
  @abstractmethod
820
- def inspect_container(self, container_name_or_id: str) -> Dict[str, Union[Dict, str]]:
811
+ def inspect_container(self, container_name_or_id: str) -> dict[str, dict | str]:
821
812
  """Get detailed attributes of a container.
822
813
 
823
814
  :return: Dict containing docker attributes as returned by the daemon
824
815
  """
825
816
 
826
- def inspect_container_volumes(self, container_name_or_id) -> List[VolumeInfo]:
817
+ def inspect_container_volumes(self, container_name_or_id) -> list[VolumeInfo]:
827
818
  """Return information about the volumes mounted into the given container.
828
819
 
829
820
  :param container_name_or_id: the container name or id
@@ -838,7 +829,7 @@ class ContainerClient(metaclass=ABCMeta):
838
829
  @abstractmethod
839
830
  def inspect_image(
840
831
  self, image_name: str, pull: bool = True, strip_wellknown_repo_prefixes: bool = True
841
- ) -> Dict[str, Union[dict, list, str]]:
832
+ ) -> dict[str, dict | list | str]:
842
833
  """Get detailed attributes of an image.
843
834
 
844
835
  :param image_name: Image name to inspect
@@ -864,7 +855,7 @@ class ContainerClient(metaclass=ABCMeta):
864
855
  """
865
856
 
866
857
  @abstractmethod
867
- def inspect_network(self, network_name: str) -> Dict[str, Union[Dict, str]]:
858
+ def inspect_network(self, network_name: str) -> dict[str, dict | str]:
868
859
  """Get detailed attributes of an network.
869
860
 
870
861
  :return: Dict containing docker attributes as returned by the daemon
@@ -875,8 +866,8 @@ class ContainerClient(metaclass=ABCMeta):
875
866
  self,
876
867
  network_name: str,
877
868
  container_name_or_id: str,
878
- aliases: Optional[List] = None,
879
- link_local_ips: List[str] = None,
869
+ aliases: list | None = None,
870
+ link_local_ips: list[str] = None,
880
871
  ) -> None:
881
872
  """
882
873
  Connects a container to a given network
@@ -911,7 +902,7 @@ class ContainerClient(metaclass=ABCMeta):
911
902
  If container has multiple networks, it will return the IP of the first
912
903
  """
913
904
 
914
- def get_image_cmd(self, docker_image: str, pull: bool = True) -> List[str]:
905
+ def get_image_cmd(self, docker_image: str, pull: bool = True) -> list[str]:
915
906
  """Get the command for the given image
916
907
  :param docker_image: Docker image to inspect
917
908
  :param pull: Whether to pull if image is not present
@@ -987,31 +978,31 @@ class ContainerClient(metaclass=ABCMeta):
987
978
  self,
988
979
  image_name: str,
989
980
  *,
990
- name: Optional[str] = None,
991
- entrypoint: Optional[Union[List[str], str]] = None,
981
+ name: str | None = None,
982
+ entrypoint: list[str] | str | None = None,
992
983
  remove: bool = False,
993
984
  interactive: bool = False,
994
985
  tty: bool = False,
995
986
  detach: bool = False,
996
- command: Optional[Union[List[str], str]] = None,
997
- volumes: Optional[Union[VolumeMappings, List[SimpleVolumeBind]]] = None,
998
- ports: Optional[PortMappings] = None,
999
- exposed_ports: Optional[List[str]] = None,
1000
- env_vars: Optional[Dict[str, str]] = None,
1001
- user: Optional[str] = None,
1002
- cap_add: Optional[List[str]] = None,
1003
- cap_drop: Optional[List[str]] = None,
1004
- security_opt: Optional[List[str]] = None,
1005
- network: Optional[str] = None,
1006
- dns: Optional[Union[str, List[str]]] = None,
1007
- additional_flags: Optional[str] = None,
1008
- workdir: Optional[str] = None,
1009
- privileged: Optional[bool] = None,
1010
- labels: Optional[Dict[str, str]] = None,
1011
- platform: Optional[DockerPlatform] = None,
1012
- ulimits: Optional[List[Ulimit]] = None,
1013
- init: Optional[bool] = None,
1014
- log_config: Optional[LogConfig] = None,
987
+ command: list[str] | str | None = None,
988
+ volumes: VolumeMappings | list[SimpleVolumeBind] | None = None,
989
+ ports: PortMappings | None = None,
990
+ exposed_ports: list[str] | None = None,
991
+ env_vars: dict[str, str] | None = None,
992
+ user: str | None = None,
993
+ cap_add: list[str] | None = None,
994
+ cap_drop: list[str] | None = None,
995
+ security_opt: list[str] | None = None,
996
+ network: str | None = None,
997
+ dns: str | list[str] | None = None,
998
+ additional_flags: str | None = None,
999
+ workdir: str | None = None,
1000
+ privileged: bool | None = None,
1001
+ labels: dict[str, str] | None = None,
1002
+ platform: DockerPlatform | None = None,
1003
+ ulimits: list[Ulimit] | None = None,
1004
+ init: bool | None = None,
1005
+ log_config: LogConfig | None = None,
1015
1006
  ) -> str:
1016
1007
  """Creates a container with the given image
1017
1008
 
@@ -1024,32 +1015,32 @@ class ContainerClient(metaclass=ABCMeta):
1024
1015
  image_name: str,
1025
1016
  stdin: bytes = None,
1026
1017
  *,
1027
- name: Optional[str] = None,
1028
- entrypoint: Optional[str] = None,
1018
+ name: str | None = None,
1019
+ entrypoint: str | None = None,
1029
1020
  remove: bool = False,
1030
1021
  interactive: bool = False,
1031
1022
  tty: bool = False,
1032
1023
  detach: bool = False,
1033
- command: Optional[Union[List[str], str]] = None,
1034
- volumes: Optional[Union[VolumeMappings, List[SimpleVolumeBind]]] = None,
1035
- ports: Optional[PortMappings] = None,
1036
- exposed_ports: Optional[List[str]] = None,
1037
- env_vars: Optional[Dict[str, str]] = None,
1038
- user: Optional[str] = None,
1039
- cap_add: Optional[List[str]] = None,
1040
- cap_drop: Optional[List[str]] = None,
1041
- security_opt: Optional[List[str]] = None,
1042
- network: Optional[str] = None,
1043
- dns: Optional[str] = None,
1044
- additional_flags: Optional[str] = None,
1045
- workdir: Optional[str] = None,
1046
- labels: Optional[Dict[str, str]] = None,
1047
- platform: Optional[DockerPlatform] = None,
1048
- privileged: Optional[bool] = None,
1049
- ulimits: Optional[List[Ulimit]] = None,
1050
- init: Optional[bool] = None,
1051
- log_config: Optional[LogConfig] = None,
1052
- ) -> Tuple[bytes, bytes]:
1024
+ command: list[str] | str | None = None,
1025
+ volumes: VolumeMappings | list[SimpleVolumeBind] | None = None,
1026
+ ports: PortMappings | None = None,
1027
+ exposed_ports: list[str] | None = None,
1028
+ env_vars: dict[str, str] | None = None,
1029
+ user: str | None = None,
1030
+ cap_add: list[str] | None = None,
1031
+ cap_drop: list[str] | None = None,
1032
+ security_opt: list[str] | None = None,
1033
+ network: str | None = None,
1034
+ dns: str | None = None,
1035
+ additional_flags: str | None = None,
1036
+ workdir: str | None = None,
1037
+ labels: dict[str, str] | None = None,
1038
+ platform: DockerPlatform | None = None,
1039
+ privileged: bool | None = None,
1040
+ ulimits: list[Ulimit] | None = None,
1041
+ init: bool | None = None,
1042
+ log_config: LogConfig | None = None,
1043
+ ) -> tuple[bytes, bytes]:
1053
1044
  """Creates and runs a given docker container
1054
1045
 
1055
1046
  :return: A tuple (stdout, stderr)
@@ -1057,7 +1048,7 @@ class ContainerClient(metaclass=ABCMeta):
1057
1048
 
1058
1049
  def run_container_from_config(
1059
1050
  self, container_config: ContainerConfiguration
1060
- ) -> Tuple[bytes, bytes]:
1051
+ ) -> tuple[bytes, bytes]:
1061
1052
  """Like ``run_container`` but uses the parameters from the configuration."""
1062
1053
 
1063
1054
  return self.run_container(
@@ -1093,14 +1084,14 @@ class ContainerClient(metaclass=ABCMeta):
1093
1084
  def exec_in_container(
1094
1085
  self,
1095
1086
  container_name_or_id: str,
1096
- command: Union[List[str], str],
1087
+ command: list[str] | str,
1097
1088
  interactive: bool = False,
1098
1089
  detach: bool = False,
1099
- env_vars: Optional[Dict[str, Optional[str]]] = None,
1100
- stdin: Optional[bytes] = None,
1101
- user: Optional[str] = None,
1102
- workdir: Optional[str] = None,
1103
- ) -> Tuple[bytes, bytes]:
1090
+ env_vars: dict[str, str | None] | None = None,
1091
+ stdin: bytes | None = None,
1092
+ user: str | None = None,
1093
+ workdir: str | None = None,
1094
+ ) -> tuple[bytes, bytes]:
1104
1095
  """Execute a given command in a container
1105
1096
 
1106
1097
  :return: A tuple (stdout, stderr)
@@ -1113,8 +1104,8 @@ class ContainerClient(metaclass=ABCMeta):
1113
1104
  stdin: bytes = None,
1114
1105
  interactive: bool = False,
1115
1106
  attach: bool = False,
1116
- flags: Optional[str] = None,
1117
- ) -> Tuple[bytes, bytes]:
1107
+ flags: str | None = None,
1108
+ ) -> tuple[bytes, bytes]:
1118
1109
  """Start a given, already created container
1119
1110
 
1120
1111
  :return: A tuple (stdout, stderr) if attach or interactive is set, otherwise a tuple (b"container_name_or_id", b"")
@@ -1127,7 +1118,7 @@ class ContainerClient(metaclass=ABCMeta):
1127
1118
  """
1128
1119
 
1129
1120
  @abstractmethod
1130
- def login(self, username: str, password: str, registry: Optional[str] = None) -> None:
1121
+ def login(self, username: str, password: str, registry: str | None = None) -> None:
1131
1122
  """
1132
1123
  Login into an OCI registry
1133
1124
 
@@ -1136,18 +1127,23 @@ class ContainerClient(metaclass=ABCMeta):
1136
1127
  :param registry: Registry url
1137
1128
  """
1138
1129
 
1130
+ def __get_container_names(self, return_all: bool) -> list[str]:
1131
+ result = self.list_containers(all=return_all)
1132
+ result = [container["name"] for container in result]
1133
+ return result
1134
+
1139
1135
 
1140
1136
  class Util:
1141
1137
  MAX_ENV_ARGS_LENGTH = 20000
1142
1138
 
1143
1139
  @staticmethod
1144
- def format_env_vars(key: str, value: Optional[str]):
1140
+ def format_env_vars(key: str, value: str | None):
1145
1141
  if value is None:
1146
1142
  return key
1147
1143
  return f"{key}={value}"
1148
1144
 
1149
1145
  @classmethod
1150
- def create_env_vars_file_flag(cls, env_vars: Dict) -> Tuple[List[str], Optional[str]]:
1146
+ def create_env_vars_file_flag(cls, env_vars: dict) -> tuple[list[str], str | None]:
1151
1147
  if not env_vars:
1152
1148
  return [], None
1153
1149
  result = []
@@ -1185,14 +1181,14 @@ class Util:
1185
1181
  return f
1186
1182
 
1187
1183
  @staticmethod
1188
- def append_without_latest(image_names: List[str]):
1184
+ def append_without_latest(image_names: list[str]):
1189
1185
  suffix = ":latest"
1190
1186
  for image in list(image_names):
1191
1187
  if image.endswith(suffix):
1192
1188
  image_names.append(image[: -len(suffix)])
1193
1189
 
1194
1190
  @staticmethod
1195
- def strip_wellknown_repo_prefixes(image_names: List[str]) -> List[str]:
1191
+ def strip_wellknown_repo_prefixes(image_names: list[str]) -> list[str]:
1196
1192
  """
1197
1193
  Remove well-known repo prefixes like `localhost/` or `docker.io/library/` from the list of given
1198
1194
  image names. This is mostly to ensure compatibility of our Docker client with Podman API responses.
@@ -1238,7 +1234,7 @@ class Util:
1238
1234
  LOG.debug("File to copy empty, ignoring...")
1239
1235
 
1240
1236
  @staticmethod
1241
- def _read_docker_cli_env_file(env_file: str) -> Dict[str, str]:
1237
+ def _read_docker_cli_env_file(env_file: str) -> dict[str, str]:
1242
1238
  """
1243
1239
  Read an environment file in docker CLI format, specified here:
1244
1240
  https://docs.docker.com/reference/cli/docker/container/run/#env
@@ -1247,7 +1243,7 @@ class Util:
1247
1243
  """
1248
1244
  env_vars = {}
1249
1245
  try:
1250
- with open(env_file, mode="rt") as f:
1246
+ with open(env_file) as f:
1251
1247
  env_file_lines = f.readlines()
1252
1248
  except FileNotFoundError as e:
1253
1249
  LOG.error(
@@ -1280,16 +1276,16 @@ class Util:
1280
1276
  @staticmethod
1281
1277
  def parse_additional_flags(
1282
1278
  additional_flags: str,
1283
- env_vars: Optional[Dict[str, str]] = None,
1284
- labels: Optional[Dict[str, str]] = None,
1285
- volumes: Optional[List[SimpleVolumeBind]] = None,
1286
- network: Optional[str] = None,
1287
- platform: Optional[DockerPlatform] = None,
1288
- ports: Optional[PortMappings] = None,
1289
- privileged: Optional[bool] = None,
1290
- user: Optional[str] = None,
1291
- ulimits: Optional[List[Ulimit]] = None,
1292
- dns: Optional[Union[str, List[str]]] = None,
1279
+ env_vars: dict[str, str] | None = None,
1280
+ labels: dict[str, str] | None = None,
1281
+ volumes: list[SimpleVolumeBind] | None = None,
1282
+ network: str | None = None,
1283
+ platform: DockerPlatform | None = None,
1284
+ ports: PortMappings | None = None,
1285
+ privileged: bool | None = None,
1286
+ user: str | None = None,
1287
+ ulimits: list[Ulimit] | None = None,
1288
+ dns: str | list[str] | None = None,
1293
1289
  ) -> DockerRunFlags:
1294
1290
  """Parses additional CLI-formatted Docker flags, which could overwrite provided defaults.
1295
1291
  :param additional_flags: String which contains the flag definitions inspired by the Docker CLI reference:
@@ -1510,8 +1506,8 @@ class Util:
1510
1506
 
1511
1507
  @staticmethod
1512
1508
  def convert_mount_list_to_dict(
1513
- volumes: Union[List[SimpleVolumeBind], VolumeMappings],
1514
- ) -> Dict[str, Dict[str, str]]:
1509
+ volumes: list[SimpleVolumeBind] | VolumeMappings,
1510
+ ) -> dict[str, dict[str, str]]:
1515
1511
  """Converts a List of (host_path, container_path) tuples to a Dict suitable as volume argument for docker sdk"""
1516
1512
 
1517
1513
  def _map_to_dict(paths: SimpleVolumeBind | BindMount | VolumeDirMount):