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,6 +1,6 @@
1
1
  import logging
2
2
  from collections import defaultdict
3
- from typing import Iterable
3
+ from collections.abc import Iterable
4
4
 
5
5
  from werkzeug.datastructures.headers import Headers
6
6
 
@@ -4,7 +4,7 @@ import random
4
4
  import re
5
5
  import time
6
6
  from secrets import token_hex
7
- from typing import Type, TypedDict
7
+ from typing import TypedDict
8
8
 
9
9
  from moto.apigateway.models import RestAPI as MotoRestAPI
10
10
 
@@ -115,7 +115,7 @@ def get_lambda_function_arn_from_invocation_uri(uri: str) -> str:
115
115
  return uri.split("functions/")[1].removesuffix("/invocations")
116
116
 
117
117
 
118
- def validate_sub_dict_of_typed_dict(typed_dict: Type[TypedDict], obj: dict) -> bool:
118
+ def validate_sub_dict_of_typed_dict(typed_dict: type[TypedDict], obj: dict) -> bool:
119
119
  """
120
120
  Validate that the object is a subset off the keys of a given `TypedDict`.
121
121
  :param typed_dict: the `TypedDict` blueprint
@@ -3,7 +3,7 @@ import json
3
3
  import logging
4
4
  from functools import lru_cache
5
5
  from http import HTTPMethod
6
- from typing import Literal, Optional, TypedDict
6
+ from typing import Literal, TypedDict
7
7
  from urllib.parse import urlparse
8
8
 
9
9
  import requests
@@ -51,11 +51,11 @@ NO_BODY_METHODS = {
51
51
 
52
52
 
53
53
  class LambdaProxyResponse(TypedDict, total=False):
54
- body: Optional[str]
55
- statusCode: Optional[int | str]
56
- headers: Optional[dict[str, str]]
57
- isBase64Encoded: Optional[bool]
58
- multiValueHeaders: Optional[dict[str, list[str]]]
54
+ body: str | None
55
+ statusCode: int | str | None
56
+ headers: dict[str, str] | None
57
+ isBase64Encoded: bool | None
58
+ multiValueHeaders: dict[str, list[str]] | None
59
59
 
60
60
 
61
61
  class LambdaInputEvent(TypedDict, total=False):
@@ -211,6 +211,9 @@ class RestApiAwsIntegration(RestApiIntegration):
211
211
  action = parsed_uri["path"]
212
212
 
213
213
  if target := self.get_action_service_target(service_name, action):
214
+ # TODO: properly implement the auto-`Content-Type` headers depending on the service protocol
215
+ # e.g. `x-amz-json-1.0` for DynamoDB
216
+ # this is needed to properly support multi-protocol
214
217
  headers["X-Amz-Target"] = target
215
218
 
216
219
  query_params["Action"] = action
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
  from http import HTTPMethod
3
- from typing import Optional, TypedDict
3
+ from typing import TypedDict
4
4
 
5
5
  import requests
6
6
  from werkzeug.datastructures import Headers
@@ -8,7 +8,7 @@ from werkzeug.datastructures import Headers
8
8
  from localstack.aws.api.apigateway import Integration
9
9
 
10
10
  from ..context import EndpointResponse, IntegrationRequest, RestApiInvocationContext
11
- from ..gateway_response import ApiConfigurationError, IntegrationFailureError
11
+ from ..gateway_response import ApiConfigurationError, IntegrationFailureError, InternalServerError
12
12
  from ..header_utils import build_multi_value_headers
13
13
  from .core import RestApiIntegration
14
14
 
@@ -20,16 +20,16 @@ NO_BODY_METHODS = {HTTPMethod.OPTIONS, HTTPMethod.GET, HTTPMethod.HEAD}
20
20
  class SimpleHttpRequest(TypedDict, total=False):
21
21
  method: HTTPMethod | str
22
22
  url: str
23
- params: Optional[dict[str, str | list[str]]]
23
+ params: dict[str, str | list[str]] | None
24
24
  data: bytes
25
- headers: Optional[dict[str, str]]
26
- cookies: Optional[dict[str, str]]
27
- timeout: Optional[int]
28
- allow_redirects: Optional[bool]
29
- stream: Optional[bool]
30
- verify: Optional[bool]
25
+ headers: dict[str, str] | None
26
+ cookies: dict[str, str] | None
27
+ timeout: int | None
28
+ allow_redirects: bool | None
29
+ stream: bool | None
30
+ verify: bool | None
31
31
  # TODO: check if there was a situation where we'd pass certs?
32
- cert: Optional[str | tuple[str, str]]
32
+ cert: str | tuple[str, str] | None
33
33
 
34
34
 
35
35
  class BaseRestApiHttpIntegration(RestApiIntegration):
@@ -72,7 +72,7 @@ class RestApiHttpIntegration(BaseRestApiHttpIntegration):
72
72
  except (requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema) as e:
73
73
  LOG.warning("Execution failed due to configuration error: Invalid endpoint address")
74
74
  LOG.debug("The URI specified for the HTTP/HTTP_PROXY integration is invalid: %s", uri)
75
- raise ApiConfigurationError("Internal server error") from e
75
+ raise InternalServerError("Internal server error") from e
76
76
 
77
77
  except (requests.exceptions.Timeout, requests.exceptions.SSLError) as e:
78
78
  # TODO make the exception catching more fine grained
@@ -127,7 +127,7 @@ class RestApiHttpProxyIntegration(BaseRestApiHttpIntegration):
127
127
  except (requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema) as e:
128
128
  LOG.warning("Execution failed due to configuration error: Invalid endpoint address")
129
129
  LOG.debug("The URI specified for the HTTP/HTTP_PROXY integration is invalid: %s", uri)
130
- raise ApiConfigurationError("Internal server error") from e
130
+ raise InternalServerError("Internal server error") from e
131
131
 
132
132
  except (requests.exceptions.Timeout, requests.exceptions.SSLError):
133
133
  # TODO make the exception catching more fine grained
@@ -33,6 +33,7 @@ class RouteHostPathParameters(TypedDict, total=False):
33
33
  server: str | None
34
34
  stage: str | None
35
35
  vpce_suffix: str | None
36
+ vpce_dns: str | None
36
37
 
37
38
 
38
39
  class ApiGatewayEndpoint:
@@ -144,6 +145,13 @@ class ApiGatewayEndpoint:
144
145
  )
145
146
  return not_found
146
147
 
148
+ def vpc_endpoint_handler(
149
+ self, request: Request, **kwargs: Unpack[RouteHostPathParameters]
150
+ ) -> Response:
151
+ # TODO validate the vpc endpoint exists in the account/region before routing
152
+ kwargs["api_id"] = request.headers.get("x-apigw-api-id")
153
+ return self.__call__(request, **kwargs)
154
+
147
155
 
148
156
  class ApiGatewayRouter:
149
157
  router: Router[Handler]
@@ -158,6 +166,9 @@ class ApiGatewayRouter:
158
166
  def register_routes(self) -> None:
159
167
  LOG.debug("Registering API Gateway routes.")
160
168
  host_pattern = "<regex('.+?'):api_id><regex('(-vpce-[^.]+)?'):vpce_suffix>.execute-api.<regex('.*'):server>"
169
+ vpce_host_pattern = (
170
+ "<regex('vpce-.+'):vpce_dns>.execute-api.<regex('.*'):region>vpce.<regex('.*'):server>"
171
+ )
161
172
  deprecated_route_endpoint = deprecated_endpoint(
162
173
  endpoint=self.handler,
163
174
  previous_path="/restapis/<api_id>/<stage>/_user_request_",
@@ -214,6 +225,26 @@ class ApiGatewayRouter:
214
225
  endpoint=self.handler,
215
226
  strict_slashes=True,
216
227
  ),
228
+ self.router.add(
229
+ path="/",
230
+ host=vpce_host_pattern,
231
+ endpoint=self.handler.vpc_endpoint_handler,
232
+ defaults={"path": "", "stage": None},
233
+ strict_slashes=True,
234
+ ),
235
+ self.router.add(
236
+ path="/<stage>/",
237
+ host=vpce_host_pattern,
238
+ endpoint=self.handler.vpc_endpoint_handler,
239
+ defaults={"path": ""},
240
+ strict_slashes=False,
241
+ ),
242
+ self.router.add(
243
+ path="/<stage>/<greedy_path:path>",
244
+ host=vpce_host_pattern,
245
+ endpoint=self.handler.vpc_endpoint_handler,
246
+ strict_slashes=True,
247
+ ),
217
248
  ]
218
249
  for rule in rules:
219
250
  self.registered_rules.append(rule)
@@ -109,7 +109,7 @@ class VTLJsonList(list):
109
109
  """
110
110
 
111
111
  def __init__(self, *args):
112
- super(VTLJsonList, self).__init__(*args)
112
+ super().__init__(*args)
113
113
  for idx, item in enumerate(self):
114
114
  self[idx] = cast_to_vtl_json_object(item)
115
115
 
@@ -138,7 +138,7 @@ class AttributeDict(dict):
138
138
  """
139
139
 
140
140
  def __init__(self, *args, **kwargs):
141
- super(AttributeDict, self).__init__(*args, **kwargs)
141
+ super().__init__(*args, **kwargs)
142
142
  for key, value in self.items():
143
143
  if isinstance(value, dict):
144
144
  self[key] = AttributeDict(value)
@@ -1,4 +1,5 @@
1
1
  import datetime
2
+ import logging
2
3
  from urllib.parse import parse_qs
3
4
 
4
5
  from rolo import Request
@@ -22,6 +23,9 @@ from .variables import (
22
23
  ContextVarsResponseOverride,
23
24
  )
24
25
 
26
+ LOG = logging.getLogger(__name__)
27
+
28
+
25
29
  # TODO: we probably need to write and populate those logs as part of the handler chain itself
26
30
  # and store it in the InvocationContext. That way, we could also retrieve in when calling TestInvoke
27
31
 
@@ -45,6 +49,30 @@ TEST_INVOKE_TEMPLATE = """Execution log for request {request_id}
45
49
  {formatted_date} : Method completed with status: {method_response_status}
46
50
  """
47
51
 
52
+ TEST_INVOKE_TEMPLATE_MOCK = """Execution log for request {request_id}
53
+ {formatted_date} : Starting execution for request: {request_id}
54
+ {formatted_date} : HTTP Method: {request_method}, Resource Path: {resource_path}
55
+ {formatted_date} : Method request path: {method_request_path_parameters}
56
+ {formatted_date} : Method request query string: {method_request_query_string}
57
+ {formatted_date} : Method request headers: {method_request_headers}
58
+ {formatted_date} : Method request body before transformations: {method_request_body}
59
+ {formatted_date} : Method response body after transformations: {method_response_body}
60
+ {formatted_date} : Method response headers: {method_response_headers}
61
+ {formatted_date} : Successfully completed execution
62
+ {formatted_date} : Method completed with status: {method_response_status}
63
+ """
64
+
65
+ TEST_INVOKE_TEMPLATE_FAILED = """Execution log for request {request_id}
66
+ {formatted_date} : Starting execution for request: {request_id}
67
+ {formatted_date} : HTTP Method: {request_method}, Resource Path: {resource_path}
68
+ {formatted_date} : Method request path: {method_request_path_parameters}
69
+ {formatted_date} : Method request query string: {method_request_query_string}
70
+ {formatted_date} : Method request headers: {method_request_headers}
71
+ {formatted_date} : Method request body before transformations: {method_request_body}
72
+ {formatted_date} : Execution failed due to {error_type}: {error_message}
73
+ {formatted_date} : Method completed with status: {method_response_status}
74
+ """
75
+
48
76
 
49
77
  def _dump_headers(headers: Headers) -> str:
50
78
  if not headers:
@@ -63,9 +91,9 @@ def log_template(invocation_context: RestApiInvocationContext, response_headers:
63
91
  formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
64
92
  request = invocation_context.invocation_request
65
93
  context_var = invocation_context.context_variables
66
- integration_req = invocation_context.integration_request
67
- endpoint_resp = invocation_context.endpoint_response
68
- method_resp = invocation_context.invocation_response
94
+ integration_req = invocation_context.integration_request or {}
95
+ endpoint_resp = invocation_context.endpoint_response or {}
96
+ method_resp = invocation_context.invocation_response or {}
69
97
  # TODO: if endpoint_uri is an ARN, it means it's an AWS_PROXY integration
70
98
  # this should be transformed to the true URL of a lambda invoke call
71
99
  endpoint_uri = integration_req.get("uri", "")
@@ -93,6 +121,52 @@ def log_template(invocation_context: RestApiInvocationContext, response_headers:
93
121
  )
94
122
 
95
123
 
124
+ def log_mock_template(
125
+ invocation_context: RestApiInvocationContext, response_headers: Headers
126
+ ) -> str:
127
+ formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
128
+ request = invocation_context.invocation_request
129
+ context_var = invocation_context.context_variables
130
+ method_resp = invocation_context.invocation_response or {}
131
+
132
+ return TEST_INVOKE_TEMPLATE_MOCK.format(
133
+ formatted_date=formatted_date,
134
+ request_id=context_var["requestId"],
135
+ resource_path=request["path"],
136
+ request_method=request["http_method"],
137
+ method_request_path_parameters=dict_to_string(request["path_parameters"]),
138
+ method_request_query_string=dict_to_string(request["query_string_parameters"]),
139
+ method_request_headers=_dump_headers(request.get("headers")),
140
+ method_request_body=to_str(request.get("body", "")),
141
+ method_response_status=method_resp.get("status_code"),
142
+ method_response_body=to_str(method_resp.get("body", "")),
143
+ method_response_headers=_dump_headers(response_headers),
144
+ )
145
+
146
+
147
+ def log_failed_template(
148
+ invocation_context: RestApiInvocationContext, response_status_code: int
149
+ ) -> str:
150
+ formatted_date = datetime.datetime.now(tz=datetime.UTC).strftime("%a %b %d %H:%M:%S %Z %Y")
151
+ request = invocation_context.invocation_request
152
+ context_var = invocation_context.context_variables
153
+
154
+ return TEST_INVOKE_TEMPLATE_FAILED.format(
155
+ formatted_date=formatted_date,
156
+ request_id=context_var["requestId"],
157
+ resource_path=request["path"],
158
+ request_method=request["http_method"],
159
+ method_request_path_parameters=dict_to_string(request["path_parameters"]),
160
+ method_request_query_string=dict_to_string(request["query_string_parameters"]),
161
+ method_request_headers=_dump_headers(request.get("headers")),
162
+ method_request_body=to_str(request.get("body", "")),
163
+ method_response_status=response_status_code,
164
+ # TODO: fix the error message
165
+ error_type="",
166
+ error_message="",
167
+ )
168
+
169
+
96
170
  def create_test_chain() -> HandlerChain[RestApiInvocationContext]:
97
171
  return HandlerChain(
98
172
  request_handlers=[
@@ -114,13 +188,16 @@ def create_test_invocation_context(
114
188
  ) -> RestApiInvocationContext:
115
189
  parse_handler = handlers.parse_request
116
190
  http_method = test_request["httpMethod"]
191
+ resource = deployment.rest_api.resources[test_request["resourceId"]]
192
+ resource_path = resource["path"]
117
193
 
118
194
  # we do not need a true HTTP request for the context, as we are skipping all the parsing steps and using the
119
195
  # provider data
120
196
  invocation_context = RestApiInvocationContext(
121
197
  request=Request(method=http_method),
122
198
  )
123
- path_query = test_request.get("pathWithQueryString", "/").split("?")
199
+ test_request_path = test_request.get("pathWithQueryString") or resource_path
200
+ path_query = test_request_path.split("?")
124
201
  path = path_query[0]
125
202
  multi_query_args: dict[str, list[str]] = {}
126
203
 
@@ -140,9 +217,22 @@ def create_test_invocation_context(
140
217
  # TODO: handle multiValueHeaders
141
218
  body=to_bytes(test_request.get("body") or ""),
142
219
  )
220
+
143
221
  invocation_context.invocation_request = invocation_request
222
+ try:
223
+ # this is AWS behavior, it will accept any value for the `pathWithQueryString`, even if it doesn't match
224
+ # the expected format. It will just fall back to no value if it cannot parse the path parameters out of it
225
+ _, path_parameters = RestAPIResourceRouter(deployment).match(invocation_context)
226
+ except Exception as e:
227
+ LOG.warning(
228
+ "Error while trying to extract path parameters from user-provided 'pathWithQueryString=%s' "
229
+ "for the following resource path: '%s'. Error: '%s'",
230
+ path,
231
+ resource_path,
232
+ e,
233
+ )
234
+ path_parameters = {}
144
235
 
145
- _, path_parameters = RestAPIResourceRouter(deployment).match(invocation_context)
146
236
  invocation_request["path_parameters"] = path_parameters
147
237
 
148
238
  invocation_context.deployment = deployment
@@ -160,8 +250,9 @@ def create_test_invocation_context(
160
250
  responseOverride=ContextVarsResponseOverride(header={}, status=0),
161
251
  )
162
252
  invocation_context.trace_id = parse_handler.populate_trace_id({})
163
- resource = deployment.rest_api.resources[test_request["resourceId"]]
164
- resource_method = resource["resourceMethods"][http_method]
253
+ resource_method = (
254
+ resource["resourceMethods"].get(http_method) or resource["resourceMethods"]["ANY"]
255
+ )
165
256
  invocation_context.resource = resource
166
257
  invocation_context.resource_method = resource_method
167
258
  invocation_context.integration = resource_method["methodIntegration"]
@@ -179,8 +270,10 @@ def run_test_invocation(
179
270
  invocation_context = create_test_invocation_context(test_request, deployment)
180
271
 
181
272
  test_chain = create_test_chain()
273
+ is_mock_integration = invocation_context.integration["type"] == "MOCK"
274
+
182
275
  # header order is important
183
- if invocation_context.integration["type"] == "MOCK":
276
+ if is_mock_integration:
184
277
  base_headers = {"Content-Type": APPLICATION_JSON}
185
278
  else:
186
279
  # we manually add the trace-id, as it is normally added by handlers.response_enricher which adds to much data
@@ -199,7 +292,19 @@ def run_test_invocation(
199
292
  # AWS does not return the Content-Length for TestInvokeMethod
200
293
  response_headers.remove("Content-Length")
201
294
 
202
- log = log_template(invocation_context, response_headers)
295
+ if not invocation_context.invocation_response:
296
+ # TODO: this is an heuristic to guess if we encounter an exception in the call
297
+ # in the future, we should attach the exception to the context so we could act on it and properly
298
+ # log as we go through the invocation, so that if we have an error we stop logging at the right moment
299
+ for header in ("Content-Type", "X-Amzn-Trace-Id"):
300
+ response_headers.remove(header)
301
+ log = log_failed_template(invocation_context, test_response.status_code)
302
+
303
+ elif is_mock_integration:
304
+ # TODO: revisit how we're building the logs
305
+ log = log_mock_template(invocation_context, response_headers)
306
+ else:
307
+ log = log_template(invocation_context, response_headers)
203
308
 
204
309
  headers = dict(response_headers)
205
310
  multi_value_headers = build_multi_value_headers(response_headers)
@@ -1,4 +1,4 @@
1
- from typing import Optional, TypedDict
1
+ from typing import TypedDict
2
2
 
3
3
 
4
4
  class ContextVarsAuthorizer(TypedDict, total=False):
@@ -6,9 +6,9 @@ class ContextVarsAuthorizer(TypedDict, total=False):
6
6
  # format
7
7
 
8
8
  # https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
9
- claims: Optional[dict[str, str]]
9
+ claims: dict[str, str] | None
10
10
  """Claims returned from the Amazon Cognito user pool after the method caller is successfully authenticated"""
11
- principalId: Optional[str]
11
+ principalId: str | None
12
12
  """The principal user identification associated with the token sent by the client and returned from an API Gateway Lambda authorizer"""
13
13
 
14
14
 
@@ -29,38 +29,38 @@ class ContextVarsIdentityClientCert(TypedDict, total=False):
29
29
 
30
30
  class ContextVarsIdentity(TypedDict, total=False):
31
31
  # https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
32
- accountId: Optional[str]
32
+ accountId: str | None
33
33
  """The AWS account ID associated with the request."""
34
- accessKey: Optional[str]
34
+ accessKey: str | None
35
35
  """The AWS access key associated with the request."""
36
- apiKey: Optional[str]
36
+ apiKey: str | None
37
37
  """For API methods that require an API key, this variable is the API key associated with the method request."""
38
- apiKeyId: Optional[str]
38
+ apiKeyId: str | None
39
39
  """The API key ID associated with an API request that requires an API key."""
40
- caller: Optional[str]
40
+ caller: str | None
41
41
  """The principal identifier of the caller that signed the request. Supported for resources that use IAM authorization."""
42
- cognitoAuthenticationProvider: Optional[str]
42
+ cognitoAuthenticationProvider: str | None
43
43
  """A comma-separated list of the Amazon Cognito authentication providers used by the caller making the request"""
44
- cognitoAuthenticationType: Optional[str]
44
+ cognitoAuthenticationType: str | None
45
45
  """The Amazon Cognito authentication type of the caller making the request"""
46
- cognitoIdentityId: Optional[str]
46
+ cognitoIdentityId: str | None
47
47
  """The Amazon Cognito identity ID of the caller making the request"""
48
- cognitoIdentityPoolId: Optional[str]
48
+ cognitoIdentityPoolId: str | None
49
49
  """The Amazon Cognito identity pool ID of the caller making the request"""
50
- principalOrgId: Optional[str]
50
+ principalOrgId: str | None
51
51
  """The AWS organization ID."""
52
- sourceIp: Optional[str]
52
+ sourceIp: str | None
53
53
  """The source IP address of the immediate TCP connection making the request to the API Gateway endpoint"""
54
54
  clientCert: ContextVarsIdentityClientCert
55
- vpcId: Optional[str]
55
+ vpcId: str | None
56
56
  """The VPC ID of the VPC making the request to the API Gateway endpoint."""
57
- vpceId: Optional[str]
57
+ vpceId: str | None
58
58
  """The VPC endpoint ID of the VPC endpoint making the request to the API Gateway endpoint."""
59
- user: Optional[str]
59
+ user: str | None
60
60
  """The principal identifier of the user that will be authorized against resource access for resources that use IAM authorization."""
61
- userAgent: Optional[str]
61
+ userAgent: str | None
62
62
  """The User-Agent header of the API caller."""
63
- userArn: Optional[str]
63
+ userArn: str | None
64
64
  """The Amazon Resource Name (ARN) of the effective user identified after authentication."""
65
65
 
66
66
 
@@ -95,9 +95,9 @@ class ContextVariables(TypedDict, total=False):
95
95
  """The API owner's AWS account ID."""
96
96
  apiId: str
97
97
  """The identifier API Gateway assigns to your API."""
98
- authorizer: Optional[ContextVarsAuthorizer]
98
+ authorizer: ContextVarsAuthorizer | None
99
99
  """The principal user identification associated with the token."""
100
- awsEndpointRequestId: Optional[str]
100
+ awsEndpointRequestId: str | None
101
101
  """The AWS endpoint's request ID."""
102
102
  deploymentId: str
103
103
  """The ID of the API deployment."""
@@ -111,8 +111,8 @@ class ContextVariables(TypedDict, total=False):
111
111
  """The extended ID that API Gateway generates and assigns to the API request. """
112
112
  httpMethod: str
113
113
  """The HTTP method used"""
114
- identity: Optional[ContextVarsIdentity]
115
- isCanaryRequest: Optional[bool]
114
+ identity: ContextVarsIdentity | None
115
+ isCanaryRequest: bool | None
116
116
  """Indicates if the request was directed to the canary"""
117
117
  path: str
118
118
  """The request path."""
@@ -120,76 +120,76 @@ class ContextVariables(TypedDict, total=False):
120
120
  """The request protocol"""
121
121
  requestId: str
122
122
  """An ID for the request. Clients can override this request ID. """
123
- requestOverride: Optional[ContextVarsRequestOverride]
123
+ requestOverride: ContextVarsRequestOverride | None
124
124
  """Request override. Only exists for request mapping template"""
125
125
  requestTime: str
126
126
  """The CLF-formatted request time (dd/MMM/yyyy:HH:mm:ss +-hhmm)."""
127
127
  requestTimeEpoch: int
128
128
  """The Epoch-formatted request time, in milliseconds."""
129
- resourceId: Optional[str]
129
+ resourceId: str | None
130
130
  """The identifier that API Gateway assigns to your resource."""
131
- resourcePath: Optional[str]
131
+ resourcePath: str | None
132
132
  """The path to your resource"""
133
- responseOverride: Optional[ContextVarsResponseOverride]
133
+ responseOverride: ContextVarsResponseOverride | None
134
134
  """Response override. Only exists for response mapping template"""
135
135
  stage: str
136
136
  """The deployment stage of the API request """
137
- wafResponseCode: Optional[str]
137
+ wafResponseCode: str | None
138
138
  """The response received from AWS WAF: WAF_ALLOW or WAF_BLOCK. Will not be set if the stage is not associated with a web ACL"""
139
- webaclArn: Optional[str]
139
+ webaclArn: str | None
140
140
  """The complete ARN of the web ACL that is used to decide whether to allow or block the request. Will not be set if the stage is not associated with a web ACL."""
141
141
 
142
142
 
143
143
  class LoggingContextVarsAuthorize(TypedDict, total=False):
144
- error: Optional[str]
145
- latency: Optional[str]
146
- status: Optional[str]
144
+ error: str | None
145
+ latency: str | None
146
+ status: str | None
147
147
 
148
148
 
149
149
  class LoggingContextVarsAuthorizer(TypedDict, total=False):
150
- error: Optional[str]
151
- integrationLatency: Optional[str]
152
- integrationStatus: Optional[str]
153
- latency: Optional[str]
154
- requestId: Optional[str]
155
- status: Optional[str]
150
+ error: str | None
151
+ integrationLatency: str | None
152
+ integrationStatus: str | None
153
+ latency: str | None
154
+ requestId: str | None
155
+ status: str | None
156
156
 
157
157
 
158
158
  class LoggingContextVarsAuthenticate(TypedDict, total=False):
159
- error: Optional[str]
160
- latency: Optional[str]
161
- status: Optional[str]
159
+ error: str | None
160
+ latency: str | None
161
+ status: str | None
162
162
 
163
163
 
164
164
  class LoggingContextVarsCustomDomain(TypedDict, total=False):
165
- basePathMatched: Optional[str]
165
+ basePathMatched: str | None
166
166
 
167
167
 
168
168
  class LoggingContextVarsIntegration(TypedDict, total=False):
169
- error: Optional[str]
170
- integrationStatus: Optional[str]
171
- latency: Optional[str]
172
- requestId: Optional[str]
173
- status: Optional[str]
169
+ error: str | None
170
+ integrationStatus: str | None
171
+ latency: str | None
172
+ requestId: str | None
173
+ status: str | None
174
174
 
175
175
 
176
176
  class LoggingContextVarsWaf(TypedDict, total=False):
177
- error: Optional[str]
178
- latency: Optional[str]
179
- status: Optional[str]
177
+ error: str | None
178
+ latency: str | None
179
+ status: str | None
180
180
 
181
181
 
182
182
  class LoggingContextVariables(TypedDict, total=False):
183
- authorize: Optional[LoggingContextVarsAuthorize]
184
- authorizer: Optional[LoggingContextVarsAuthorizer]
185
- authenticate: Optional[LoggingContextVarsAuthenticate]
186
- customDomain: Optional[LoggingContextVarsCustomDomain]
187
- endpointType: Optional[str]
188
- integration: Optional[LoggingContextVarsIntegration]
189
- integrationLatency: Optional[str]
190
- integrationStatus: Optional[str]
191
- responseLatency: Optional[str]
192
- responseLength: Optional[str]
193
- status: Optional[str]
194
- waf: Optional[LoggingContextVarsWaf]
195
- xrayTraceId: Optional[str]
183
+ authorize: LoggingContextVarsAuthorize | None
184
+ authorizer: LoggingContextVarsAuthorizer | None
185
+ authenticate: LoggingContextVarsAuthenticate | None
186
+ customDomain: LoggingContextVarsCustomDomain | None
187
+ endpointType: str | None
188
+ integration: LoggingContextVarsIntegration | None
189
+ integrationLatency: str | None
190
+ integrationStatus: str | None
191
+ responseLatency: str | None
192
+ responseLength: str | None
193
+ status: str | None
194
+ waf: LoggingContextVarsWaf | None
195
+ xrayTraceId: str | None
@@ -429,6 +429,11 @@ class ApigatewayNextGenProvider(ApigatewayProvider):
429
429
  if not resource:
430
430
  raise NotFoundException("Invalid Resource identifier specified")
431
431
 
432
+ resource_methods = resource.resource_methods
433
+
434
+ if request["httpMethod"] not in resource_methods and "ANY" not in resource_methods:
435
+ raise NotFoundException("Invalid Method identifier specified")
436
+
432
437
  # test httpMethod
433
438
 
434
439
  rest_api_container = get_rest_api_container(context, rest_api_id=rest_api_id)
@@ -2,7 +2,7 @@
2
2
  from __future__ import annotations
3
3
 
4
4
  from pathlib import Path
5
- from typing import Optional, TypedDict
5
+ from typing import TypedDict
6
6
 
7
7
  import localstack.services.cloudformation.provider_utils as util
8
8
  from localstack.services.cloudformation.resource_provider import (
@@ -14,8 +14,8 @@ from localstack.services.cloudformation.resource_provider import (
14
14
 
15
15
 
16
16
  class ApiGatewayAccountProperties(TypedDict):
17
- CloudWatchRoleArn: Optional[str]
18
- Id: Optional[str]
17
+ CloudWatchRoleArn: str | None
18
+ Id: str | None
19
19
 
20
20
 
21
21
  REPEATED_INVOCATION = "repeated_invocation"
@@ -1,5 +1,3 @@
1
- from typing import Optional, Type
2
-
3
1
  from localstack.services.cloudformation.resource_provider import (
4
2
  CloudFormationResourceProviderPlugin,
5
3
  ResourceProvider,
@@ -10,7 +8,7 @@ class ApiGatewayAccountProviderPlugin(CloudFormationResourceProviderPlugin):
10
8
  name = "AWS::ApiGateway::Account"
11
9
 
12
10
  def __init__(self):
13
- self.factory: Optional[Type[ResourceProvider]] = None
11
+ self.factory: type[ResourceProvider] | None = None
14
12
 
15
13
  def load(self):
16
14
  from localstack.services.apigateway.resource_providers.aws_apigateway_account import (