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,7 +6,8 @@ import os
6
6
  import re
7
7
  import textwrap
8
8
  import time
9
- from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple
9
+ from collections.abc import Callable
10
+ from typing import TYPE_CHECKING, Any, Unpack
10
11
 
11
12
  import botocore.auth
12
13
  import botocore.config
@@ -21,7 +22,8 @@ from pytest_httpserver import HTTPServer
21
22
  from werkzeug import Request, Response
22
23
 
23
24
  from localstack import config
24
- from localstack.aws.api.ec2 import CreateSecurityGroupRequest
25
+ from localstack.aws.api.cloudformation import CreateChangeSetInput, Parameter
26
+ from localstack.aws.api.ec2 import CreateSecurityGroupRequest, CreateVpcEndpointRequest, VpcEndpoint
25
27
  from localstack.aws.connect import ServiceLevelClientFactory
26
28
  from localstack.services.stores import (
27
29
  AccountRegionBundle,
@@ -231,7 +233,7 @@ def s3_create_bucket(s3_empty_bucket, aws_client):
231
233
 
232
234
  def factory(**kwargs) -> str:
233
235
  if "Bucket" not in kwargs:
234
- kwargs["Bucket"] = "test-bucket-%s" % short_uid()
236
+ kwargs["Bucket"] = f"test-bucket-{short_uid()}"
235
237
 
236
238
  if (
237
239
  "CreateBucketConfiguration" not in kwargs
@@ -334,7 +336,7 @@ def sqs_create_queue(aws_client):
334
336
 
335
337
  def factory(**kwargs):
336
338
  if "QueueName" not in kwargs:
337
- kwargs["QueueName"] = "test-queue-%s" % short_uid()
339
+ kwargs["QueueName"] = f"test-queue-{short_uid()}"
338
340
 
339
341
  response = aws_client.sqs.create_queue(**kwargs)
340
342
  url = response["QueueUrl"]
@@ -356,8 +358,8 @@ def sqs_create_queue(aws_client):
356
358
  def sqs_receive_messages_delete(aws_client):
357
359
  def factory(
358
360
  queue_url: str,
359
- expected_messages: Optional[int] = None,
360
- wait_time: Optional[int] = 5,
361
+ expected_messages: int | None = None,
362
+ wait_time: int | None = 5,
361
363
  ):
362
364
  response = aws_client.sqs.receive_message(
363
365
  QueueUrl=queue_url,
@@ -502,7 +504,7 @@ def sns_create_topic(aws_client):
502
504
 
503
505
  def _create_topic(**kwargs):
504
506
  if "Name" not in kwargs:
505
- kwargs["Name"] = "test-topic-%s" % short_uid()
507
+ kwargs["Name"] = f"test-topic-{short_uid()}"
506
508
  response = aws_client.sns.create_topic(**kwargs)
507
509
  topic_arns.append(response["TopicArn"])
508
510
  return response
@@ -593,7 +595,7 @@ def sns_allow_topic_sqs_queue(aws_client):
593
595
  def sns_create_sqs_subscription(sns_allow_topic_sqs_queue, sqs_get_queue_arn, aws_client):
594
596
  subscriptions = []
595
597
 
596
- def _factory(topic_arn: str, queue_url: str, **kwargs) -> Dict[str, str]:
598
+ def _factory(topic_arn: str, queue_url: str, **kwargs) -> dict[str, str]:
597
599
  queue_arn = sqs_get_queue_arn(queue_url)
598
600
 
599
601
  # connect sns topic to sqs
@@ -630,7 +632,7 @@ def sns_create_http_endpoint(sns_create_topic, sns_subscription, aws_client):
630
632
 
631
633
  def _create_http_endpoint(
632
634
  raw_message_delivery: bool = False,
633
- ) -> Tuple[str, str, str, HTTPServer]:
635
+ ) -> tuple[str, str, str, HTTPServer]:
634
636
  server = HTTPServer()
635
637
  server.start()
636
638
  http_servers.append(server)
@@ -705,7 +707,7 @@ def route53_hosted_zone(aws_client):
705
707
  def transcribe_create_job(s3_bucket, aws_client):
706
708
  job_names = []
707
709
 
708
- def _create_job(audio_file: str, params: Optional[dict[str, Any]] = None) -> str:
710
+ def _create_job(audio_file: str, params: dict[str, Any] | None = None) -> str:
709
711
  s3_key = "test-clip.wav"
710
712
 
711
713
  if not params:
@@ -1004,7 +1006,7 @@ def opensearch_document_path(opensearch_endpoint, aws_client):
1004
1006
  # Cleanup fixtures
1005
1007
  @pytest.fixture
1006
1008
  def cleanup_stacks(aws_client):
1007
- def _cleanup_stacks(stacks: List[str]) -> None:
1009
+ def _cleanup_stacks(stacks: list[str]) -> None:
1008
1010
  stacks = ensure_list(stacks)
1009
1011
  for stack in stacks:
1010
1012
  try:
@@ -1018,7 +1020,7 @@ def cleanup_stacks(aws_client):
1018
1020
 
1019
1021
  @pytest.fixture
1020
1022
  def cleanup_changesets(aws_client):
1021
- def _cleanup_changesets(changesets: List[str]) -> None:
1023
+ def _cleanup_changesets(changesets: list[str]) -> None:
1022
1024
  changesets = ensure_list(changesets)
1023
1025
  for cs in changesets:
1024
1026
  try:
@@ -1039,7 +1041,7 @@ class DeployResult:
1039
1041
  stack_id: str
1040
1042
  stack_name: str
1041
1043
  change_set_name: str
1042
- outputs: Dict[str, str]
1044
+ outputs: dict[str, str]
1043
1045
 
1044
1046
  destroy: Callable[[], None]
1045
1047
 
@@ -1084,17 +1086,18 @@ def deploy_cfn_template(
1084
1086
 
1085
1087
  def _deploy(
1086
1088
  *,
1087
- is_update: Optional[bool] = False,
1088
- stack_name: Optional[str] = None,
1089
- change_set_name: Optional[str] = None,
1090
- template: Optional[str] = None,
1091
- template_path: Optional[str | os.PathLike] = None,
1092
- template_mapping: Optional[Dict[str, Any]] = None,
1093
- parameters: Optional[Dict[str, str]] = None,
1094
- role_arn: Optional[str] = None,
1095
- max_wait: Optional[int] = None,
1096
- delay_between_polls: Optional[int] = 2,
1097
- custom_aws_client: Optional[ServiceLevelClientFactory] = None,
1089
+ is_update: bool | None = False,
1090
+ stack_name: str | None = None,
1091
+ change_set_name: str | None = None,
1092
+ template: str | None = None,
1093
+ template_path: str | os.PathLike | None = None,
1094
+ template_mapping: dict[str, Any] | None = None,
1095
+ parameters: dict[str, str] | None = None,
1096
+ role_arn: str | None = None,
1097
+ max_wait: int | None = None,
1098
+ delay_between_polls: int | None = 2,
1099
+ custom_aws_client: ServiceLevelClientFactory | None = None,
1100
+ raw_parameters: list[Parameter] | None = None,
1098
1101
  ) -> DeployResult:
1099
1102
  if is_update:
1100
1103
  assert stack_name
@@ -1110,20 +1113,21 @@ def deploy_cfn_template(
1110
1113
  raise RuntimeError(f"Could not find file {os.path.realpath(template_path)}")
1111
1114
  template_rendered = render_template(template, **(template_mapping or {}))
1112
1115
 
1113
- kwargs = dict(
1116
+ kwargs = CreateChangeSetInput(
1114
1117
  StackName=stack_name,
1115
1118
  ChangeSetName=change_set_name,
1116
1119
  TemplateBody=template_rendered,
1117
1120
  Capabilities=["CAPABILITY_AUTO_EXPAND", "CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"],
1118
1121
  ChangeSetType=("UPDATE" if is_update else "CREATE"),
1119
- Parameters=[
1120
- {
1121
- "ParameterKey": k,
1122
- "ParameterValue": v,
1123
- }
1124
- for (k, v) in (parameters or {}).items()
1125
- ],
1126
1122
  )
1123
+ kwargs["Parameters"] = []
1124
+ if parameters:
1125
+ kwargs["Parameters"] = [
1126
+ Parameter(ParameterKey=k, ParameterValue=v) for (k, v) in parameters.items()
1127
+ ]
1128
+ elif raw_parameters:
1129
+ kwargs["Parameters"] = raw_parameters
1130
+
1127
1131
  if role_arn is not None:
1128
1132
  kwargs["RoleARN"] = role_arn
1129
1133
 
@@ -1134,9 +1138,16 @@ def deploy_cfn_template(
1134
1138
  change_set_id = response["Id"]
1135
1139
  stack_id = response["StackId"]
1136
1140
 
1137
- cfn_aws_client.cloudformation.get_waiter(WAITER_CHANGE_SET_CREATE_COMPLETE).wait(
1138
- ChangeSetName=change_set_id
1139
- )
1141
+ try:
1142
+ cfn_aws_client.cloudformation.get_waiter(WAITER_CHANGE_SET_CREATE_COMPLETE).wait(
1143
+ ChangeSetName=change_set_id
1144
+ )
1145
+ except botocore.exceptions.WaiterError as e:
1146
+ change_set = cfn_aws_client.cloudformation.describe_change_set(
1147
+ ChangeSetName=change_set_id
1148
+ )
1149
+ raise Exception(f"{change_set['Status']}: {change_set.get('StatusReason')}") from e
1150
+
1140
1151
  cfn_aws_client.cloudformation.execute_change_set(ChangeSetName=change_set_id)
1141
1152
  stack_waiter = cfn_aws_client.cloudformation.get_waiter(
1142
1153
  WAITER_STACK_UPDATE_COMPLETE if is_update else WAITER_STACK_CREATE_COMPLETE
@@ -1238,7 +1249,7 @@ def is_stack_deleted(aws_client):
1238
1249
  return _has_stack_status(aws_client.cloudformation, ["DELETE_COMPLETE"])
1239
1250
 
1240
1251
 
1241
- def _has_stack_status(cfn_client, statuses: List[str]):
1252
+ def _has_stack_status(cfn_client, statuses: list[str]):
1242
1253
  def _has_status(stack_id: str):
1243
1254
  def _inner():
1244
1255
  resp = cfn_client.describe_stacks(StackName=stack_id)
@@ -1252,7 +1263,7 @@ def _has_stack_status(cfn_client, statuses: List[str]):
1252
1263
 
1253
1264
  @pytest.fixture
1254
1265
  def is_change_set_finished(aws_client):
1255
- def _is_change_set_finished(change_set_id: str, stack_name: Optional[str] = None):
1266
+ def _is_change_set_finished(change_set_id: str, stack_name: str | None = None):
1256
1267
  def _inner():
1257
1268
  kwargs = {"ChangeSetName": change_set_id}
1258
1269
  if stack_name:
@@ -1514,7 +1525,7 @@ def create_event_source_mapping(aws_client):
1514
1525
 
1515
1526
  @pytest.fixture
1516
1527
  def check_lambda_logs(aws_client):
1517
- def _check_logs(func_name: str, expected_lines: List[str] = None) -> List[str]:
1528
+ def _check_logs(func_name: str, expected_lines: list[str] = None) -> list[str]:
1518
1529
  if not expected_lines:
1519
1530
  expected_lines = []
1520
1531
  log_events = get_lambda_logs(func_name, logs_client=aws_client.logs)
@@ -1983,7 +1994,7 @@ def setup_sender_email_address(ses_verify_identity):
1983
1994
  email address and verify them.
1984
1995
  """
1985
1996
 
1986
- def inner(sender_email_address: Optional[str] = None) -> str:
1997
+ def inner(sender_email_address: str | None = None) -> str:
1987
1998
  if is_aws_cloud():
1988
1999
  if sender_email_address is None:
1989
2000
  raise ValueError(
@@ -2046,6 +2057,45 @@ def ec2_create_security_group(aws_client):
2046
2057
  LOG.debug("Error cleaning up EC2 security group: %s, %s", sg_group_id, e)
2047
2058
 
2048
2059
 
2060
+ @pytest.fixture
2061
+ def ec2_create_vpc_endpoint(aws_client):
2062
+ vpc_endpoints = []
2063
+
2064
+ def _create(**kwargs: Unpack[CreateVpcEndpointRequest]) -> VpcEndpoint:
2065
+ endpoint = aws_client.ec2.create_vpc_endpoint(**kwargs)
2066
+ endpoint_id = endpoint["VpcEndpoint"]["VpcEndpointId"]
2067
+ vpc_endpoints.append(endpoint_id)
2068
+
2069
+ def _check_available() -> VpcEndpoint:
2070
+ result = aws_client.ec2.describe_vpc_endpoints(VpcEndpointIds=[endpoint_id])
2071
+ _endpoint_details = result["VpcEndpoints"][0]
2072
+ assert _endpoint_details["State"] == "available"
2073
+
2074
+ return _endpoint_details
2075
+
2076
+ return retry(_check_available, retries=30, sleep=5 if is_aws_cloud() else 1)
2077
+
2078
+ yield _create
2079
+
2080
+ try:
2081
+ aws_client.ec2.delete_vpc_endpoints(VpcEndpointIds=vpc_endpoints)
2082
+ except Exception as e:
2083
+ LOG.error("Error cleaning up VPC endpoint: %s, %s", vpc_endpoints, e)
2084
+
2085
+ def wait_for_endpoint_deleted():
2086
+ try:
2087
+ endpoints = aws_client.ec2.describe_vpc_endpoints(VpcEndpointIds=vpc_endpoints)
2088
+ assert len(endpoints["VpcEndpoints"]) == 0 or all(
2089
+ endpoint["State"] == "Deleted" for endpoint in endpoints["VpcEndpoints"]
2090
+ )
2091
+ except botocore.exceptions.ClientError:
2092
+ pass
2093
+
2094
+ # the vpc can't be deleted if an endpoint exists
2095
+ if is_aws_cloud():
2096
+ retry(wait_for_endpoint_deleted, retries=30, sleep=10 if is_aws_cloud() else 1)
2097
+
2098
+
2049
2099
  @pytest.fixture
2050
2100
  def cleanups():
2051
2101
  cleanup_fns = []
@@ -2203,7 +2253,7 @@ def assert_host_customisation(monkeypatch):
2203
2253
  def asserter(
2204
2254
  url: str,
2205
2255
  *,
2206
- custom_host: Optional[str] = None,
2256
+ custom_host: str | None = None,
2207
2257
  ):
2208
2258
  if custom_host is not None:
2209
2259
  assert custom_host in url, f"Could not find `{custom_host}` in `{url}`"
@@ -2251,7 +2301,7 @@ def echo_http_server_post(echo_http_server):
2251
2301
  return f"{echo_http_server}post"
2252
2302
 
2253
2303
 
2254
- def create_policy_doc(effect: str, actions: List, resource=None) -> Dict:
2304
+ def create_policy_doc(effect: str, actions: list, resource=None) -> dict:
2255
2305
  actions = ensure_list(actions)
2256
2306
  resource = resource or "*"
2257
2307
  return {
@@ -2540,14 +2590,22 @@ def events_create_rule(aws_client):
2540
2590
 
2541
2591
  @pytest.fixture
2542
2592
  def sqs_as_events_target(aws_client, sqs_get_queue_arn):
2593
+ """
2594
+ Fixture that creates an SQS queue and sets it up as a target for EventBridge events.
2595
+ """
2543
2596
  queue_urls = []
2544
2597
 
2545
- def _sqs_as_events_target(queue_name: str | None = None) -> tuple[str, str]:
2598
+ def _sqs_as_events_target(
2599
+ queue_name: str | None = None, custom_aws_client=None
2600
+ ) -> tuple[str, str]:
2546
2601
  if not queue_name:
2547
2602
  queue_name = f"tests-queue-{short_uid()}"
2548
- sqs_client = aws_client.sqs
2603
+ if custom_aws_client:
2604
+ sqs_client = custom_aws_client.sqs
2605
+ else:
2606
+ sqs_client = aws_client.sqs
2549
2607
  queue_url = sqs_client.create_queue(QueueName=queue_name)["QueueUrl"]
2550
- queue_urls.append(queue_url)
2608
+ queue_urls.append((queue_url, sqs_client))
2551
2609
  queue_arn = sqs_get_queue_arn(queue_url)
2552
2610
  policy = {
2553
2611
  "Version": "2012-10-17",
@@ -2565,17 +2623,98 @@ def sqs_as_events_target(aws_client, sqs_get_queue_arn):
2565
2623
  sqs_client.set_queue_attributes(
2566
2624
  QueueUrl=queue_url, Attributes={"Policy": json.dumps(policy)}
2567
2625
  )
2568
- return queue_url, queue_arn
2626
+ return queue_url, queue_arn, queue_name
2569
2627
 
2570
2628
  yield _sqs_as_events_target
2571
2629
 
2572
- for queue_url in queue_urls:
2630
+ for queue_url, sqs_client in queue_urls:
2573
2631
  try:
2574
- aws_client.sqs.delete_queue(QueueUrl=queue_url)
2632
+ sqs_client.delete_queue(QueueUrl=queue_url)
2575
2633
  except Exception as e:
2576
2634
  LOG.debug("error cleaning up queue %s: %s", queue_url, e)
2577
2635
 
2578
2636
 
2637
+ @pytest.fixture
2638
+ def create_role_event_bus_source_to_bus_target(create_iam_role_with_policy):
2639
+ def _create_role_event_bus_to_bus():
2640
+ assume_role_policy_document_bus_source_to_bus_target = {
2641
+ "Version": "2012-10-17",
2642
+ "Statement": [
2643
+ {
2644
+ "Effect": "Allow",
2645
+ "Principal": {"Service": "events.amazonaws.com"},
2646
+ "Action": "sts:AssumeRole",
2647
+ }
2648
+ ],
2649
+ }
2650
+
2651
+ policy_document_bus_source_to_bus_target = {
2652
+ "Version": "2012-10-17",
2653
+ "Statement": [
2654
+ {
2655
+ "Sid": "",
2656
+ "Effect": "Allow",
2657
+ "Action": "events:PutEvents",
2658
+ "Resource": "arn:aws:events:*:*:event-bus/*",
2659
+ }
2660
+ ],
2661
+ }
2662
+
2663
+ role_arn_bus_source_to_bus_target = create_iam_role_with_policy(
2664
+ RoleDefinition=assume_role_policy_document_bus_source_to_bus_target,
2665
+ PolicyDefinition=policy_document_bus_source_to_bus_target,
2666
+ )
2667
+
2668
+ return role_arn_bus_source_to_bus_target
2669
+
2670
+ yield _create_role_event_bus_to_bus
2671
+
2672
+
2673
+ @pytest.fixture
2674
+ def get_primary_secondary_client(
2675
+ aws_client_factory,
2676
+ secondary_aws_client_factory,
2677
+ region_name,
2678
+ secondary_region_name,
2679
+ account_id,
2680
+ secondary_account_id,
2681
+ ):
2682
+ def _get_primary_secondary_clients(cross_scenario: str):
2683
+ """
2684
+ Returns primary and secondary AWS clients based on the cross-scenario.
2685
+ :param cross_scenario: The scenario for cross-region or cross-account testing.
2686
+ Options: "region", "account", "region_account"
2687
+ account_region cross scenario is not supported by AWS
2688
+ :return: A dictionary containing primary and secondary AWS clients, and their respective region and account IDs.
2689
+ """
2690
+ secondary_region = secondary_region_name
2691
+ secondary_account = secondary_account_id
2692
+ if cross_scenario not in ["region", "account", "region_account"]:
2693
+ raise ValueError(f"cross_scenario {cross_scenario} not supported")
2694
+
2695
+ primary_client = aws_client_factory(region_name=region_name)
2696
+
2697
+ if cross_scenario == "region":
2698
+ secondary_account = account_id
2699
+ secondary_client = aws_client_factory(region_name=secondary_region_name)
2700
+
2701
+ elif cross_scenario == "account":
2702
+ secondary_region = region_name
2703
+ secondary_client = secondary_aws_client_factory(region_name=region_name)
2704
+
2705
+ elif cross_scenario == "region_account":
2706
+ secondary_client = secondary_aws_client_factory(region_name=secondary_region)
2707
+
2708
+ return {
2709
+ "primary_aws_client": primary_client,
2710
+ "secondary_aws_client": secondary_client,
2711
+ "secondary_region_name": secondary_region,
2712
+ "secondary_account_id": secondary_account,
2713
+ }
2714
+
2715
+ return _get_primary_secondary_clients
2716
+
2717
+
2579
2718
  @pytest.fixture
2580
2719
  def clean_up(
2581
2720
  aws_client,
@@ -2598,10 +2737,10 @@ def clean_up(
2598
2737
  if rule_name:
2599
2738
  call_safe(events_client.delete_rule, kwargs=dict(Name=rule_name, Force=True, **kwargs))
2600
2739
  if bus_name:
2601
- call_safe(events_client.delete_event_bus, kwargs=dict(Name=bus_name))
2740
+ call_safe(events_client.delete_event_bus, kwargs={"Name": bus_name})
2602
2741
  if queue_url:
2603
2742
  sqs_client = aws_client.sqs
2604
- call_safe(sqs_client.delete_queue, kwargs=dict(QueueUrl=queue_url))
2743
+ call_safe(sqs_client.delete_queue, kwargs={"QueueUrl": queue_url})
2605
2744
  if log_group_name:
2606
2745
  logs_client = aws_client.logs
2607
2746
 
@@ -63,15 +63,13 @@ def pytest_runtestloop(session: Session):
63
63
  return
64
64
  LOG.info("TEST_FORCE_LOCALSTACK_START is set, a Localstack instance will be created.")
65
65
 
66
- from localstack.utils.common import safe_requests
67
-
68
66
  if is_aws_cloud():
69
67
  localstack_config.DEFAULT_DELAY = 5
70
68
  localstack_config.DEFAULT_MAX_ATTEMPTS = 60
71
69
 
72
70
  # configure
73
71
  os.environ[ENV_INTERNAL_TEST_RUN] = "1"
74
- safe_requests.verify_ssl = False
72
+ localstack_config.INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE = True
75
73
 
76
74
  from localstack.runtime import current
77
75
 
@@ -3,7 +3,8 @@ Custom pytest mark typings
3
3
  """
4
4
 
5
5
  import os
6
- from typing import TYPE_CHECKING, Callable, List, Optional
6
+ from collections.abc import Callable
7
+ from typing import TYPE_CHECKING
7
8
 
8
9
  import pytest
9
10
  from _pytest.config import PytestPluginManager
@@ -36,13 +37,13 @@ class SkipSnapshotVerifyMarker:
36
37
  def __call__(
37
38
  self,
38
39
  *,
39
- paths: "Optional[List[str]]" = None,
40
- condition: "Optional[Callable[[...], bool]]" = None,
40
+ paths: "list[str] | None" = None,
41
+ condition: "Callable[[...], bool] | None" = None,
41
42
  ): ...
42
43
 
43
44
 
44
45
  class MultiRuntimeMarker:
45
- def __call__(self, *, scenario: str, runtimes: Optional[List[str]] = None): ...
46
+ def __call__(self, *, scenario: str, runtimes: list[str] | None = None): ...
46
47
 
47
48
 
48
49
  class SnapshotMarkers:
@@ -58,13 +59,27 @@ class Markers:
58
59
 
59
60
  # test selection
60
61
  acceptance_test = pytest.mark.acceptance_test
62
+ """This test is an acceptance test"""
61
63
  skip_offline = pytest.mark.skip_offline
64
+ """Test is skipped if offline, as it requires some sort of internet connection to run"""
62
65
  only_on_amd64 = pytest.mark.only_on_amd64
66
+ """Test requires ability of the system to execute amd64 binaries"""
63
67
  only_on_arm64 = pytest.mark.only_on_arm64
68
+ """Test requires ability of the system to execute arm64 binaries"""
64
69
  resource_heavy = pytest.mark.resource_heavy
65
- only_in_docker = pytest.mark.only_in_docker
66
- # Tests to execute when updating snapshots for a new Lambda runtime
70
+ """Test is very resource heavy, and might be skipped in CI"""
71
+ requires_in_container = pytest.mark.requires_in_container
72
+ """Test requires LocalStack to run inside a container"""
73
+ requires_in_process = pytest.mark.requires_in_process
74
+ """The test and the LS instance have to be run in the same process"""
75
+ requires_docker = pytest.mark.requires_docker
76
+ """The test requires docker or a compatible container engine - will not work on kubernetes"""
67
77
  lambda_runtime_update = pytest.mark.lambda_runtime_update
78
+ """Tests to execute when updating snapshots for a new Lambda runtime"""
79
+ k8s_always_run = pytest.mark.k8s_always_run
80
+ """This tests will always run against k8s environment"""
81
+ skip_k8s = pytest.mark.skip_k8s
82
+ """This test will be skipped in k8s environment"""
68
83
 
69
84
 
70
85
  # pytest plugin
@@ -82,7 +97,7 @@ def pytest_addoption(parser: Parser, pluginmanager: PytestPluginManager):
82
97
  )
83
98
 
84
99
 
85
- def enforce_single_aws_marker(items: List[pytest.Item]):
100
+ def enforce_single_aws_marker(items: list[pytest.Item]):
86
101
  """Enforce that each test has exactly one aws compatibility marker"""
87
102
  marker_errors = []
88
103
 
@@ -91,7 +106,7 @@ def enforce_single_aws_marker(items: List[pytest.Item]):
91
106
  if "tests/aws" not in item.fspath.dirname:
92
107
  continue
93
108
 
94
- aws_markers = list()
109
+ aws_markers = []
95
110
  for mark in item.iter_markers():
96
111
  if mark.name.startswith("aws_"):
97
112
  aws_markers.append(mark.name)
@@ -107,7 +122,7 @@ def enforce_single_aws_marker(items: List[pytest.Item]):
107
122
  raise pytest.UsageError(*marker_errors)
108
123
 
109
124
 
110
- def filter_by_markers(config: "Config", items: List[pytest.Item]):
125
+ def filter_by_markers(config: "Config", items: list[pytest.Item]):
111
126
  """Filter tests by markers."""
112
127
  from localstack import config as localstack_config
113
128
  from localstack.utils.bootstrap import in_ci
@@ -131,8 +146,8 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
131
146
  "Add network connectivity and remove the --offline option when running "
132
147
  "the test."
133
148
  )
134
- only_in_docker = pytest.mark.skip(
135
- reason="Test requires execution inside Docker (e.g., to install system packages)"
149
+ requires_in_container = pytest.mark.skip(
150
+ reason="Test requires execution inside a container (e.g., to install system packages)"
136
151
  )
137
152
  only_on_amd64 = pytest.mark.skip(
138
153
  reason="Test uses features that are currently only supported for AMD64. Skipping in CI."
@@ -144,8 +159,8 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
144
159
  for item in items:
145
160
  if is_offline and "skip_offline" in item.keywords:
146
161
  item.add_marker(skip_offline)
147
- if not is_in_docker and "only_in_docker" in item.keywords:
148
- item.add_marker(only_in_docker)
162
+ if not is_in_docker and "requires_in_container" in item.keywords:
163
+ item.add_marker(requires_in_container)
149
164
  if is_in_ci and not is_amd64 and "only_on_amd64" in item.keywords:
150
165
  item.add_marker(only_on_amd64)
151
166
  if is_in_ci and not is_arm64 and "only_on_arm64" in item.keywords:
@@ -154,7 +169,7 @@ def filter_by_markers(config: "Config", items: List[pytest.Item]):
154
169
 
155
170
  @pytest.hookimpl
156
171
  def pytest_collection_modifyitems(
157
- session: pytest.Session, config: "Config", items: List[pytest.Item]
172
+ session: pytest.Session, config: "Config", items: list[pytest.Item]
158
173
  ) -> None:
159
174
  enforce_single_aws_marker(items)
160
175
  filter_by_markers(config, items)
@@ -177,7 +192,7 @@ def pytest_configure(config):
177
192
  )
178
193
  config.addinivalue_line(
179
194
  "markers",
180
- "only_in_docker: mark the test as running only in Docker (e.g., requires installation of system packages)",
195
+ "requires_in_container: mark the test as running only in a container (e.g., requires installation of system packages)",
181
196
  )
182
197
  config.addinivalue_line(
183
198
  "markers",
@@ -208,3 +223,15 @@ def pytest_configure(config):
208
223
  "markers",
209
224
  "multiruntime: parametrize test against multiple Lambda runtimes",
210
225
  )
226
+ config.addinivalue_line(
227
+ "markers",
228
+ "requires_docker: mark the test as requiring docker (or a compatible container engine) - will not work on kubernetes.",
229
+ )
230
+ config.addinivalue_line(
231
+ "markers",
232
+ "requires_in_process: mark the test as requiring the test to run inside the same process as LocalStack - will not work if tests are run against a running LS container.",
233
+ )
234
+ config.addinivalue_line(
235
+ "markers",
236
+ "k8s_always_run: mark the test to always run in k8s environment. This allows us to run tests that would otherwise be skipped, such as localstack_only tests.",
237
+ )
@@ -49,7 +49,7 @@ def pytest_collection_modifyitems(config, items):
49
49
  if not os.path.exists(pathfilter_file):
50
50
  raise ValueError(f"Pathfilter file does not exist: {pathfilter_file}")
51
51
 
52
- with open(pathfilter_file, "r") as f:
52
+ with open(pathfilter_file) as f:
53
53
  pathfilter_substrings = [line.strip() for line in f.readlines() if line.strip()]
54
54
 
55
55
  if not pathfilter_substrings:
@@ -271,7 +271,7 @@ def create_state_machine_iam_role(cleanups, create_state_machine):
271
271
 
272
272
  @pytest.fixture
273
273
  def create_state_machine():
274
- created_state_machine_references = list()
274
+ created_state_machine_references = []
275
275
 
276
276
  def _create_state_machine(target_aws_client, **kwargs):
277
277
  sfn_client = target_aws_client.stepfunctions
@@ -299,7 +299,7 @@ def create_state_machine():
299
299
 
300
300
  @pytest.fixture
301
301
  def create_state_machine_alias():
302
- state_machine_alias_arn_and_client = list()
302
+ state_machine_alias_arn_and_client = []
303
303
 
304
304
  def _create_state_machine_alias(target_aws_client, **kwargs):
305
305
  step_functions_client = target_aws_client.stepfunctions
@@ -324,7 +324,7 @@ def create_state_machine_alias():
324
324
 
325
325
  @pytest.fixture
326
326
  def create_activity(aws_client):
327
- activities_arns: Final[list[str]] = list()
327
+ activities_arns: Final[list[str]] = []
328
328
 
329
329
  def _create_activity(**kwargs):
330
330
  create_output = aws_client.stepfunctions.create_activity(**kwargs)
@@ -778,7 +778,7 @@ def sfn_create_log_group(aws_client, snapshot):
778
778
 
779
779
  @pytest.fixture
780
780
  def create_cross_account_admin_role_and_policy(create_state_machine, create_state_machine_iam_role):
781
- created = list()
781
+ created = []
782
782
 
783
783
  def _create_role_and_policy(trusting_aws_client, trusted_aws_client, trusted_account_id) -> str:
784
784
  trusting_iam_client = trusting_aws_client.iam