localstack-core 4.6.1.dev60__py3-none-any.whl → 4.10.1.dev12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. localstack/aws/api/apigateway/__init__.py +87 -110
  2. localstack/aws/api/cloudformation/__init__.py +18 -4
  3. localstack/aws/api/cloudwatch/__init__.py +41 -1
  4. localstack/aws/api/config/__init__.py +4 -0
  5. localstack/aws/api/core.py +8 -5
  6. localstack/aws/api/dynamodb/__init__.py +30 -0
  7. localstack/aws/api/ec2/__init__.py +1545 -66
  8. localstack/aws/api/events/__init__.py +12 -16
  9. localstack/aws/api/iam/__init__.py +7 -0
  10. localstack/aws/api/kinesis/__init__.py +19 -0
  11. localstack/aws/api/kms/__init__.py +6 -0
  12. localstack/aws/api/lambda_/__init__.py +36 -23
  13. localstack/aws/api/logs/__init__.py +20 -8
  14. localstack/aws/api/opensearch/__init__.py +16 -0
  15. localstack/aws/api/pipes/__init__.py +24 -32
  16. localstack/aws/api/redshift/__init__.py +9 -3
  17. localstack/aws/api/route53/__init__.py +5 -0
  18. localstack/aws/api/s3/__init__.py +12 -0
  19. localstack/aws/api/s3control/__init__.py +56 -0
  20. localstack/aws/api/scheduler/__init__.py +14 -16
  21. localstack/aws/api/ssm/__init__.py +2 -0
  22. localstack/aws/api/stepfunctions/__init__.py +88 -114
  23. localstack/aws/api/support/__init__.py +8 -9
  24. localstack/aws/api/transcribe/__init__.py +17 -0
  25. localstack/aws/chain.py +2 -2
  26. localstack/aws/client.py +14 -11
  27. localstack/aws/connect.py +42 -41
  28. localstack/aws/forwarder.py +57 -9
  29. localstack/aws/gateway.py +1 -3
  30. localstack/aws/handlers/analytics.py +2 -3
  31. localstack/aws/handlers/cors.py +4 -5
  32. localstack/aws/handlers/internal_requests.py +6 -1
  33. localstack/aws/handlers/logging.py +13 -4
  34. localstack/aws/handlers/metric_handler.py +44 -5
  35. localstack/aws/handlers/service.py +48 -28
  36. localstack/aws/mocking.py +18 -27
  37. localstack/aws/patches.py +2 -2
  38. localstack/aws/protocol/op_router.py +11 -10
  39. localstack/aws/protocol/parser.py +475 -49
  40. localstack/aws/protocol/serializer.py +723 -106
  41. localstack/aws/protocol/service_router.py +133 -33
  42. localstack/aws/protocol/validate.py +6 -6
  43. localstack/aws/scaffold.py +9 -10
  44. localstack/aws/serving/edge.py +5 -6
  45. localstack/aws/serving/hypercorn.py +2 -2
  46. localstack/aws/serving/twisted.py +1 -2
  47. localstack/aws/serving/werkzeug.py +2 -2
  48. localstack/aws/skeleton.py +12 -11
  49. localstack/aws/spec-patches.json +58 -0
  50. localstack/aws/spec.py +66 -46
  51. localstack/cli/exceptions.py +1 -1
  52. localstack/cli/localstack.py +11 -11
  53. localstack/cli/lpm.py +4 -5
  54. localstack/cli/plugins.py +1 -1
  55. localstack/cli/profiles.py +1 -2
  56. localstack/config.py +44 -30
  57. localstack/constants.py +4 -29
  58. localstack/deprecations.py +5 -5
  59. localstack/dev/kubernetes/__main__.py +130 -7
  60. localstack/dev/run/__main__.py +5 -5
  61. localstack/dev/run/configurators.py +1 -4
  62. localstack/dev/run/paths.py +6 -6
  63. localstack/dns/models.py +2 -1
  64. localstack/dns/plugins.py +5 -1
  65. localstack/dns/server.py +16 -6
  66. localstack/http/dispatcher.py +1 -2
  67. localstack/http/response.py +2 -2
  68. localstack/http/router.py +1 -1
  69. localstack/http/trace.py +2 -1
  70. localstack/logging/format.py +6 -6
  71. localstack/packages/api.py +13 -12
  72. localstack/packages/core.py +4 -4
  73. localstack/packages/debugpy.py +1 -3
  74. localstack/packages/ffmpeg.py +1 -2
  75. localstack/packages/java.py +38 -12
  76. localstack/packages/plugins.py +0 -8
  77. localstack/runtime/analytics.py +3 -0
  78. localstack/runtime/hooks.py +1 -1
  79. localstack/runtime/init.py +8 -9
  80. localstack/runtime/main.py +5 -5
  81. localstack/runtime/patches.py +2 -2
  82. localstack/runtime/shutdown.py +2 -1
  83. localstack/services/apigateway/exporter.py +1 -2
  84. localstack/services/apigateway/helpers.py +7 -10
  85. localstack/services/apigateway/legacy/context.py +21 -21
  86. localstack/services/apigateway/legacy/helpers.py +27 -28
  87. localstack/services/apigateway/legacy/integration.py +11 -10
  88. localstack/services/apigateway/legacy/invocations.py +6 -5
  89. localstack/services/apigateway/legacy/provider.py +148 -68
  90. localstack/services/apigateway/legacy/router_asf.py +2 -2
  91. localstack/services/apigateway/legacy/templates.py +6 -6
  92. localstack/services/apigateway/models.py +16 -16
  93. localstack/services/apigateway/next_gen/execute_api/api.py +2 -2
  94. localstack/services/apigateway/next_gen/execute_api/context.py +25 -25
  95. localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py +2 -5
  96. localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py +7 -2
  97. localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +1 -2
  98. localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py +2 -3
  99. localstack/services/apigateway/next_gen/execute_api/header_utils.py +1 -1
  100. localstack/services/apigateway/next_gen/execute_api/helpers.py +2 -2
  101. localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +9 -6
  102. localstack/services/apigateway/next_gen/execute_api/integrations/http.py +12 -12
  103. localstack/services/apigateway/next_gen/execute_api/router.py +31 -0
  104. localstack/services/apigateway/next_gen/execute_api/template_mapping.py +2 -2
  105. localstack/services/apigateway/next_gen/execute_api/test_invoke.py +114 -9
  106. localstack/services/apigateway/next_gen/execute_api/variables.py +63 -63
  107. localstack/services/apigateway/next_gen/provider.py +5 -0
  108. localstack/services/apigateway/resource_providers/aws_apigateway_account.py +3 -3
  109. localstack/services/apigateway/resource_providers/aws_apigateway_account_plugin.py +1 -3
  110. localstack/services/apigateway/resource_providers/aws_apigateway_apikey.py +14 -14
  111. localstack/services/apigateway/resource_providers/aws_apigateway_apikey_plugin.py +1 -3
  112. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping.py +5 -5
  113. localstack/services/apigateway/resource_providers/aws_apigateway_basepathmapping_plugin.py +1 -3
  114. localstack/services/apigateway/resource_providers/aws_apigateway_deployment.py +46 -46
  115. localstack/services/apigateway/resource_providers/aws_apigateway_deployment_plugin.py +1 -3
  116. localstack/services/apigateway/resource_providers/aws_apigateway_domainname.py +18 -18
  117. localstack/services/apigateway/resource_providers/aws_apigateway_domainname_plugin.py +1 -3
  118. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse.py +7 -7
  119. localstack/services/apigateway/resource_providers/aws_apigateway_gatewayresponse_plugin.py +1 -3
  120. localstack/services/apigateway/resource_providers/aws_apigateway_method.py +36 -36
  121. localstack/services/apigateway/resource_providers/aws_apigateway_method_plugin.py +1 -3
  122. localstack/services/apigateway/resource_providers/aws_apigateway_model.py +6 -6
  123. localstack/services/apigateway/resource_providers/aws_apigateway_model_plugin.py +1 -3
  124. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator.py +6 -6
  125. localstack/services/apigateway/resource_providers/aws_apigateway_requestvalidator_plugin.py +1 -3
  126. localstack/services/apigateway/resource_providers/aws_apigateway_resource.py +6 -6
  127. localstack/services/apigateway/resource_providers/aws_apigateway_resource_plugin.py +1 -3
  128. localstack/services/apigateway/resource_providers/aws_apigateway_restapi.py +26 -26
  129. localstack/services/apigateway/resource_providers/aws_apigateway_restapi_plugin.py +1 -3
  130. localstack/services/apigateway/resource_providers/aws_apigateway_stage.py +33 -33
  131. localstack/services/apigateway/resource_providers/aws_apigateway_stage_plugin.py +1 -3
  132. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan.py +18 -18
  133. localstack/services/apigateway/resource_providers/aws_apigateway_usageplan_plugin.py +1 -3
  134. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey.py +5 -5
  135. localstack/services/apigateway/resource_providers/aws_apigateway_usageplankey_plugin.py +1 -3
  136. localstack/services/cdk/resource_providers/cdk_metadata.py +4 -3
  137. localstack/services/cdk/resource_providers/cdk_metadata_plugin.py +1 -3
  138. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate.py +14 -14
  139. localstack/services/certificatemanager/resource_providers/aws_certificatemanager_certificate_plugin.py +1 -3
  140. localstack/services/cloudformation/api_utils.py +4 -8
  141. localstack/services/cloudformation/cfn_utils.py +2 -2
  142. localstack/services/cloudformation/deployment_utils.py +14 -12
  143. localstack/services/cloudformation/engine/changes.py +3 -3
  144. localstack/services/cloudformation/engine/entities.py +27 -17
  145. localstack/services/cloudformation/engine/parameters.py +4 -4
  146. localstack/services/cloudformation/engine/template_deployer.py +15 -14
  147. localstack/services/cloudformation/engine/template_utils.py +34 -12
  148. localstack/services/cloudformation/engine/transformers.py +11 -8
  149. localstack/services/cloudformation/engine/types.py +5 -4
  150. localstack/services/cloudformation/engine/v2/change_set_model.py +336 -39
  151. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +96 -17
  152. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +289 -136
  153. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +315 -146
  154. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +380 -105
  155. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +183 -0
  156. localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +6 -0
  157. localstack/services/cloudformation/engine/v2/resolving.py +102 -0
  158. localstack/services/cloudformation/engine/yaml_parser.py +9 -2
  159. localstack/services/cloudformation/provider.py +11 -6
  160. localstack/services/cloudformation/provider_utils.py +34 -4
  161. localstack/services/cloudformation/resource_provider.py +31 -21
  162. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro.py +7 -7
  163. localstack/services/cloudformation/resource_providers/aws_cloudformation_macro_plugin.py +1 -3
  164. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack.py +9 -9
  165. localstack/services/cloudformation/resource_providers/aws_cloudformation_stack_plugin.py +1 -3
  166. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition.py +6 -6
  167. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitcondition_plugin.py +1 -3
  168. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle.py +2 -2
  169. localstack/services/cloudformation/resource_providers/aws_cloudformation_waitconditionhandle_plugin.py +1 -3
  170. localstack/services/cloudformation/resources.py +24149 -0
  171. localstack/services/cloudformation/scaffolding/__main__.py +13 -12
  172. localstack/services/cloudformation/scaffolding/propgen.py +2 -2
  173. localstack/services/cloudformation/service_models.py +2 -2
  174. localstack/services/cloudformation/stores.py +33 -22
  175. localstack/services/cloudformation/v2/entities.py +103 -88
  176. localstack/services/cloudformation/v2/provider.py +872 -131
  177. localstack/services/cloudformation/v2/types.py +38 -0
  178. localstack/services/cloudformation/v2/utils.py +4 -1
  179. localstack/services/cloudwatch/alarm_scheduler.py +11 -8
  180. localstack/services/cloudwatch/cloudwatch_database_helper.py +4 -5
  181. localstack/services/cloudwatch/models.py +5 -7
  182. localstack/services/cloudwatch/provider.py +30 -25
  183. localstack/services/cloudwatch/provider_v2.py +27 -32
  184. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py +40 -40
  185. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm_plugin.py +1 -3
  186. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm.py +12 -12
  187. localstack/services/cloudwatch/resource_providers/aws_cloudwatch_compositealarm_plugin.py +1 -3
  188. localstack/services/dynamodb/packages.py +3 -3
  189. localstack/services/dynamodb/provider.py +159 -18
  190. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable.py +63 -63
  191. localstack/services/dynamodb/resource_providers/aws_dynamodb_globaltable_plugin.py +1 -3
  192. localstack/services/dynamodb/resource_providers/aws_dynamodb_table.py +57 -57
  193. localstack/services/dynamodb/resource_providers/aws_dynamodb_table_plugin.py +1 -3
  194. localstack/services/dynamodb/server.py +2 -2
  195. localstack/services/dynamodb/utils.py +13 -14
  196. localstack/services/dynamodb/v2/provider.py +157 -18
  197. localstack/services/dynamodbstreams/dynamodbstreams_api.py +2 -2
  198. localstack/services/dynamodbstreams/models.py +1 -3
  199. localstack/services/ec2/patches.py +26 -5
  200. localstack/services/ec2/provider.py +3 -3
  201. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions.py +10 -10
  202. localstack/services/ec2/resource_providers/aws_ec2_dhcpoptions_plugin.py +1 -3
  203. localstack/services/ec2/resource_providers/aws_ec2_instance.py +96 -96
  204. localstack/services/ec2/resource_providers/aws_ec2_instance_plugin.py +1 -3
  205. localstack/services/ec2/resource_providers/aws_ec2_internetgateway.py +5 -5
  206. localstack/services/ec2/resource_providers/aws_ec2_internetgateway_plugin.py +1 -3
  207. localstack/services/ec2/resource_providers/aws_ec2_keypair.py +10 -10
  208. localstack/services/ec2/resource_providers/aws_ec2_keypair_plugin.py +1 -3
  209. localstack/services/ec2/resource_providers/aws_ec2_natgateway.py +13 -13
  210. localstack/services/ec2/resource_providers/aws_ec2_natgateway_plugin.py +1 -3
  211. localstack/services/ec2/resource_providers/aws_ec2_networkacl.py +6 -6
  212. localstack/services/ec2/resource_providers/aws_ec2_networkacl_plugin.py +1 -3
  213. localstack/services/ec2/resource_providers/aws_ec2_prefixlist.py +14 -14
  214. localstack/services/ec2/resource_providers/aws_ec2_prefixlist_plugin.py +1 -3
  215. localstack/services/ec2/resource_providers/aws_ec2_route.py +15 -15
  216. localstack/services/ec2/resource_providers/aws_ec2_route_plugin.py +1 -3
  217. localstack/services/ec2/resource_providers/aws_ec2_routetable.py +6 -6
  218. localstack/services/ec2/resource_providers/aws_ec2_routetable_plugin.py +1 -3
  219. localstack/services/ec2/resource_providers/aws_ec2_securitygroup.py +29 -29
  220. localstack/services/ec2/resource_providers/aws_ec2_securitygroup_plugin.py +1 -3
  221. localstack/services/ec2/resource_providers/aws_ec2_subnet.py +19 -19
  222. localstack/services/ec2/resource_providers/aws_ec2_subnet_plugin.py +1 -3
  223. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation.py +4 -4
  224. localstack/services/ec2/resource_providers/aws_ec2_subnetroutetableassociation_plugin.py +1 -3
  225. localstack/services/ec2/resource_providers/aws_ec2_transitgateway.py +16 -16
  226. localstack/services/ec2/resource_providers/aws_ec2_transitgateway_plugin.py +1 -3
  227. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment.py +9 -9
  228. localstack/services/ec2/resource_providers/aws_ec2_transitgatewayattachment_plugin.py +1 -3
  229. localstack/services/ec2/resource_providers/aws_ec2_vpc.py +15 -15
  230. localstack/services/ec2/resource_providers/aws_ec2_vpc_plugin.py +1 -3
  231. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint.py +29 -22
  232. localstack/services/ec2/resource_providers/aws_ec2_vpcendpoint_plugin.py +1 -3
  233. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment.py +5 -5
  234. localstack/services/ec2/resource_providers/aws_ec2_vpcgatewayattachment_plugin.py +1 -3
  235. localstack/services/ecr/resource_providers/aws_ecr_repository.py +22 -19
  236. localstack/services/ecr/resource_providers/aws_ecr_repository_plugin.py +1 -3
  237. localstack/services/edge.py +6 -6
  238. localstack/services/es/provider.py +21 -21
  239. localstack/services/events/archive.py +2 -2
  240. localstack/services/events/connection.py +5 -5
  241. localstack/services/events/event_bus.py +9 -9
  242. localstack/services/events/event_rule_engine.py +31 -13
  243. localstack/services/events/models.py +29 -30
  244. localstack/services/events/provider.py +29 -26
  245. localstack/services/events/replay.py +3 -3
  246. localstack/services/events/resource_providers/aws_events_apidestination.py +8 -8
  247. localstack/services/events/resource_providers/aws_events_apidestination_plugin.py +1 -3
  248. localstack/services/events/resource_providers/aws_events_connection.py +27 -27
  249. localstack/services/events/resource_providers/aws_events_connection_plugin.py +1 -3
  250. localstack/services/events/resource_providers/aws_events_eventbus.py +9 -9
  251. localstack/services/events/resource_providers/aws_events_eventbus_plugin.py +1 -3
  252. localstack/services/events/resource_providers/aws_events_eventbuspolicy.py +11 -11
  253. localstack/services/events/resource_providers/aws_events_eventbuspolicy_plugin.py +1 -3
  254. localstack/services/events/resource_providers/aws_events_rule.py +82 -82
  255. localstack/services/events/resource_providers/aws_events_rule_plugin.py +1 -3
  256. localstack/services/events/rule.py +15 -15
  257. localstack/services/events/target.py +21 -13
  258. localstack/services/events/utils.py +7 -7
  259. localstack/services/events/v1/models.py +1 -3
  260. localstack/services/events/v1/provider.py +15 -15
  261. localstack/services/firehose/models.py +1 -3
  262. localstack/services/firehose/provider.py +25 -16
  263. localstack/services/iam/iam_patches.py +5 -6
  264. localstack/services/iam/provider.py +14 -119
  265. localstack/services/iam/resource_providers/aws_iam_accesskey.py +6 -6
  266. localstack/services/iam/resource_providers/aws_iam_accesskey_plugin.py +1 -3
  267. localstack/services/iam/resource_providers/aws_iam_group.py +9 -9
  268. localstack/services/iam/resource_providers/aws_iam_group_plugin.py +1 -3
  269. localstack/services/iam/resource_providers/aws_iam_instanceprofile.py +5 -5
  270. localstack/services/iam/resource_providers/aws_iam_instanceprofile_plugin.py +1 -3
  271. localstack/services/iam/resource_providers/aws_iam_managedpolicy.py +9 -9
  272. localstack/services/iam/resource_providers/aws_iam_managedpolicy_plugin.py +1 -3
  273. localstack/services/iam/resource_providers/aws_iam_policy.py +7 -7
  274. localstack/services/iam/resource_providers/aws_iam_policy_plugin.py +1 -3
  275. localstack/services/iam/resource_providers/aws_iam_role.py +16 -16
  276. localstack/services/iam/resource_providers/aws_iam_role_plugin.py +1 -3
  277. localstack/services/iam/resource_providers/aws_iam_servercertificate.py +10 -10
  278. localstack/services/iam/resource_providers/aws_iam_servercertificate_plugin.py +1 -3
  279. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole.py +5 -5
  280. localstack/services/iam/resource_providers/aws_iam_servicelinkedrole_plugin.py +1 -3
  281. localstack/services/iam/resource_providers/aws_iam_user.py +17 -17
  282. localstack/services/iam/resource_providers/aws_iam_user_plugin.py +1 -3
  283. localstack/services/iam/resources/policy_simulator.py +133 -0
  284. localstack/services/kinesis/kinesis_mock_server.py +7 -8
  285. localstack/services/kinesis/models.py +17 -5
  286. localstack/services/kinesis/packages.py +3 -3
  287. localstack/services/kinesis/provider.py +86 -3
  288. localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +13 -13
  289. localstack/services/kinesis/resource_providers/aws_kinesis_stream_plugin.py +1 -3
  290. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer.py +7 -7
  291. localstack/services/kinesis/resource_providers/aws_kinesis_streamconsumer_plugin.py +1 -3
  292. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream.py +191 -191
  293. localstack/services/kinesisfirehose/resource_providers/aws_kinesisfirehose_deliverystream_plugin.py +1 -3
  294. localstack/services/kms/models.py +21 -18
  295. localstack/services/kms/provider.py +62 -26
  296. localstack/services/kms/resource_providers/aws_kms_alias.py +3 -3
  297. localstack/services/kms/resource_providers/aws_kms_alias_plugin.py +1 -3
  298. localstack/services/kms/resource_providers/aws_kms_key.py +14 -14
  299. localstack/services/kms/resource_providers/aws_kms_key_plugin.py +1 -3
  300. localstack/services/kms/utils.py +4 -3
  301. localstack/services/lambda_/api_utils.py +19 -16
  302. localstack/services/lambda_/custom_endpoints.py +2 -2
  303. localstack/services/lambda_/event_source_mapping/esm_worker_factory.py +4 -7
  304. localstack/services/lambda_/event_source_mapping/pipe_utils.py +2 -2
  305. localstack/services/lambda_/event_source_mapping/pollers/stream_poller.py +1 -1
  306. localstack/services/lambda_/event_source_mapping/senders/sender_utils.py +2 -1
  307. localstack/services/lambda_/hooks.py +6 -1
  308. localstack/services/lambda_/invocation/assignment.py +1 -2
  309. localstack/services/lambda_/invocation/docker_runtime_executor.py +7 -11
  310. localstack/services/lambda_/invocation/event_manager.py +1 -1
  311. localstack/services/lambda_/invocation/execution_environment.py +4 -4
  312. localstack/services/lambda_/invocation/executor_endpoint.py +8 -11
  313. localstack/services/lambda_/invocation/internal_sqs_queue.py +6 -10
  314. localstack/services/lambda_/invocation/lambda_models.py +33 -30
  315. localstack/services/lambda_/invocation/lambda_service.py +12 -5
  316. localstack/services/lambda_/invocation/logs.py +2 -3
  317. localstack/services/lambda_/invocation/runtime_executor.py +3 -3
  318. localstack/services/lambda_/invocation/version_manager.py +31 -8
  319. localstack/services/lambda_/ldm.py +14 -0
  320. localstack/services/lambda_/packages.py +3 -4
  321. localstack/services/lambda_/provider.py +9 -26
  322. localstack/services/lambda_/provider_utils.py +1 -1
  323. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig.py +8 -8
  324. localstack/services/lambda_/resource_providers/aws_lambda_codesigningconfig_plugin.py +1 -3
  325. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig.py +11 -11
  326. localstack/services/lambda_/resource_providers/aws_lambda_eventinvokeconfig_plugin.py +1 -3
  327. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping.py +39 -39
  328. localstack/services/lambda_/resource_providers/aws_lambda_eventsourcemapping_plugin.py +1 -3
  329. localstack/services/lambda_/resource_providers/aws_lambda_function.py +54 -54
  330. localstack/services/lambda_/resource_providers/aws_lambda_function_plugin.py +1 -3
  331. localstack/services/lambda_/resource_providers/aws_lambda_layerversion.py +11 -11
  332. localstack/services/lambda_/resource_providers/aws_lambda_layerversion_plugin.py +1 -3
  333. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission.py +6 -6
  334. localstack/services/lambda_/resource_providers/aws_lambda_layerversionpermission_plugin.py +1 -3
  335. localstack/services/lambda_/resource_providers/aws_lambda_permission.py +10 -10
  336. localstack/services/lambda_/resource_providers/aws_lambda_permission_plugin.py +1 -3
  337. localstack/services/lambda_/resource_providers/aws_lambda_url.py +15 -15
  338. localstack/services/lambda_/resource_providers/aws_lambda_url_plugin.py +1 -3
  339. localstack/services/lambda_/resource_providers/aws_lambda_version.py +8 -8
  340. localstack/services/lambda_/resource_providers/aws_lambda_version_plugin.py +1 -3
  341. localstack/services/lambda_/resource_providers/lambda_alias.py +12 -12
  342. localstack/services/lambda_/resource_providers/lambda_alias_plugin.py +1 -3
  343. localstack/services/lambda_/runtimes.py +1 -3
  344. localstack/services/lambda_/urlrouter.py +14 -1
  345. localstack/services/logs/models.py +1 -3
  346. localstack/services/logs/provider.py +39 -22
  347. localstack/services/logs/resource_providers/aws_logs_loggroup.py +9 -9
  348. localstack/services/logs/resource_providers/aws_logs_loggroup_plugin.py +1 -3
  349. localstack/services/logs/resource_providers/aws_logs_logstream.py +4 -4
  350. localstack/services/logs/resource_providers/aws_logs_logstream_plugin.py +1 -3
  351. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter.py +7 -7
  352. localstack/services/logs/resource_providers/aws_logs_subscriptionfilter_plugin.py +1 -3
  353. localstack/services/moto.py +5 -4
  354. localstack/services/opensearch/cluster.py +28 -20
  355. localstack/services/opensearch/cluster_manager.py +13 -14
  356. localstack/services/opensearch/models.py +1 -3
  357. localstack/services/opensearch/packages.py +27 -9
  358. localstack/services/opensearch/provider.py +15 -10
  359. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain.py +61 -61
  360. localstack/services/opensearch/resource_providers/aws_elasticsearch_domain_plugin.py +1 -3
  361. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain.py +89 -89
  362. localstack/services/opensearch/resource_providers/aws_opensearchservice_domain_plugin.py +1 -3
  363. localstack/services/opensearch/versions.py +57 -10
  364. localstack/services/plugins.py +37 -32
  365. localstack/services/providers.py +10 -2
  366. localstack/services/redshift/provider.py +0 -21
  367. localstack/services/redshift/resource_providers/aws_redshift_cluster.py +57 -57
  368. localstack/services/redshift/resource_providers/aws_redshift_cluster_plugin.py +1 -3
  369. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group.py +21 -21
  370. localstack/services/resource_groups/resource_providers/aws_resourcegroups_group_plugin.py +1 -3
  371. localstack/services/route53/models.py +1 -3
  372. localstack/services/route53/provider.py +1 -2
  373. localstack/services/route53/resource_providers/aws_route53_healthcheck.py +6 -6
  374. localstack/services/route53/resource_providers/aws_route53_healthcheck_plugin.py +1 -3
  375. localstack/services/route53/resource_providers/aws_route53_recordset.py +27 -27
  376. localstack/services/route53/resource_providers/aws_route53_recordset_plugin.py +1 -3
  377. localstack/services/route53resolver/models.py +8 -10
  378. localstack/services/route53resolver/provider.py +12 -12
  379. localstack/services/s3/codec.py +2 -2
  380. localstack/services/s3/constants.py +5 -2
  381. localstack/services/s3/cors.py +8 -8
  382. localstack/services/s3/models.py +73 -73
  383. localstack/services/s3/notifications.py +74 -58
  384. localstack/services/s3/presigned_url.py +41 -59
  385. localstack/services/s3/provider.py +86 -29
  386. localstack/services/s3/resource_providers/aws_s3_bucket.py +180 -180
  387. localstack/services/s3/resource_providers/aws_s3_bucket_plugin.py +1 -3
  388. localstack/services/s3/resource_providers/aws_s3_bucketpolicy.py +4 -4
  389. localstack/services/s3/resource_providers/aws_s3_bucketpolicy_plugin.py +1 -3
  390. localstack/services/s3/storage/core.py +4 -3
  391. localstack/services/s3/storage/ephemeral.py +7 -6
  392. localstack/services/s3/utils.py +51 -31
  393. localstack/services/s3/validation.py +47 -33
  394. localstack/services/s3/website_hosting.py +9 -7
  395. localstack/services/scheduler/resource_providers/aws_scheduler_schedule.py +60 -60
  396. localstack/services/scheduler/resource_providers/aws_scheduler_schedule_plugin.py +1 -3
  397. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup.py +9 -9
  398. localstack/services/scheduler/resource_providers/aws_scheduler_schedulegroup_plugin.py +1 -3
  399. localstack/services/secretsmanager/provider.py +10 -12
  400. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy.py +5 -5
  401. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_resourcepolicy_plugin.py +1 -3
  402. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule.py +21 -21
  403. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_rotationschedule_plugin.py +1 -3
  404. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret.py +23 -23
  405. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secret_plugin.py +1 -3
  406. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment.py +5 -5
  407. localstack/services/secretsmanager/resource_providers/aws_secretsmanager_secrettargetattachment_plugin.py +1 -3
  408. localstack/services/ses/models.py +8 -1
  409. localstack/services/ses/provider.py +128 -55
  410. localstack/services/ses/resource_providers/aws_ses_emailidentity.py +21 -21
  411. localstack/services/ses/resource_providers/aws_ses_emailidentity_plugin.py +1 -3
  412. localstack/services/sns/constants.py +7 -1
  413. localstack/services/sns/executor.py +9 -2
  414. localstack/services/sns/models.py +25 -25
  415. localstack/services/sns/provider.py +9 -7
  416. localstack/services/sns/publisher.py +37 -23
  417. localstack/services/sns/resource_providers/aws_sns_subscription.py +13 -13
  418. localstack/services/sns/resource_providers/aws_sns_subscription_plugin.py +1 -3
  419. localstack/services/sns/resource_providers/aws_sns_topic.py +16 -16
  420. localstack/services/sns/resource_providers/aws_sns_topic_plugin.py +1 -3
  421. localstack/services/sns/resource_providers/aws_sns_topicpolicy.py +4 -4
  422. localstack/services/sns/resource_providers/aws_sns_topicpolicy_plugin.py +1 -3
  423. localstack/services/sns/v2/models.py +167 -0
  424. localstack/services/sns/v2/provider.py +867 -0
  425. localstack/services/sns/v2/utils.py +130 -0
  426. localstack/services/sqs/constants.py +2 -2
  427. localstack/services/sqs/developer_api.py +205 -0
  428. localstack/services/sqs/models.py +71 -36
  429. localstack/services/sqs/provider.py +56 -332
  430. localstack/services/sqs/query_api.py +8 -5
  431. localstack/services/sqs/resource_providers/aws_sqs_queue.py +21 -21
  432. localstack/services/sqs/resource_providers/aws_sqs_queue_plugin.py +1 -3
  433. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy.py +7 -5
  434. localstack/services/sqs/resource_providers/aws_sqs_queuepolicy_plugin.py +1 -3
  435. localstack/services/sqs/utils.py +123 -4
  436. localstack/services/ssm/provider.py +3 -4
  437. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow.py +15 -15
  438. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindow_plugin.py +1 -3
  439. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget.py +10 -10
  440. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtarget_plugin.py +1 -3
  441. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask.py +48 -48
  442. localstack/services/ssm/resource_providers/aws_ssm_maintenancewindowtask_plugin.py +1 -3
  443. localstack/services/ssm/resource_providers/aws_ssm_parameter.py +10 -10
  444. localstack/services/ssm/resource_providers/aws_ssm_parameter_plugin.py +1 -3
  445. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline.py +29 -29
  446. localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py +1 -3
  447. localstack/services/stepfunctions/asl/antlt4utils/antlr4utils.py +3 -4
  448. localstack/services/stepfunctions/asl/component/common/assign/assign_decl.py +1 -1
  449. localstack/services/stepfunctions/asl/component/common/assign/assign_decl_binding.py +1 -1
  450. localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_array.py +1 -1
  451. localstack/services/stepfunctions/asl/component/common/assign/assign_template_value_object.py +1 -1
  452. localstack/services/stepfunctions/asl/component/common/catch/catcher_decl.py +9 -9
  453. localstack/services/stepfunctions/asl/component/common/error_name/custom_error_name.py +2 -2
  454. localstack/services/stepfunctions/asl/component/common/error_name/error_name.py +4 -4
  455. localstack/services/stepfunctions/asl/component/common/error_name/failure_event.py +8 -8
  456. localstack/services/stepfunctions/asl/component/common/error_name/states_error_name_type.py +1 -1
  457. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_binding.py +2 -2
  458. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_array.py +1 -1
  459. localstack/services/stepfunctions/asl/component/common/jsonata/jsonata_template_value_object.py +1 -1
  460. localstack/services/stepfunctions/asl/component/common/path/input_path.py +4 -4
  461. localstack/services/stepfunctions/asl/component/common/path/output_path.py +4 -4
  462. localstack/services/stepfunctions/asl/component/common/path/result_path.py +3 -3
  463. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadarr/payload_arr.py +1 -1
  464. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadbinding/payload_binding.py +3 -3
  465. localstack/services/stepfunctions/asl/component/common/payload/payloadvalue/payloadtmpl/payload_tmpl.py +1 -1
  466. localstack/services/stepfunctions/asl/component/common/retry/retrier_decl.py +8 -8
  467. localstack/services/stepfunctions/asl/component/common/string/string_expression.py +3 -3
  468. localstack/services/stepfunctions/asl/component/common/timeouts/timeout.py +3 -3
  469. localstack/services/stepfunctions/asl/component/eval_component.py +2 -3
  470. localstack/services/stepfunctions/asl/component/intrinsic/argument/argument.py +4 -4
  471. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/array/array_partition.py +1 -1
  472. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/generic/string_format.py +1 -1
  473. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_array.py +1 -1
  474. localstack/services/stepfunctions/asl/component/intrinsic/function/statesfunction/states_function_format.py +1 -1
  475. localstack/services/stepfunctions/asl/component/intrinsic/jsonata.py +3 -3
  476. localstack/services/stepfunctions/asl/component/intrinsic/member.py +1 -1
  477. localstack/services/stepfunctions/asl/component/program/program.py +9 -9
  478. localstack/services/stepfunctions/asl/component/program/states.py +1 -1
  479. localstack/services/stepfunctions/asl/component/state/state.py +10 -11
  480. localstack/services/stepfunctions/asl/component/state/state_choice/choice_rule.py +11 -11
  481. localstack/services/stepfunctions/asl/component/state/state_choice/comparison/comparison.py +5 -11
  482. localstack/services/stepfunctions/asl/component/state/state_choice/comparison/operator/implementations/is_operator.py +2 -2
  483. localstack/services/stepfunctions/asl/component/state/state_choice/state_choice.py +3 -5
  484. localstack/services/stepfunctions/asl/component/state/state_execution/execute_state.py +9 -9
  485. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/item_reader_decl.py +7 -7
  486. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/reader_config/reader_config_decl.py +5 -5
  487. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_eval_s3.py +2 -1
  488. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/item_reader/resource_eval/resource_output_transformer/resource_output_transformer_csv.py +2 -2
  489. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/distributed_iteration_component.py +8 -8
  490. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/inline_iteration_component.py +7 -7
  491. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/distributed_item_processor_worker.py +4 -4
  492. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/inline_item_processor_worker.py +5 -5
  493. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/itemprocessor/map_run_record.py +10 -10
  494. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_component.py +3 -3
  495. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_declaration.py +3 -3
  496. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iteration_worker.py +2 -2
  497. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/distributed_iterator_worker.py +3 -5
  498. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator.py +1 -2
  499. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/iterator/inline_iterator_worker.py +5 -5
  500. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/iteration/job.py +9 -9
  501. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/result_writer/resource_eval/resource_eval_s3.py +2 -1
  502. localstack/services/stepfunctions/asl/component/state/state_execution/state_map/state_map.py +12 -13
  503. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branch_worker.py +3 -3
  504. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/branches_decl.py +7 -7
  505. localstack/services/stepfunctions/asl/component/state/state_execution/state_parallel/state_parallel.py +2 -3
  506. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/lambda_eval_utils.py +7 -7
  507. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/resource.py +3 -3
  508. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service.py +10 -10
  509. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_api_gateway.py +18 -18
  510. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_aws_sdk.py +1 -1
  511. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_batch.py +8 -7
  512. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_callback.py +18 -17
  513. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_dynamodb.py +2 -2
  514. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_ecs.py +5 -4
  515. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_events.py +4 -4
  516. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_glue.py +7 -6
  517. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_lambda.py +4 -4
  518. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sfn.py +9 -8
  519. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sns.py +2 -2
  520. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/service/state_task_service_sqs.py +4 -4
  521. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task.py +5 -5
  522. localstack/services/stepfunctions/asl/component/state/state_execution/state_task/state_task_lambda.py +2 -2
  523. localstack/services/stepfunctions/asl/component/state/state_fail/state_fail.py +3 -5
  524. localstack/services/stepfunctions/asl/component/state/state_pass/state_pass.py +5 -7
  525. localstack/services/stepfunctions/asl/component/state/state_succeed/state_succeed.py +1 -1
  526. localstack/services/stepfunctions/asl/component/state/state_wait/state_wait.py +1 -1
  527. localstack/services/stepfunctions/asl/component/state/state_wait/wait_function/timestamp.py +2 -2
  528. localstack/services/stepfunctions/asl/eval/callback/callback.py +18 -18
  529. localstack/services/stepfunctions/asl/eval/environment.py +22 -24
  530. localstack/services/stepfunctions/asl/eval/evaluation_details.py +3 -5
  531. localstack/services/stepfunctions/asl/eval/event/event_manager.py +10 -10
  532. localstack/services/stepfunctions/asl/eval/event/logging.py +3 -3
  533. localstack/services/stepfunctions/asl/eval/program_state.py +8 -8
  534. localstack/services/stepfunctions/asl/eval/states.py +12 -12
  535. localstack/services/stepfunctions/asl/eval/test_state/environment.py +3 -5
  536. localstack/services/stepfunctions/asl/eval/variable_store.py +6 -6
  537. localstack/services/stepfunctions/asl/jsonata/jsonata.py +7 -6
  538. localstack/services/stepfunctions/asl/parse/asl_parser.py +1 -1
  539. localstack/services/stepfunctions/asl/parse/intrinsic/preprocessor.py +2 -3
  540. localstack/services/stepfunctions/asl/parse/preprocessor.py +44 -44
  541. localstack/services/stepfunctions/asl/parse/typed_props.py +2 -2
  542. localstack/services/stepfunctions/asl/static_analyser/intrinsic/variable_names_intrinsic_static_analyser.py +1 -1
  543. localstack/services/stepfunctions/asl/static_analyser/variable_references_static_analyser.py +2 -2
  544. localstack/services/stepfunctions/asl/utils/encoding.py +2 -2
  545. localstack/services/stepfunctions/asl/utils/json_path.py +2 -2
  546. localstack/services/stepfunctions/backend/activity.py +4 -4
  547. localstack/services/stepfunctions/backend/alias.py +8 -8
  548. localstack/services/stepfunctions/backend/execution.py +29 -30
  549. localstack/services/stepfunctions/backend/execution_worker.py +7 -7
  550. localstack/services/stepfunctions/backend/state_machine.py +28 -28
  551. localstack/services/stepfunctions/backend/test_state/execution.py +3 -4
  552. localstack/services/stepfunctions/backend/test_state/execution_worker.py +1 -3
  553. localstack/services/stepfunctions/mocking/mock_config.py +9 -9
  554. localstack/services/stepfunctions/mocking/mock_config_file.py +10 -10
  555. localstack/services/stepfunctions/packages.py +14 -5
  556. localstack/services/stepfunctions/provider.py +34 -44
  557. localstack/services/stepfunctions/quotas.py +2 -3
  558. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity.py +6 -6
  559. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_activity_plugin.py +1 -3
  560. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine.py +25 -25
  561. localstack/services/stepfunctions/resource_providers/aws_stepfunctions_statemachine_plugin.py +1 -3
  562. localstack/services/stepfunctions/stepfunctions_utils.py +1 -2
  563. localstack/services/stores.py +8 -8
  564. localstack/services/transcribe/packages.py +1 -3
  565. localstack/services/transcribe/provider.py +8 -3
  566. localstack/state/codecs.py +61 -0
  567. localstack/state/core.py +11 -5
  568. localstack/state/inspect.py +4 -4
  569. localstack/state/pickle.py +36 -23
  570. localstack/testing/aws/asf_utils.py +3 -2
  571. localstack/testing/aws/cloudformation_utils.py +1 -1
  572. localstack/testing/aws/lambda_utils.py +15 -14
  573. localstack/testing/aws/util.py +3 -2
  574. localstack/testing/pytest/cloudformation/fixtures.py +68 -18
  575. localstack/testing/pytest/container.py +5 -5
  576. localstack/testing/pytest/filters.py +1 -3
  577. localstack/testing/pytest/fixtures.py +188 -49
  578. localstack/testing/pytest/in_memory_localstack.py +1 -3
  579. localstack/testing/pytest/marking.py +42 -15
  580. localstack/testing/pytest/path_filter.py +1 -1
  581. localstack/testing/pytest/stepfunctions/fixtures.py +4 -4
  582. localstack/testing/pytest/stepfunctions/utils.py +11 -10
  583. localstack/testing/pytest/util.py +1 -1
  584. localstack/testing/pytest/validation_tracking.py +3 -4
  585. localstack/testing/scenario/provisioning.py +11 -10
  586. localstack/testing/snapshots/transformer_utility.py +8 -3
  587. localstack/testing/testselection/matching.py +2 -2
  588. localstack/testing/testselection/opt_out.py +1 -1
  589. localstack/testing/testselection/scripts/filter_by_test_selection.py +1 -1
  590. localstack/testing/testselection/scripts/generate_test_selection.py +1 -1
  591. localstack/testing/testselection/testselection.py +2 -2
  592. localstack/utils/analytics/cli.py +2 -3
  593. localstack/utils/analytics/client.py +5 -5
  594. localstack/utils/analytics/events.py +2 -2
  595. localstack/utils/analytics/metadata.py +6 -4
  596. localstack/utils/analytics/metrics/counter.py +11 -18
  597. localstack/utils/analytics/metrics/registry.py +2 -2
  598. localstack/utils/analytics/publisher.py +4 -5
  599. localstack/utils/analytics/service_providers.py +19 -0
  600. localstack/utils/analytics/service_request_aggregator.py +4 -4
  601. localstack/utils/archives.py +12 -12
  602. localstack/utils/asyncio.py +2 -2
  603. localstack/utils/aws/arns.py +26 -31
  604. localstack/utils/aws/aws_responses.py +21 -28
  605. localstack/utils/aws/aws_stack.py +7 -12
  606. localstack/utils/aws/dead_letter_queue.py +4 -9
  607. localstack/utils/aws/message_forwarding.py +8 -11
  608. localstack/utils/aws/request_context.py +5 -6
  609. localstack/utils/aws/resources.py +1 -1
  610. localstack/utils/aws/templating.py +4 -4
  611. localstack/utils/batch_policy.py +4 -4
  612. localstack/utils/bootstrap.py +37 -30
  613. localstack/utils/catalog/catalog.py +139 -0
  614. localstack/utils/catalog/catalog_loader.py +119 -0
  615. localstack/utils/catalog/common.py +58 -0
  616. localstack/utils/catalog/plugins.py +28 -0
  617. localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
  618. localstack/utils/collections.py +33 -27
  619. localstack/utils/config_listener.py +2 -2
  620. localstack/utils/container_networking.py +5 -6
  621. localstack/utils/container_utils/container_client.py +156 -160
  622. localstack/utils/container_utils/docker_cmd_client.py +97 -81
  623. localstack/utils/container_utils/docker_sdk_client.py +75 -72
  624. localstack/utils/crypto.py +12 -13
  625. localstack/utils/diagnose.py +11 -12
  626. localstack/utils/docker_utils.py +11 -7
  627. localstack/utils/files.py +34 -15
  628. localstack/utils/functions.py +5 -4
  629. localstack/utils/http.py +14 -14
  630. localstack/utils/iputils.py +2 -1
  631. localstack/utils/json.py +21 -7
  632. localstack/utils/kinesis/kinesis_connector.py +2 -1
  633. localstack/utils/net.py +25 -17
  634. localstack/utils/no_exit_argument_parser.py +2 -2
  635. localstack/utils/numbers.py +9 -2
  636. localstack/utils/objects.py +15 -14
  637. localstack/utils/patch.py +14 -7
  638. localstack/utils/platform.py +2 -2
  639. localstack/utils/run.py +15 -14
  640. localstack/utils/scheduler.py +13 -12
  641. localstack/utils/server/tcp_proxy.py +2 -2
  642. localstack/utils/serving.py +3 -4
  643. localstack/utils/strings.py +15 -16
  644. localstack/utils/sync.py +126 -1
  645. localstack/utils/tagging.py +10 -8
  646. localstack/utils/testutil.py +17 -17
  647. localstack/utils/threads.py +3 -3
  648. localstack/utils/time.py +12 -4
  649. localstack/utils/urls.py +1 -3
  650. localstack/utils/xml.py +1 -1
  651. localstack/utils/xray/traceid.py +1 -1
  652. localstack/version.py +16 -3
  653. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/METADATA +18 -13
  654. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/RECORD +663 -655
  655. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/entry_points.txt +8 -4
  656. localstack_core-4.10.1.dev12.dist-info/plux.json +1 -0
  657. localstack/packages/terraform.py +0 -47
  658. localstack/services/cloudformation/deploy.html +0 -144
  659. localstack/services/cloudformation/deploy_ui.py +0 -47
  660. localstack/services/cloudformation/plugins.py +0 -12
  661. localstack/services/lambda_/lambda_debug_mode/ldm.py +0 -375
  662. localstack/services/lambda_/lambda_debug_mode/ldm_config_file.py +0 -178
  663. localstack/services/lambda_/lambda_debug_mode/ldm_types.py +0 -11
  664. localstack/services/lambda_/lambda_debug_mode/ldm_utils.py +0 -43
  665. localstack_core-4.6.1.dev60.dist-info/plux.json +0 -1
  666. /localstack/{services/lambda_/lambda_debug_mode/__init__.py → testing/pytest/cloudformation/transformers.py} +0 -0
  667. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack +0 -0
  668. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack-supervisor +0 -0
  669. {localstack_core-4.6.1.dev60.data → localstack_core-4.10.1.dev12.data}/scripts/localstack.bat +0 -0
  670. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/WHEEL +0 -0
  671. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/licenses/LICENSE.txt +0 -0
  672. {localstack_core-4.6.1.dev60.dist-info → localstack_core-4.10.1.dev12.dist-info}/top_level.txt +0 -0
@@ -1,14 +1,16 @@
1
1
  import logging
2
- from typing import NamedTuple, Optional, Set
2
+ from typing import NamedTuple
3
3
 
4
4
  from botocore.model import ServiceModel
5
5
  from werkzeug.exceptions import RequestEntityTooLarge
6
6
  from werkzeug.http import parse_dict_header
7
7
 
8
8
  from localstack.aws.spec import (
9
+ ProtocolName,
9
10
  ServiceCatalog,
10
11
  ServiceModelIdentifier,
11
12
  get_service_catalog,
13
+ is_protocol_in_service_model_identifier,
12
14
  )
13
15
  from localstack.http import Request
14
16
  from localstack.services.s3.utils import uses_host_addressing
@@ -17,6 +19,23 @@ from localstack.utils.strings import to_bytes
17
19
 
18
20
  LOG = logging.getLogger(__name__)
19
21
 
22
+ _PROTOCOL_DETECTION_PRIORITY: list[ProtocolName] = [
23
+ "smithy-rpc-v2-cbor",
24
+ "json",
25
+ "query",
26
+ "ec2",
27
+ "rest-json",
28
+ "rest-xml",
29
+ ]
30
+
31
+
32
+ class ProtocolError(Exception):
33
+ """
34
+ Error which is thrown if we cannot detect the protocol for the request.
35
+ """
36
+
37
+ pass
38
+
20
39
 
21
40
  class _ServiceIndicators(NamedTuple):
22
41
  """
@@ -28,21 +47,22 @@ class _ServiceIndicators(NamedTuple):
28
47
 
29
48
  # AWS service's "signing name" - Contained in the Authorization header
30
49
  # (https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html)
31
- signing_name: Optional[str] = None
50
+ signing_name: str | None = None
32
51
  # Target prefix as defined in the service specs for non-rest protocols - Contained in the X-Amz-Target header
33
- target_prefix: Optional[str] = None
52
+ target_prefix: str | None = None
34
53
  # Targeted operation as defined in the service specs for non-rest protocols - Contained in the X-Amz-Target header
35
- operation: Optional[str] = None
54
+ operation: str | None = None
36
55
  # Host field of the HTTP request
37
- host: Optional[str] = None
56
+ host: str | None = None
38
57
  # Path of the HTTP request
39
- path: Optional[str] = None
58
+ path: str | None = None
40
59
 
41
60
 
42
61
  def _extract_service_indicators(request: Request) -> _ServiceIndicators:
43
62
  """Extracts all different fields that might indicate which service a request is targeting."""
44
63
  x_amz_target = request.headers.get("x-amz-target")
45
64
  authorization = request.headers.get("authorization")
65
+ is_rpc_v2 = "rpc-v2-cbor" in request.headers.get("Smithy-Protocol", "")
46
66
 
47
67
  signing_name = None
48
68
  if authorization:
@@ -55,7 +75,15 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
55
75
  except (ValueError, KeyError):
56
76
  LOG.debug("auth header could not be parsed for service routing: %s", authorization)
57
77
  pass
58
- if x_amz_target:
78
+ if is_rpc_v2:
79
+ # https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#requests
80
+ rpc_v2_params = request.path.lstrip("/").split("/")
81
+ if len(rpc_v2_params) >= 4:
82
+ *_, service_shape_name, __, operation = rpc_v2_params
83
+ target_prefix = service_shape_name.split("#")[-1]
84
+ else:
85
+ target_prefix, operation = None, None
86
+ elif x_amz_target:
59
87
  if "." in x_amz_target:
60
88
  target_prefix, operation = x_amz_target.split(".", 1)
61
89
  else:
@@ -67,6 +95,48 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
67
95
  return _ServiceIndicators(signing_name, target_prefix, operation, request.host, request.path)
68
96
 
69
97
 
98
+ def _matches_protocol(request: Request, protocol: ProtocolName) -> bool:
99
+ headers = request.headers
100
+ mimetype = request.mimetype.lower()
101
+ match protocol:
102
+ case "smithy-rpc-v2-cbor":
103
+ # Every request for the rpcv2Cbor protocol MUST contain a `Smithy-Protocol` header with the value
104
+ # of `rpc-v2-cbor`.
105
+ # https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html
106
+ return headers.get("Smithy-Protocol", "") == "rpc-v2-cbor"
107
+ case "json":
108
+ return mimetype.startswith("application/x-amz-json")
109
+ case "query" | "ec2":
110
+ # https://smithy.io/2.0/aws/protocols/aws-query-protocol.html#request-serialization
111
+ return (
112
+ mimetype.startswith("application/x-www-form-urlencoded") or "Action" in request.args
113
+ )
114
+ case "rest-xml" | "rest-json":
115
+ # `rest-json` and `rest-xml` can accept any kind of Content-Type, and it can be configured on the operation
116
+ # level.
117
+ # https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html
118
+ return True
119
+ case _:
120
+ return False
121
+
122
+
123
+ def match_available_protocols(
124
+ request: Request, available_protocols: list[ProtocolName]
125
+ ) -> ProtocolName | None:
126
+ """
127
+ Tries to match the current request and determine the protocol used amongst the available protocols given.
128
+ We use a priority order to try to determine the protocol, as some protocols are more permissive that others.
129
+ :param request: the incoming request
130
+ :param available_protocols: the available protocols of the Service the request is directed to
131
+ :return: the protocol matched, if any
132
+ """
133
+ for protocol in _PROTOCOL_DETECTION_PRIORITY:
134
+ if protocol in available_protocols and _matches_protocol(request, protocol):
135
+ return protocol
136
+
137
+ return None
138
+
139
+
70
140
  signing_name_path_prefix_rules = {
71
141
  # custom rules based on URI path prefixes that are not easily generalizable
72
142
  "apigateway": {
@@ -111,7 +181,7 @@ signing_name_path_prefix_rules = {
111
181
  }
112
182
 
113
183
 
114
- def custom_signing_name_rules(signing_name: str, path: str) -> Optional[ServiceModelIdentifier]:
184
+ def custom_signing_name_rules(signing_name: str, path: str) -> ServiceModelIdentifier | None:
115
185
  """
116
186
  Rules which are based on the signing name (in the auth header) and the request path.
117
187
  """
@@ -134,7 +204,7 @@ def custom_signing_name_rules(signing_name: str, path: str) -> Optional[ServiceM
134
204
  return rules.get("*", ServiceModelIdentifier(signing_name))
135
205
 
136
206
 
137
- def custom_host_addressing_rules(host: str) -> Optional[ServiceModelIdentifier]:
207
+ def custom_host_addressing_rules(host: str) -> ServiceModelIdentifier | None:
138
208
  """
139
209
  Rules based on the host header of the request, which is typically the data plane of a service.
140
210
 
@@ -147,7 +217,7 @@ def custom_host_addressing_rules(host: str) -> Optional[ServiceModelIdentifier]:
147
217
  return ServiceModelIdentifier("s3")
148
218
 
149
219
 
150
- def custom_path_addressing_rules(path: str) -> Optional[ServiceModelIdentifier]:
220
+ def custom_path_addressing_rules(path: str) -> ServiceModelIdentifier | None:
151
221
  """
152
222
  Rules which are only based on the request path.
153
223
  """
@@ -159,7 +229,7 @@ def custom_path_addressing_rules(path: str) -> Optional[ServiceModelIdentifier]:
159
229
  return ServiceModelIdentifier("lambda")
160
230
 
161
231
 
162
- def legacy_s3_rules(request: Request) -> Optional[ServiceModelIdentifier]:
232
+ def legacy_s3_rules(request: Request) -> ServiceModelIdentifier | None:
163
233
  """
164
234
  *Legacy* rules which allow us to fallback to S3 if no other service was matched.
165
235
  All rules which are implemented here should be removed once we make sure it would not break any use-cases.
@@ -228,7 +298,7 @@ def legacy_s3_rules(request: Request) -> Optional[ServiceModelIdentifier]:
228
298
 
229
299
 
230
300
  def resolve_conflicts(
231
- candidates: Set[ServiceModelIdentifier], request: Request
301
+ candidates: set[ServiceModelIdentifier], request: Request
232
302
  ) -> ServiceModelIdentifier:
233
303
  """
234
304
  Some service definitions are overlapping to a point where they are _not_ distinguishable at all
@@ -248,17 +318,17 @@ def resolve_conflicts(
248
318
  # The `application/x-amz-json-1.0` header is mandatory for requests targeting SQS with the `json` protocol. We
249
319
  # can safely route them to the `sqs` JSON parser/serializer. If not present, route the request to the
250
320
  # sqs-query protocol.
251
- content_type = request.headers.get("Content-Type")
321
+ protocol = match_available_protocols(request, available_protocols=["json", "query"])
252
322
  return (
253
323
  ServiceModelIdentifier("sqs")
254
- if content_type == "application/x-amz-json-1.0"
324
+ if protocol == "json"
255
325
  else ServiceModelIdentifier("sqs", "query")
256
326
  )
257
327
 
258
328
 
259
329
  def determine_aws_service_model_for_data_plane(
260
330
  request: Request, services: ServiceCatalog = None
261
- ) -> Optional[ServiceModel]:
331
+ ) -> ServiceModel | None:
262
332
  """
263
333
  A stripped down version of ``determine_aws_service_model`` which only checks hostname indicators for
264
334
  the AWS data plane, such as s3 websites, lambda function URLs, or API gateway routes.
@@ -266,12 +336,30 @@ def determine_aws_service_model_for_data_plane(
266
336
  custom_host_match = custom_host_addressing_rules(request.host)
267
337
  if custom_host_match:
268
338
  services = services or get_service_catalog()
269
- return services.get(*custom_host_match)
339
+ return services.get(custom_host_match.name, custom_host_match.protocol)
340
+
341
+
342
+ def determine_aws_protocol(request: Request, service_model: ServiceModel) -> ProtocolName:
343
+ if not (protocols := service_model.metadata.get("protocols")):
344
+ # if the service does not define multiple protocols, return the `protocol` defined for the service
345
+ return service_model.protocol
346
+
347
+ if len(protocols) == 1:
348
+ return protocols[0]
349
+
350
+ if protocol := match_available_protocols(request, available_protocols=protocols):
351
+ return protocol
352
+
353
+ raise ProtocolError(
354
+ f"Could not determine the protocol for the request: "
355
+ f"{request.method} {request.path} for the service '{service_model.service_name}' "
356
+ f"(available protocols: {protocols})"
357
+ )
270
358
 
271
359
 
272
360
  def determine_aws_service_model(
273
361
  request: Request, services: ServiceCatalog = None
274
- ) -> Optional[ServiceModel]:
362
+ ) -> ServiceModel | None:
275
363
  """
276
364
  Tries to determine the name of the AWS service an incoming request is targeting.
277
365
  :param request: to determine the target service name of
@@ -287,12 +375,13 @@ def determine_aws_service_model(
287
375
  signing_name_candidates = services.by_signing_name(signing_name)
288
376
  if len(signing_name_candidates) == 1:
289
377
  # a unique signing-name -> service name mapping is the case for ~75% of service operations
290
- return services.get(*signing_name_candidates[0])
378
+ candidate = signing_name_candidates[0]
379
+ return services.get(candidate.name, candidate.protocol)
291
380
 
292
381
  # try to find a match with the custom signing name rules
293
382
  custom_match = custom_signing_name_rules(signing_name, path)
294
383
  if custom_match:
295
- return services.get(*custom_match)
384
+ return services.get(custom_match.name, custom_match.protocol)
296
385
 
297
386
  # still ambiguous - add the services to the list of candidates
298
387
  candidates.update(signing_name_candidates)
@@ -302,33 +391,34 @@ def determine_aws_service_model(
302
391
  target_candidates = services.by_target_prefix(target_prefix)
303
392
  if len(target_candidates) == 1:
304
393
  # a unique target prefix
305
- return services.get(*target_candidates[0])
394
+ candidate = target_candidates[0]
395
+ return services.get(candidate.name, candidate.protocol)
306
396
 
307
397
  # still ambiguous - add the services to the list of candidates
308
398
  candidates.update(target_candidates)
309
399
 
310
400
  # exclude services where the operation is not contained in the service spec
311
401
  for service_identifier in list(candidates):
312
- service = services.get(*service_identifier)
402
+ service = services.get(service_identifier.name, service_identifier.protocol)
313
403
  if operation not in service.operation_names:
314
404
  candidates.remove(service_identifier)
315
405
  else:
316
406
  # exclude services which have a target prefix (the current request does not have one)
317
407
  for service_identifier in list(candidates):
318
- service = services.get(*service_identifier)
408
+ service = services.get(service_identifier.name, service_identifier.protocol)
319
409
  if service.metadata.get("targetPrefix") is not None:
320
410
  candidates.remove(service_identifier)
321
411
 
322
412
  if len(candidates) == 1:
323
413
  service_identifier = candidates.pop()
324
- return services.get(*service_identifier)
414
+ return services.get(service_identifier.name, service_identifier.protocol)
325
415
 
326
416
  # 3. check the path if it is set and not a trivial root path
327
417
  if path and path != "/":
328
418
  # try to find a match with the custom path rules
329
419
  custom_path_match = custom_path_addressing_rules(path)
330
420
  if custom_path_match:
331
- return services.get(*custom_path_match)
421
+ return services.get(custom_path_match.name, custom_path_match.protocol)
332
422
 
333
423
  # 4. check the host (custom host addressing rules)
334
424
  if host:
@@ -337,12 +427,14 @@ def determine_aws_service_model(
337
427
  # this prevents a virtual host addressed bucket to be wrongly recognized
338
428
  if host.startswith(f"{prefix}.") and ".s3." not in host:
339
429
  if len(services_per_prefix) == 1:
340
- return services.get(*services_per_prefix[0])
430
+ candidate = services_per_prefix[0]
431
+ return services.get(candidate.name, candidate.protocol)
341
432
  candidates.update(services_per_prefix)
342
433
 
343
434
  custom_host_match = custom_host_addressing_rules(host)
344
435
  if custom_host_match:
345
- return services.get(*custom_host_match)
436
+ candidate = custom_host_match[0]
437
+ return services.get(candidate.name, candidate.protocol)
346
438
 
347
439
  if request.shallow:
348
440
  # from here on we would need access to the request body, which doesn't exist for shallow requests like
@@ -357,21 +449,28 @@ def determine_aws_service_model(
357
449
  query_candidates = [
358
450
  service
359
451
  for service in services.by_operation(values["Action"])
360
- if service.protocol in ("ec2", "query")
452
+ if any(
453
+ is_protocol_in_service_model_identifier(protocol, service)
454
+ for protocol in ("ec2", "query")
455
+ )
361
456
  ]
362
457
 
363
458
  if len(query_candidates) == 1:
364
- return services.get(*query_candidates[0])
459
+ candidate = query_candidates[0]
460
+ return services.get(candidate.name, candidate.protocol)
365
461
 
366
462
  if "Version" in values:
367
463
  for service_identifier in list(query_candidates):
368
- service_model = services.get(*service_identifier)
464
+ service_model = services.get(
465
+ service_identifier.name, service_identifier.protocol
466
+ )
369
467
  if values["Version"] != service_model.api_version:
370
468
  # the combination of Version and Action is not unique, add matches to the candidates
371
469
  query_candidates.remove(service_identifier)
372
470
 
373
471
  if len(query_candidates) == 1:
374
- return services.get(*query_candidates[0])
472
+ candidate = query_candidates[0]
473
+ return services.get(candidate.name, candidate.protocol)
375
474
 
376
475
  candidates.update(query_candidates)
377
476
 
@@ -387,15 +486,16 @@ def determine_aws_service_model(
387
486
  # 6. resolve service spec conflicts
388
487
  resolved_conflict = resolve_conflicts(candidates, request)
389
488
  if resolved_conflict:
390
- return services.get(*resolved_conflict)
489
+ return services.get(resolved_conflict.name, resolved_conflict.protocol)
391
490
 
392
491
  # 7. check the legacy S3 rules in the end
393
492
  legacy_match = legacy_s3_rules(request)
394
493
  if legacy_match:
395
- return services.get(*legacy_match)
494
+ return services.get(legacy_match.name, legacy_match.protocol)
396
495
 
397
496
  if signing_name:
398
497
  return services.get(name=signing_name)
399
498
  if candidates:
400
- return services.get(*candidates.pop())
499
+ candidate = candidates.pop()
500
+ return services.get(candidate.name, candidate.protocol)
401
501
  return None
@@ -1,6 +1,6 @@
1
1
  """Slightly extends the ``botocore.validate`` package to provide better integration with our parser/serializer."""
2
2
 
3
- from typing import Any, Dict, List, NamedTuple
3
+ from typing import Any, NamedTuple
4
4
 
5
5
  from botocore.model import OperationModel, Shape
6
6
  from botocore.validate import ParamValidator as BotocoreParamValidator
@@ -22,7 +22,7 @@ class Error(NamedTuple):
22
22
 
23
23
  reason: str
24
24
  name: str
25
- attributes: Dict[str, Any]
25
+ attributes: dict[str, Any]
26
26
 
27
27
 
28
28
  class ParameterValidationError(Exception):
@@ -88,11 +88,11 @@ class EmptyInput(ParameterValidationError):
88
88
 
89
89
 
90
90
  class ValidationErrors(BotocoreValidationErrors):
91
- def __init__(self, shape: Shape, params: Dict[str, Any]):
91
+ def __init__(self, shape: Shape, params: dict[str, Any]):
92
92
  super().__init__()
93
93
  self.shape = shape
94
94
  self.params = params
95
- self._exceptions: List[ParameterValidationError] = []
95
+ self._exceptions: list[ParameterValidationError] = []
96
96
 
97
97
  @property
98
98
  def exceptions(self):
@@ -133,7 +133,7 @@ class ValidationErrors(BotocoreValidationErrors):
133
133
 
134
134
 
135
135
  class ParamValidator(BotocoreParamValidator):
136
- def validate(self, params: Dict[str, Any], shape: Shape):
136
+ def validate(self, params: dict[str, Any], shape: Shape):
137
137
  """Validate parameters against a shape model.
138
138
 
139
139
  This method will validate the parameters against a provided shape model.
@@ -159,7 +159,7 @@ class ParamValidator(BotocoreParamValidator):
159
159
  if required_member in params and params[required_member] is None:
160
160
  params.pop(required_member)
161
161
 
162
- super(ParamValidator, self)._validate_structure(params, shape, errors, name)
162
+ super()._validate_structure(params, shape, errors, name)
163
163
 
164
164
 
165
165
  def validate_request(operation: OperationModel, request: ServiceRequest) -> ValidationErrors:
@@ -1,10 +1,10 @@
1
1
  import io
2
2
  import keyword
3
3
  import re
4
+ from collections import OrderedDict
4
5
  from functools import cached_property
5
6
  from multiprocessing import Pool
6
7
  from pathlib import Path
7
- from typing import Dict, List, Optional, Set
8
8
 
9
9
  import click
10
10
  from botocore import xform_name
@@ -18,7 +18,6 @@ from botocore.model import (
18
18
  StringShape,
19
19
  StructureShape,
20
20
  )
21
- from typing_extensions import OrderedDict
22
21
 
23
22
  from localstack.aws.spec import load_service
24
23
  from localstack.utils.common import camel_to_snake_case, snake_to_camel_case
@@ -75,7 +74,7 @@ class ShapeNode:
75
74
  self.shape = shape
76
75
 
77
76
  @cached_property
78
- def request_operation(self) -> Optional[OperationModel]:
77
+ def request_operation(self) -> OperationModel | None:
79
78
  for operation_name in self.service.operation_names:
80
79
  operation = self.service.operation_model(operation_name)
81
80
  if operation.input_shape is None:
@@ -89,7 +88,7 @@ class ShapeNode:
89
88
  return None
90
89
 
91
90
  @cached_property
92
- def response_operation(self) -> Optional[OperationModel]:
91
+ def response_operation(self) -> OperationModel | None:
93
92
  for operation_name in self.service.operation_names:
94
93
  operation = self.service.operation_model(operation_name)
95
94
  if operation.output_shape is None:
@@ -128,7 +127,7 @@ class ShapeNode:
128
127
  return isinstance(self.shape, StringShape) and self.shape.enum
129
128
 
130
129
  @property
131
- def dependencies(self) -> List[str]:
130
+ def dependencies(self) -> list[str]:
132
131
  shape = self.shape
133
132
 
134
133
  if isinstance(shape, StructureShape):
@@ -222,7 +221,7 @@ class ShapeNode:
222
221
 
223
222
  def _print_as_typed_dict(self, output, doc=True, quote_types=False):
224
223
  name = to_valid_python_name(self.shape.name)
225
- output.write('%s = TypedDict("%s", {\n' % (name, name))
224
+ output.write(f'{name} = TypedDict("{name}", {{\n')
226
225
  for k, v in self.shape.members.items():
227
226
  member_name = to_valid_python_name(v.name)
228
227
  # check if the member name is the same as the type name (recursive types need to use forward references)
@@ -327,7 +326,7 @@ def generate_service_types(output, service: ServiceModel, doc=True):
327
326
  output.write("\n")
328
327
 
329
328
  # ==================================== print type declarations
330
- nodes: Dict[str, ShapeNode] = {}
329
+ nodes: dict[str, ShapeNode] = {}
331
330
 
332
331
  for shape_name in service.shape_names:
333
332
  shape = service.shape_for(shape_name)
@@ -338,9 +337,9 @@ def generate_service_types(output, service: ServiceModel, doc=True):
338
337
  # output.write(f' "{name}",\n')
339
338
  # output.write("]\n")
340
339
 
341
- printed: Set[str] = set()
342
- visited: Set[str] = set()
343
- stack: List[str] = list(nodes.keys())
340
+ printed: set[str] = set()
341
+ visited: set[str] = set()
342
+ stack: list[str] = list(nodes.keys())
344
343
 
345
344
  stack = sorted(stack, key=lambda name: nodes[name].get_order())
346
345
  stack.reverse()
@@ -1,6 +1,5 @@
1
1
  import logging
2
2
  import threading
3
- from typing import List
4
3
 
5
4
  from rolo.gateway.wsgi import WsgiGateway
6
5
 
@@ -15,7 +14,7 @@ LOG = logging.getLogger(__name__)
15
14
 
16
15
 
17
16
  def serve_gateway(
18
- listen: HostAndPort | List[HostAndPort], use_ssl: bool, asynchronous: bool = False
17
+ listen: HostAndPort | list[HostAndPort], use_ssl: bool, asynchronous: bool = False
19
18
  ):
20
19
  """
21
20
  Implementation of the edge.do_start_edge_proxy interface to start a Hypercorn server instance serving the
@@ -37,7 +36,7 @@ def serve_gateway(
37
36
 
38
37
 
39
38
  def _serve_werkzeug(
40
- gateway: LocalstackAwsGateway, listen: List[HostAndPort], use_ssl: bool, asynchronous: bool
39
+ gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
41
40
  ):
42
41
  from werkzeug.serving import ThreadedWSGIServer
43
42
 
@@ -57,7 +56,7 @@ def _serve_werkzeug(
57
56
  params["ssl_context"] = (cert_file_name, key_file_name)
58
57
 
59
58
  threads = []
60
- servers: List[ThreadedWSGIServer] = []
59
+ servers: list[ThreadedWSGIServer] = []
61
60
 
62
61
  for host_port in listen:
63
62
  kwargs = dict(params)
@@ -90,7 +89,7 @@ def _serve_werkzeug(
90
89
 
91
90
 
92
91
  def _serve_hypercorn(
93
- gateway: LocalstackAwsGateway, listen: List[HostAndPort], use_ssl: bool, asynchronous: bool
92
+ gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
94
93
  ):
95
94
  from localstack.http.hypercorn import GatewayServer
96
95
 
@@ -112,7 +111,7 @@ def _serve_hypercorn(
112
111
 
113
112
 
114
113
  def _serve_twisted(
115
- gateway: LocalstackAwsGateway, listen: List[HostAndPort], use_ssl: bool, asynchronous: bool
114
+ gateway: LocalstackAwsGateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool
116
115
  ):
117
116
  from .twisted import serve_gateway
118
117
 
@@ -1,5 +1,5 @@
1
1
  import asyncio
2
- from typing import Any, Optional, Tuple
2
+ from typing import Any
3
3
 
4
4
  from hypercorn import Config
5
5
  from hypercorn.asyncio import serve as serve_hypercorn
@@ -15,7 +15,7 @@ def serve(
15
15
  host: str = "localhost",
16
16
  port: int = constants.DEFAULT_PORT_EDGE,
17
17
  use_reloader: bool = True,
18
- ssl_creds: Optional[Tuple[Any, Any]] = None,
18
+ ssl_creds: tuple[Any, Any] | None = None,
19
19
  **kwargs,
20
20
  ) -> None:
21
21
  """
@@ -4,7 +4,6 @@ Bindings to serve LocalStack using twisted.
4
4
 
5
5
  import logging
6
6
  import time
7
- from typing import List
8
7
 
9
8
  from rolo.gateway import Gateway
10
9
  from rolo.serving.twisted import TwistedGateway
@@ -130,7 +129,7 @@ def stop_thread_pool(self: ThreadPool, stop, timeout: float = None):
130
129
 
131
130
 
132
131
  def serve_gateway(
133
- gateway: Gateway, listen: List[HostAndPort], use_ssl: bool, asynchronous: bool = False
132
+ gateway: Gateway, listen: list[HostAndPort], use_ssl: bool, asynchronous: bool = False
134
133
  ):
135
134
  """
136
135
  Serve a Gateway instance using twisted.
@@ -1,5 +1,5 @@
1
1
  import ssl
2
- from typing import TYPE_CHECKING, Any, Optional, Tuple
2
+ from typing import TYPE_CHECKING, Any
3
3
 
4
4
  from rolo.gateway import Gateway
5
5
  from rolo.gateway.wsgi import WsgiGateway
@@ -17,7 +17,7 @@ def serve(
17
17
  host: str = "localhost",
18
18
  port: int = constants.DEFAULT_PORT_EDGE,
19
19
  use_reloader: bool = True,
20
- ssl_creds: Optional[Tuple[Any, Any]] = None,
20
+ ssl_creds: tuple[Any, Any] | None = None,
21
21
  **kwargs,
22
22
  ) -> None:
23
23
  """
@@ -1,6 +1,7 @@
1
1
  import inspect
2
2
  import logging
3
- from typing import Any, Callable, Dict, NamedTuple, Optional, Union
3
+ from collections.abc import Callable
4
+ from typing import Any, NamedTuple
4
5
 
5
6
  from botocore import xform_name
6
7
  from botocore.model import ServiceModel
@@ -20,10 +21,10 @@ from localstack.utils.coverage_docs import get_coverage_link_for_service
20
21
 
21
22
  LOG = logging.getLogger(__name__)
22
23
 
23
- DispatchTable = Dict[str, ServiceRequestHandler]
24
+ DispatchTable = dict[str, ServiceRequestHandler]
24
25
 
25
26
 
26
- def create_skeleton(service: Union[str, ServiceModel], delegate: Any):
27
+ def create_skeleton(service: str | ServiceModel, delegate: Any):
27
28
  if isinstance(service, str):
28
29
  service = load_service(service)
29
30
 
@@ -49,10 +50,10 @@ def create_dispatch_table(delegate: object) -> DispatchTable:
49
50
  # scan class tree for @handler wrapped functions (reverse class tree so that inherited functions overwrite parent
50
51
  # functions)
51
52
  cls_tree = inspect.getmro(delegate.__class__)
52
- handlers: Dict[str, HandlerAttributes] = {}
53
+ handlers: dict[str, HandlerAttributes] = {}
53
54
  cls_tree = reversed(list(cls_tree))
54
55
  for cls in cls_tree:
55
- if cls == object:
56
+ if cls is object:
56
57
  continue
57
58
 
58
59
  for name, fn in inspect.getmembers(cls, inspect.isfunction):
@@ -98,9 +99,7 @@ class ServiceRequestDispatcher:
98
99
  self.pass_context = pass_context
99
100
  self.expand_parameters = expand_parameters
100
101
 
101
- def __call__(
102
- self, context: RequestContext, request: ServiceRequest
103
- ) -> Optional[ServiceResponse]:
102
+ def __call__(self, context: RequestContext, request: ServiceRequest) -> ServiceResponse | None:
104
103
  args = []
105
104
  kwargs = {}
106
105
 
@@ -122,7 +121,7 @@ class Skeleton:
122
121
  service: ServiceModel
123
122
  dispatch_table: DispatchTable
124
123
 
125
- def __init__(self, service: ServiceModel, implementation: Union[Any, DispatchTable]):
124
+ def __init__(self, service: ServiceModel, implementation: Any | DispatchTable):
126
125
  self.service = service
127
126
 
128
127
  if isinstance(implementation, dict):
@@ -131,14 +130,16 @@ class Skeleton:
131
130
  self.dispatch_table = create_dispatch_table(implementation)
132
131
 
133
132
  def invoke(self, context: RequestContext) -> Response:
134
- serializer = create_serializer(context.service)
133
+ serializer = create_serializer(context.service, context.protocol)
135
134
 
136
135
  if context.operation and context.service_request:
137
136
  # if the parsed request is already set in the context, re-use them
138
137
  operation, instance = context.operation, context.service_request
139
138
  else:
140
139
  # otherwise, parse the incoming HTTPRequest
141
- operation, instance = create_parser(context.service).parse(context.request)
140
+ operation, instance = create_parser(context.service, context.protocol).parse(
141
+ context.request
142
+ )
142
143
  context.operation = operation
143
144
 
144
145
  try: