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
localstack/config.py CHANGED
@@ -9,7 +9,8 @@ import tempfile
9
9
  import time
10
10
  import warnings
11
11
  from collections import defaultdict
12
- from typing import Any, Dict, List, Mapping, Optional, Tuple, TypeVar, Union
12
+ from collections.abc import Mapping
13
+ from typing import Any, TypeVar
13
14
 
14
15
  from localstack import constants
15
16
  from localstack.constants import (
@@ -18,6 +19,7 @@ from localstack.constants import (
18
19
  DEFAULT_VOLUME_DIR,
19
20
  ENV_INTERNAL_TEST_COLLECT_METRIC,
20
21
  ENV_INTERNAL_TEST_RUN,
22
+ ENV_INTERNAL_TEST_STORE_METRICS_IN_LOCALSTACK,
21
23
  FALSE_STRINGS,
22
24
  LOCALHOST,
23
25
  LOCALHOST_IP,
@@ -207,13 +209,13 @@ class Directories:
207
209
  return str(self.__dict__)
208
210
 
209
211
 
210
- def eval_log_type(env_var_name: str) -> Union[str, bool]:
212
+ def eval_log_type(env_var_name: str) -> str | bool:
211
213
  """Get the log type from environment variable"""
212
214
  ls_log = os.environ.get(env_var_name, "").lower().strip()
213
215
  return ls_log if ls_log in LOG_LEVELS else False
214
216
 
215
217
 
216
- def parse_boolean_env(env_var_name: str) -> Optional[bool]:
218
+ def parse_boolean_env(env_var_name: str) -> bool | None:
217
219
  """Parse the value of the given env variable and return True/False, or None if it is not a boolean value."""
218
220
  value = os.environ.get(env_var_name, "").lower().strip()
219
221
  if value in TRUE_STRINGS:
@@ -233,7 +235,7 @@ def is_env_not_false(env_var_name: str) -> bool:
233
235
  return os.environ.get(env_var_name, "").lower().strip() not in FALSE_STRINGS
234
236
 
235
237
 
236
- def load_environment(profiles: str = None, env=os.environ) -> List[str]:
238
+ def load_environment(profiles: str = None, env=os.environ) -> list[str]:
237
239
  """Loads the environment variables from ~/.localstack/{profile}.env, for each profile listed in the profiles.
238
240
  :param env: environment to load profile to. Defaults to `os.environ`
239
241
  :param profiles: a comma separated list of profiles to load (defaults to "default")
@@ -285,7 +287,7 @@ def ping(host):
285
287
  """Returns True if the host responds to a ping request"""
286
288
  is_in_windows = is_windows()
287
289
  ping_opts = "-n 1 -w 2000" if is_in_windows else "-c 1 -W 2"
288
- args = "ping %s %s" % (ping_opts, host)
290
+ args = f"ping {ping_opts} {host}"
289
291
  return (
290
292
  subprocess.call(
291
293
  args, shell=not is_in_windows, stdout=subprocess.PIPE, stderr=subprocess.PIPE
@@ -337,7 +339,7 @@ def in_docker():
337
339
  return False
338
340
  except Exception:
339
341
  pass
340
- with open("/proc/1/cgroup", "rt") as ifh:
342
+ with open("/proc/1/cgroup") as ifh:
341
343
  content = ifh.read()
342
344
  if "docker" in content or "buildkit" in content:
343
345
  return True
@@ -348,7 +350,7 @@ def in_docker():
348
350
  # containerd does not set any specific file or config, but it does use
349
351
  # io.containerd.snapshotter.v1.overlayfs as the overlay filesystem for `/`.
350
352
  try:
351
- with open("/proc/mounts", "rt") as infile:
353
+ with open("/proc/mounts") as infile:
352
354
  for line in infile:
353
355
  line = line.strip()
354
356
 
@@ -434,8 +436,8 @@ TMP_FOLDER = os.path.join(tempfile.gettempdir(), "localstack")
434
436
  VOLUME_DIR = os.environ.get("LOCALSTACK_VOLUME_DIR", "").strip() or TMP_FOLDER
435
437
 
436
438
  # fix for Mac OS, to be able to mount /var/folders in Docker
437
- if TMP_FOLDER.startswith("/var/folders/") and os.path.exists("/private%s" % TMP_FOLDER):
438
- TMP_FOLDER = "/private%s" % TMP_FOLDER
439
+ if TMP_FOLDER.startswith("/var/folders/") and os.path.exists(f"/private{TMP_FOLDER}"):
440
+ TMP_FOLDER = f"/private{TMP_FOLDER}"
439
441
 
440
442
  # whether to enable verbose debug logging ("LOG" is used when using the CLI with LOCALSTACK_LOG instead of LS_LOG)
441
443
  LS_LOG = eval_log_type("LS_LOG") or eval_log_type("LOG")
@@ -603,9 +605,7 @@ class HostAndPort:
603
605
 
604
606
  def _get_unprivileged_port_range_start(self) -> int:
605
607
  try:
606
- with open(
607
- "/proc/sys/net/ipv4/ip_unprivileged_port_start", "rt"
608
- ) as unprivileged_port_start:
608
+ with open("/proc/sys/net/ipv4/ip_unprivileged_port_start") as unprivileged_port_start:
609
609
  port = unprivileged_port_start.read()
610
610
  return int(port.strip())
611
611
  except Exception:
@@ -637,7 +637,7 @@ class HostAndPort:
637
637
  return f"HostAndPort(host={self.host}, port={self.port})"
638
638
 
639
639
 
640
- class UniqueHostAndPortList(List[HostAndPort]):
640
+ class UniqueHostAndPortList(list[HostAndPort]):
641
641
  """
642
642
  Container type that ensures that ports added to the list are unique based
643
643
  on these rules:
@@ -650,7 +650,7 @@ class UniqueHostAndPortList(List[HostAndPort]):
650
650
  - Identical identical hosts and ports are de-duped
651
651
  """
652
652
 
653
- def __init__(self, iterable: Union[List[HostAndPort], None] = None):
653
+ def __init__(self, iterable: list[HostAndPort] | None = None):
654
654
  super().__init__(iterable or [])
655
655
  self._ensure_unique()
656
656
 
@@ -661,10 +661,10 @@ class UniqueHostAndPortList(List[HostAndPort]):
661
661
  if len(self) <= 1:
662
662
  return
663
663
 
664
- unique: List[HostAndPort] = list()
664
+ unique: list[HostAndPort] = []
665
665
 
666
666
  # Build a dictionary of hosts by port
667
- hosts_by_port: Dict[int, List[str]] = defaultdict(list)
667
+ hosts_by_port: dict[int, list[str]] = defaultdict(list)
668
668
  for item in self:
669
669
  hosts_by_port[item.port].append(item.host)
670
670
 
@@ -696,7 +696,7 @@ class UniqueHostAndPortList(List[HostAndPort]):
696
696
 
697
697
  def populate_edge_configuration(
698
698
  environment: Mapping[str, str],
699
- ) -> Tuple[HostAndPort, UniqueHostAndPortList]:
699
+ ) -> tuple[HostAndPort, UniqueHostAndPortList]:
700
700
  """Populate the LocalStack edge configuration from environment variables."""
701
701
  localstack_host_raw = environment.get("LOCALSTACK_HOST")
702
702
  gateway_listen_raw = environment.get("GATEWAY_LISTEN")
@@ -824,6 +824,9 @@ OPENAPI_VALIDATE_RESPONSE = is_env_true("OPENAPI_VALIDATE_RESPONSE")
824
824
  # Flag to enable the validation of the requests made to the LocalStack internal endpoints. Active by default.
825
825
  OPENAPI_VALIDATE_REQUEST = is_env_true("OPENAPI_VALIDATE_REQUEST")
826
826
 
827
+ # environment variable to determine whether to include stack traces in http responses
828
+ INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE = is_env_true("INCLUDE_STACK_TRACES_IN_HTTP_RESPONSE")
829
+
827
830
  # whether to skip waiting for the infrastructure to shut down, or exit immediately
828
831
  FORCE_SHUTDOWN = is_env_not_false("FORCE_SHUTDOWN")
829
832
 
@@ -1182,6 +1185,8 @@ elif _override_dynamodb_v2 == "v2":
1182
1185
  os.environ["PROVIDER_OVERRIDE_DYNAMODBSTREAMS"] = "v2"
1183
1186
  DDB_STREAMS_PROVIDER_V2 = True
1184
1187
 
1188
+ SNS_PROVIDER_V2 = os.environ.get("PROVIDER_OVERRIDE_SNS", "") == "v2"
1189
+
1185
1190
  # TODO remove fallback to LAMBDA_DOCKER_NETWORK with next minor version
1186
1191
  MAIN_DOCKER_NETWORK = os.environ.get("MAIN_DOCKER_NETWORK", "") or LAMBDA_DOCKER_NETWORK
1187
1192
 
@@ -1235,8 +1240,8 @@ def use_custom_dns():
1235
1240
 
1236
1241
 
1237
1242
  # s3 virtual host name
1238
- S3_VIRTUAL_HOSTNAME = "s3.%s" % LOCALSTACK_HOST.host
1239
- S3_STATIC_WEBSITE_HOSTNAME = "s3-website.%s" % LOCALSTACK_HOST.host
1243
+ S3_VIRTUAL_HOSTNAME = f"s3.{LOCALSTACK_HOST.host}"
1244
+ S3_STATIC_WEBSITE_HOSTNAME = f"s3-website.{LOCALSTACK_HOST.host}"
1240
1245
 
1241
1246
  BOTO_WAITER_DELAY = int(os.environ.get("BOTO_WAITER_DELAY") or "1")
1242
1247
  BOTO_WAITER_MAX_ATTEMPTS = int(os.environ.get("BOTO_WAITER_MAX_ATTEMPTS") or "120")
@@ -1254,6 +1259,9 @@ IN_MEMORY_CLIENT = is_env_true("IN_MEMORY_CLIENT")
1254
1259
  # This flag enables all responses from LocalStack to contain a `x-localstack` HTTP header.
1255
1260
  LOCALSTACK_RESPONSE_HEADER_ENABLED = is_env_not_false("LOCALSTACK_RESPONSE_HEADER_ENABLED")
1256
1261
 
1262
+ # Serialization backend for the LocalStack internal state (`dill` is used by default`).
1263
+ STATE_SERIALIZATION_BACKEND = os.environ.get("STATE_SERIALIZATION_BACKEND", "").strip() or "dill"
1264
+
1257
1265
  # List of environment variable names used for configuration that are passed from the host into the LocalStack container.
1258
1266
  # => Synchronize this list with the above and the configuration docs:
1259
1267
  # https://docs.localstack.cloud/references/configuration/
@@ -1390,6 +1398,7 @@ CONFIG_ENV_VARS = [
1390
1398
  "SQS_ENDPOINT_STRATEGY",
1391
1399
  "SQS_DISABLE_CLOUDWATCH_METRICS",
1392
1400
  "SQS_CLOUDWATCH_METRICS_REPORT_INTERVAL",
1401
+ "STATE_SERIALIZATION_BACKEND",
1393
1402
  "STRICT_SERVICE_LOADING",
1394
1403
  "TF_COMPAT_MODE",
1395
1404
  "USE_SSL",
@@ -1443,7 +1452,12 @@ def is_collect_metrics_mode() -> bool:
1443
1452
  return is_env_true(ENV_INTERNAL_TEST_COLLECT_METRIC)
1444
1453
 
1445
1454
 
1446
- def collect_config_items() -> List[Tuple[str, Any]]:
1455
+ def store_test_metrics_in_local_filesystem() -> bool:
1456
+ """Returns True if test metrics should be stored in the local filesystem (instead of the system that runs pytest)."""
1457
+ return is_env_true(ENV_INTERNAL_TEST_STORE_METRICS_IN_LOCALSTACK)
1458
+
1459
+
1460
+ def collect_config_items() -> list[tuple[str, Any]]:
1447
1461
  """Returns a list of key-value tuples of LocalStack configuration values."""
1448
1462
  none = object() # sentinel object
1449
1463
 
@@ -1495,10 +1509,10 @@ def get_protocol() -> str:
1495
1509
 
1496
1510
 
1497
1511
  def external_service_url(
1498
- host: Optional[str] = None,
1499
- port: Optional[int] = None,
1500
- protocol: Optional[str] = None,
1501
- subdomains: Optional[str] = None,
1512
+ host: str | None = None,
1513
+ port: int | None = None,
1514
+ protocol: str | None = None,
1515
+ subdomains: str | None = None,
1502
1516
  ) -> str:
1503
1517
  """Returns a service URL (e.g., SQS queue URL) to an external client (e.g., boto3) potentially running on another
1504
1518
  machine than LocalStack. The configurations LOCALSTACK_HOST and USE_SSL can customize these returned URLs.
@@ -1515,10 +1529,10 @@ def external_service_url(
1515
1529
 
1516
1530
 
1517
1531
  def internal_service_url(
1518
- host: Optional[str] = None,
1519
- port: Optional[int] = None,
1520
- protocol: Optional[str] = None,
1521
- subdomains: Optional[str] = None,
1532
+ host: str | None = None,
1533
+ port: int | None = None,
1534
+ protocol: str | None = None,
1535
+ subdomains: str | None = None,
1522
1536
  ) -> str:
1523
1537
  """Returns a service URL for internal use within LocalStack (i.e., same host).
1524
1538
  The configuration USE_SSL can customize these returned URLs but LOCALSTACK_HOST has no effect.
@@ -1593,7 +1607,7 @@ def get_edge_url(localstack_hostname=None, protocol=None):
1593
1607
 
1594
1608
 
1595
1609
  class ServiceProviderConfig(Mapping[str, str]):
1596
- _provider_config: Dict[str, str]
1610
+ _provider_config: dict[str, str]
1597
1611
  default_value: str
1598
1612
  override_prefix: str = "PROVIDER_OVERRIDE_"
1599
1613
 
@@ -1618,7 +1632,7 @@ class ServiceProviderConfig(Mapping[str, str]):
1618
1632
  def set_provider(self, service: str, provider: str):
1619
1633
  self._provider_config[service] = provider
1620
1634
 
1621
- def bulk_set_provider_if_not_exists(self, services: List[str], provider: str):
1635
+ def bulk_set_provider_if_not_exists(self, services: list[str], provider: str):
1622
1636
  for service in services:
1623
1637
  self.set_provider_if_not_exists(service, provider)
1624
1638
 
localstack/constants.py CHANGED
@@ -80,6 +80,10 @@ ENV_INTERNAL_TEST_RUN = "LOCALSTACK_INTERNAL_TEST_RUN"
80
80
  # environment variable name to tag collect metrics during a test run
81
81
  ENV_INTERNAL_TEST_COLLECT_METRIC = "LOCALSTACK_INTERNAL_TEST_COLLECT_METRIC"
82
82
 
83
+ # environment variable name to indicate that metrics should be stored within the container
84
+ ENV_INTERNAL_TEST_STORE_METRICS_IN_LOCALSTACK = "LOCALSTACK_INTERNAL_TEST_METRICS_IN_LOCALSTACK"
85
+ ENV_INTERNAL_TEST_STORE_METRICS_PATH = "LOCALSTACK_INTERNAL_TEST_STORE_METRICS_PATH"
86
+
83
87
  # environment variable that flags whether pro was activated. do not use it for security purposes!
84
88
  ENV_PRO_ACTIVATED = "PRO_ACTIVATED"
85
89
 
@@ -102,32 +106,6 @@ FALSE_STRINGS = ("0", "false", "False")
102
106
  # strings with valid log levels for LS_LOG
103
107
  LOG_LEVELS = ("trace-internal", "trace", "debug", "info", "warn", "error", "warning")
104
108
 
105
- # the version of elasticsearch that is pre-seeded into the base image (sync with Dockerfile.base)
106
- ELASTICSEARCH_DEFAULT_VERSION = "Elasticsearch_7.10"
107
- # See https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/aes-supported-plugins.html
108
- ELASTICSEARCH_PLUGIN_LIST = [
109
- "analysis-icu",
110
- "ingest-attachment",
111
- "analysis-kuromoji",
112
- "mapper-murmur3",
113
- "mapper-size",
114
- "analysis-phonetic",
115
- "analysis-smartcn",
116
- "analysis-stempel",
117
- "analysis-ukrainian",
118
- ]
119
- # Default ES modules to exclude (save apprx 66MB in the final image)
120
- ELASTICSEARCH_DELETE_MODULES = ["ingest-geoip"]
121
-
122
- # the version of opensearch which is used by default
123
- OPENSEARCH_DEFAULT_VERSION = "OpenSearch_2.11"
124
-
125
- # See https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-plugins.html
126
- OPENSEARCH_PLUGIN_LIST = [
127
- "ingest-attachment",
128
- "analysis-kuromoji",
129
- ]
130
-
131
109
  # API endpoint for analytics events
132
110
  API_ENDPOINT = os.environ.get("API_ENDPOINT") or "https://api.localstack.cloud/v1"
133
111
  # new analytics API endpoint
@@ -171,9 +149,6 @@ DEFAULT_DEVELOP_PORT = 5678
171
149
  DEFAULT_BUCKET_MARKER_LOCAL = "hot-reload"
172
150
  LEGACY_DEFAULT_BUCKET_MARKER_LOCAL = "__local__"
173
151
 
174
- # user that starts the opensearch process if the current user is root
175
- OS_USER_OPENSEARCH = "localstack"
176
-
177
152
  # output string that indicates that the stack is ready
178
153
  READY_MARKER_OUTPUT = "Ready."
179
154
 
@@ -1,8 +1,8 @@
1
1
  # A simple module to track deprecations over time / versions, and some simple functions guiding the affected users.
2
2
  import logging
3
3
  import os
4
+ from collections.abc import Callable
4
5
  from dataclasses import dataclass
5
- from typing import Callable, List, Optional
6
6
 
7
7
  from localstack.utils.analytics import log
8
8
 
@@ -329,8 +329,8 @@ DEPRECATIONS = [
329
329
 
330
330
 
331
331
  def collect_affected_deprecations(
332
- deprecations: Optional[List[EnvVarDeprecation]] = None,
333
- ) -> List[EnvVarDeprecation]:
332
+ deprecations: list[EnvVarDeprecation] | None = None,
333
+ ) -> list[EnvVarDeprecation]:
334
334
  """
335
335
  Collects all deprecations which are used in the OS environ.
336
336
  :param deprecations: List of deprecations to check. Uses DEPRECATIONS list by default.
@@ -341,7 +341,7 @@ def collect_affected_deprecations(
341
341
  return [deprecation for deprecation in deprecations if deprecation.is_affected]
342
342
 
343
343
 
344
- def log_env_warning(deprecations: List[EnvVarDeprecation]) -> None:
344
+ def log_env_warning(deprecations: list[EnvVarDeprecation]) -> None:
345
345
  """
346
346
  Logs warnings for the given deprecations.
347
347
  :param deprecations: list of affected deprecations to show a warning for
@@ -368,7 +368,7 @@ def log_env_warning(deprecations: List[EnvVarDeprecation]) -> None:
368
368
  log.event(event="deprecated_env_usage", payload={"deprecated_env_vars": env_vars})
369
369
 
370
370
 
371
- def log_deprecation_warnings(deprecations: Optional[List[EnvVarDeprecation]] = None) -> None:
371
+ def log_deprecation_warnings(deprecations: list[EnvVarDeprecation] | None = None) -> None:
372
372
  affected_deprecations = collect_affected_deprecations(deprecations)
373
373
  log_env_warning(affected_deprecations)
374
374
 
@@ -5,6 +5,12 @@ from typing import Literal
5
5
  import click
6
6
  import yaml
7
7
 
8
+ EDGE_SERVICE_NODE_PORT = 30066
9
+ NODE_PORT_START = 30010
10
+ SERVICE_PORT_START = 4510
11
+ NUMBER_OF_SERVICE_PORTS = 50
12
+ EDGE_SERVICE_DNS_PORT = 31053
13
+
8
14
 
9
15
  @dataclasses.dataclass
10
16
  class MountPoint:
@@ -27,7 +33,7 @@ def generate_mount_points(
27
33
 
28
34
  # container paths
29
35
  target_path = "/opt/code/localstack/"
30
- venv_path = os.path.join(target_path, ".venv", "lib", "python3.11", "site-packages")
36
+ venv_path = os.path.join(target_path, ".venv", "lib", "python3.13", "site-packages")
31
37
 
32
38
  # Community code
33
39
  if pro:
@@ -139,7 +145,12 @@ def generate_mount_points(
139
145
  return mount_points
140
146
 
141
147
 
142
- def generate_k8s_cluster_config(mount_points: list[MountPoint], port: int = 4566):
148
+ def generate_k8s_cluster_config(
149
+ mount_points: list[MountPoint],
150
+ port: int = 4566,
151
+ expose_dns: bool = False,
152
+ dns_port: int = 53,
153
+ ):
143
154
  volumes = [
144
155
  {
145
156
  "volume": f"{mount_point.host_path}:{mount_point.node_path}",
@@ -148,9 +159,64 @@ def generate_k8s_cluster_config(mount_points: list[MountPoint], port: int = 4566
148
159
  for mount_point in mount_points
149
160
  ]
150
161
 
151
- ports = [{"port": f"{port}:31566", "nodeFilters": ["server:0"]}]
162
+ ports = [
163
+ # main gateway port
164
+ {
165
+ "nodeFilters": [
166
+ "server:0",
167
+ ],
168
+ "port": f"{port}:{EDGE_SERVICE_NODE_PORT}",
169
+ },
170
+ # 443 https port for main gateway
171
+ {
172
+ "nodeFilters": [
173
+ "server:0",
174
+ ],
175
+ "port": f"443:{EDGE_SERVICE_NODE_PORT}",
176
+ },
177
+ # Node ports
178
+ {
179
+ "nodeFilters": [
180
+ "server:0",
181
+ ],
182
+ "port": f"{SERVICE_PORT_START}-{SERVICE_PORT_START + NUMBER_OF_SERVICE_PORTS - 1}:{NODE_PORT_START}-{NODE_PORT_START + NUMBER_OF_SERVICE_PORTS - 1}",
183
+ },
184
+ ]
152
185
 
153
- config = {"apiVersion": "k3d.io/v1alpha5", "kind": "Simple", "volumes": volumes, "ports": ports}
186
+ if expose_dns:
187
+ ports.append(
188
+ {
189
+ "nodeFilters": [
190
+ "server:0",
191
+ ],
192
+ "port": f"{dns_port}:{EDGE_SERVICE_DNS_PORT}/udp",
193
+ }
194
+ )
195
+ ports.append(
196
+ {
197
+ "nodeFilters": [
198
+ "server:0",
199
+ ],
200
+ "port": f"{dns_port}:{EDGE_SERVICE_DNS_PORT}/tcp",
201
+ }
202
+ )
203
+
204
+ config = {
205
+ "apiVersion": "k3d.io/v1alpha5",
206
+ "kind": "Simple",
207
+ "volumes": volumes,
208
+ "ports": ports,
209
+ "options": {
210
+ "k3s": {
211
+ "extraArgs": [
212
+ {
213
+ "arg": "--kubelet-arg=container-log-max-size=1Gi",
214
+ "nodeFilters": ["server:*"],
215
+ },
216
+ ],
217
+ },
218
+ },
219
+ }
154
220
 
155
221
  return config
156
222
 
@@ -159,7 +225,7 @@ def snake_to_kebab_case(string: str):
159
225
  return string.lower().replace("_", "-")
160
226
 
161
227
 
162
- def generate_k8s_cluster_overrides(
228
+ def generate_k8s_helm_overrides(
163
229
  mount_points: list[MountPoint], pro: bool = False, env: list[str] | None = None
164
230
  ):
165
231
  volumes = [
@@ -200,10 +266,48 @@ def generate_k8s_cluster_overrides(
200
266
  "name": "CONTAINER_RUNTIME",
201
267
  "value": "kubernetes",
202
268
  },
269
+ {
270
+ "name": "RDS_MYSQL_DOCKER",
271
+ "value": "1",
272
+ },
273
+ {
274
+ "name": "ENABLE_DMS",
275
+ "value": "1",
276
+ },
277
+ {
278
+ "name": "ENABLE_BEDROCK",
279
+ "value": "1",
280
+ },
281
+ {
282
+ "name": "DOCDB_PROXY_CONTAINER",
283
+ "value": "1",
284
+ },
285
+ {
286
+ "name": "GLUE_JOB_EXECUTOR_PROVIDER",
287
+ "value": "v2",
288
+ },
289
+ {
290
+ "name": "CLOUDFRONT_LAMBDA_EDGE",
291
+ "value": "1",
292
+ },
203
293
  ]
204
294
 
205
295
  image_repository = "localstack/localstack-pro" if pro else "localstack/localstack"
206
296
 
297
+ service = {
298
+ "edgeService": {
299
+ "nodePort": EDGE_SERVICE_NODE_PORT,
300
+ },
301
+ "externalServicePorts": {
302
+ "start": SERVICE_PORT_START,
303
+ "end": SERVICE_PORT_START + NUMBER_OF_SERVICE_PORTS,
304
+ "nodePortStart": NODE_PORT_START,
305
+ },
306
+ "dnsService": {
307
+ "enabled": True,
308
+ "nodePort": EDGE_SERVICE_DNS_PORT,
309
+ },
310
+ }
207
311
  overrides = {
208
312
  "debug": True,
209
313
  "volumes": volumes,
@@ -211,6 +315,9 @@ def generate_k8s_cluster_overrides(
211
315
  "extraEnvVars": extra_env_vars,
212
316
  "image": {"repository": image_repository},
213
317
  "lambda": {"executor": "kubernetes"},
318
+ "service": service,
319
+ "readinessProbe": {"initialDelaySeconds": 10},
320
+ "livenessProbe": {"initialDelaySeconds": 10},
214
321
  }
215
322
 
216
323
  return overrides
@@ -275,6 +382,18 @@ def print_file(content: dict, file_name: str):
275
382
  help="Port to expose from the kubernetes node",
276
383
  type=click.IntRange(0, 65535),
277
384
  )
385
+ @click.option(
386
+ "--expose-dns",
387
+ is_flag=True,
388
+ default=False,
389
+ help="Expose DNS port from the kubernetes node.",
390
+ )
391
+ @click.option(
392
+ "--dns-port",
393
+ default=53,
394
+ help="DNS port to expose from the kubernetes node. It is applied only if --expose-dns is set.",
395
+ type=click.IntRange(0, 65535),
396
+ )
278
397
  @click.argument("command", nargs=-1, required=False)
279
398
  def run(
280
399
  pro: bool = None,
@@ -287,15 +406,19 @@ def run(
287
406
  command: str = None,
288
407
  env: list[str] = None,
289
408
  port: int = None,
409
+ expose_dns: bool = False,
410
+ dns_port: int = 53,
290
411
  ):
291
412
  """
292
413
  A tool for localstack developers to generate the kubernetes cluster configuration file and the overrides to mount the localstack code into the cluster.
293
414
  """
294
415
  mount_points = generate_mount_points(pro, mount_moto, mount_entrypoints)
295
416
 
296
- config = generate_k8s_cluster_config(mount_points, port=port)
417
+ config = generate_k8s_cluster_config(
418
+ mount_points, port=port, expose_dns=expose_dns, dns_port=dns_port
419
+ )
297
420
 
298
- overrides = generate_k8s_cluster_overrides(mount_points, pro=pro, env=env)
421
+ overrides = generate_k8s_helm_overrides(mount_points, pro=pro, env=env)
299
422
 
300
423
  output_dir = output_dir or os.getcwd()
301
424
  overrides_file = overrides_file or "overrides.yml"
@@ -1,6 +1,6 @@
1
1
  import dataclasses
2
2
  import os
3
- from typing import Iterable, Tuple
3
+ from collections.abc import Iterable
4
4
 
5
5
  import click
6
6
  from rich.rule import Rule
@@ -133,9 +133,9 @@ def run(
133
133
  mount_dependencies: bool = False,
134
134
  mount_entrypoints: bool = False,
135
135
  mount_docker_socket: bool = True,
136
- env: Tuple = (),
137
- volume: Tuple = (),
138
- publish: Tuple = (),
136
+ env: tuple = (),
137
+ volume: tuple = (),
138
+ publish: tuple = (),
139
139
  entrypoint: str = None,
140
140
  network: str = None,
141
141
  local_packages: list[str] | None = None,
@@ -266,7 +266,7 @@ def run(
266
266
  remove=True,
267
267
  interactive=True,
268
268
  tty=True,
269
- env_vars=dict(),
269
+ env_vars={},
270
270
  volumes=VolumeMappings(),
271
271
  ports=PortMappings(),
272
272
  network=network,
@@ -363,10 +363,7 @@ def _list_files_in_container_image(container_client: ContainerClient, image_name
363
363
  try:
364
364
  # docker export yields paths without prefixed slashes, so we add them here
365
365
  # since the file is pretty big (~4MB for community, ~7MB for pro) we gzip it
366
- cmd = "docker export %s | tar -t | awk '{ print \"/\" $0 }' | gzip > %s" % (
367
- container_id,
368
- cache_file,
369
- )
366
+ cmd = f"docker export {container_id} | tar -t | awk '{{ print \"/\" $0 }}' | gzip > {cache_file}"
370
367
  run(cmd, shell=True)
371
368
  finally:
372
369
  container_client.remove_container(container_id)
@@ -1,8 +1,8 @@
1
1
  """Utilities to resolve important paths on the host and in the container."""
2
2
 
3
3
  import os
4
+ from collections.abc import Callable
4
5
  from pathlib import Path
5
- from typing import Callable, Optional, Union
6
6
 
7
7
 
8
8
  class HostPaths:
@@ -20,9 +20,9 @@ class HostPaths:
20
20
 
21
21
  def __init__(
22
22
  self,
23
- workspace_dir: Union[os.PathLike, str] = None,
24
- volume_dir: Union[os.PathLike, str] = None,
25
- venv_dir: Union[os.PathLike, str] = None,
23
+ workspace_dir: os.PathLike | str = None,
24
+ volume_dir: os.PathLike | str = None,
25
+ venv_dir: os.PathLike | str = None,
26
26
  ):
27
27
  self.workspace_dir = Path(workspace_dir or os.path.abspath(os.path.join(os.getcwd(), "..")))
28
28
  self.localstack_project_dir = self.workspace_dir / "localstack"
@@ -68,11 +68,11 @@ class ContainerPaths:
68
68
  """Important paths in the container"""
69
69
 
70
70
  project_dir: str = "/opt/code/localstack"
71
- site_packages_target_dir: str = "/opt/code/localstack/.venv/lib/python3.11/site-packages"
71
+ site_packages_target_dir: str = "/opt/code/localstack/.venv/lib/python3.13/site-packages"
72
72
  docker_entrypoint: str = "/usr/local/bin/docker-entrypoint.sh"
73
73
  localstack_supervisor: str = "/usr/local/bin/localstack-supervisor"
74
74
  localstack_source_dir: str
75
- localstack_pro_source_dir: Optional[str]
75
+ localstack_pro_source_dir: str | None
76
76
 
77
77
  def dependency_source(self, name: str) -> str:
78
78
  """Returns path of the given source dependency in the site-packages directory."""
localstack/dns/models.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import dataclasses
2
+ from collections.abc import Callable
2
3
  from enum import Enum, auto
3
- from typing import Callable, Protocol
4
+ from typing import Protocol
4
5
 
5
6
 
6
7
  class RecordType(Enum):
localstack/dns/plugins.py CHANGED
@@ -11,8 +11,12 @@ DNS_SHUTDOWN_PRIORITY = -30
11
11
  """Make sure the DNS server is shut down after the ON_AFTER_SERVICE_SHUTDOWN_HANDLERS, which in turn is after
12
12
  SERVICE_SHUTDOWN_PRIORITY. Currently this value needs to be less than -20"""
13
13
 
14
+ DNS_START_PRIORITY = 20
15
+ """Make sure the DNS server is started before the pro activation, to ensure proper DNS resolution for the activate call,
16
+ if the resolv.conf is set to localhost from outside the container"""
14
17
 
15
- @hooks.on_infra_start(priority=10)
18
+
19
+ @hooks.on_infra_start(priority=DNS_START_PRIORITY)
16
20
  def start_dns_server():
17
21
  try:
18
22
  from localstack.dns import server