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,7 @@
1
1
  import json
2
2
  import logging
3
- from typing import Callable, Final, Optional
3
+ from collections.abc import Callable
4
+ from typing import Final
4
5
 
5
6
  from botocore.exceptions import ClientError
6
7
  from jsonpath_ng.ext import parse
@@ -189,7 +190,7 @@ def await_state_machine_version_listed(
189
190
  def await_on_execution_events(
190
191
  stepfunctions_client, execution_arn: str, check_func: Callable[[HistoryEventList], bool]
191
192
  ) -> HistoryEventList:
192
- events: HistoryEventList = list()
193
+ events: HistoryEventList = []
193
194
 
194
195
  def _run_check():
195
196
  nonlocal events
@@ -342,7 +343,7 @@ def is_execution_logs_list_complete(
342
343
 
343
344
  def _await_on_execution_log_stream_created(target_aws_client, log_group_name: str) -> str:
344
345
  logs_client = target_aws_client.logs
345
- log_stream_name = str()
346
+ log_stream_name = ""
346
347
 
347
348
  def _run_check():
348
349
  nonlocal log_stream_name
@@ -376,7 +377,7 @@ def await_on_execution_logs(
376
377
  log_stream_name = _await_on_execution_log_stream_created(target_aws_client, log_group_name)
377
378
 
378
379
  logs_client = target_aws_client.logs
379
- events: HistoryEventList = list()
380
+ events: HistoryEventList = []
380
381
 
381
382
  def _run_check():
382
383
  nonlocal events
@@ -402,8 +403,8 @@ def create_state_machine_with_iam_role(
402
403
  create_state_machine,
403
404
  snapshot,
404
405
  definition: Definition,
405
- logging_configuration: Optional[LoggingConfiguration] = None,
406
- state_machine_name: Optional[str] = None,
406
+ logging_configuration: LoggingConfiguration | None = None,
407
+ state_machine_name: str | None = None,
407
408
  state_machine_type: StateMachineType = StateMachineType.STANDARD,
408
409
  ):
409
410
  snf_role_arn = create_state_machine_iam_role(target_aws_client=target_aws_client)
@@ -889,7 +890,7 @@ def create_and_record_events(
889
890
  stepfunctions_client=target_aws_client.stepfunctions, execution_arn=execution_arn
890
891
  )
891
892
 
892
- stepfunctions_events = list()
893
+ stepfunctions_events = []
893
894
 
894
895
  def _get_events():
895
896
  received = target_aws_client.sqs.receive_message(QueueUrl=queue_url)
@@ -905,7 +906,7 @@ def create_and_record_events(
905
906
 
906
907
 
907
908
  def record_sqs_events(target_aws_client, queue_url, sfn_snapshot, num_events):
908
- stepfunctions_events = list()
909
+ stepfunctions_events = []
909
910
 
910
911
  def _get_events():
911
912
  received = target_aws_client.sqs.receive_message(QueueUrl=queue_url)
@@ -916,7 +917,7 @@ def record_sqs_events(target_aws_client, queue_url, sfn_snapshot, num_events):
916
917
  return len(stepfunctions_events) == num_events
917
918
 
918
919
  poll_condition(_get_events, timeout=60)
919
- stepfunctions_events.sort(key=lambda e: json.dumps(e.get("detail", dict())))
920
+ stepfunctions_events.sort(key=lambda e: json.dumps(e.get("detail", {})))
920
921
  sfn_snapshot.match("stepfunctions_events", stepfunctions_events)
921
922
 
922
923
 
@@ -931,7 +932,7 @@ class SfnNoneRecursiveParallelTransformer:
931
932
  @staticmethod
932
933
  def _normalise_events(events: list[dict]) -> None:
933
934
  start_idx = None
934
- sublist = list()
935
+ sublist = []
935
936
  in_sublist = False
936
937
  for i, event in enumerate(events):
937
938
  event_type = event.get("type")
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import pwd
3
+ from collections.abc import Callable
3
4
  from multiprocessing import Process, ProcessError
4
- from typing import Callable
5
5
 
6
6
 
7
7
  def run_as_os_user(target: Callable, uid: str | int, gid: str | int = None):
@@ -9,7 +9,6 @@ import datetime
9
9
  import json
10
10
  import os
11
11
  from pathlib import Path
12
- from typing import Dict, Optional
13
12
 
14
13
  import pytest
15
14
  from pluggy import Result
@@ -17,7 +16,7 @@ from pytest import StashKey, TestReport
17
16
 
18
17
  from localstack.testing.aws.util import is_aws_cloud
19
18
 
20
- durations_key = StashKey[Dict[str, float]]()
19
+ durations_key = StashKey[dict[str, float]]()
21
20
  """
22
21
  Stores phase durations on the test node between execution phases.
23
22
  See https://docs.pytest.org/en/latest/reference/reference.html#pytest.Stash
@@ -28,14 +27,14 @@ Stores information from call execution phase about whether the test failed.
28
27
  """
29
28
 
30
29
 
31
- def find_validation_data_for_item(item: pytest.Item) -> Optional[dict]:
30
+ def find_validation_data_for_item(item: pytest.Item) -> dict | None:
32
31
  base_path = os.path.join(item.fspath.dirname, item.fspath.purebasename)
33
32
  snapshot_path = f"{base_path}.validation.json"
34
33
 
35
34
  if not os.path.exists(snapshot_path):
36
35
  return None
37
36
 
38
- with open(snapshot_path, "r") as fd:
37
+ with open(snapshot_path) as fd:
39
38
  file_content = json.load(fd)
40
39
  return file_content.get(item.nodeid)
41
40
 
@@ -1,9 +1,10 @@
1
1
  import json
2
2
  import logging
3
3
  import warnings
4
- from contextlib import contextmanager
4
+ from collections.abc import Callable
5
+ from contextlib import AbstractContextManager, contextmanager
5
6
  from pathlib import Path
6
- from typing import TYPE_CHECKING, Callable, ContextManager, Optional
7
+ from typing import TYPE_CHECKING
7
8
 
8
9
  import aws_cdk as cdk
9
10
  from botocore.exceptions import ClientError, WaiterError
@@ -77,9 +78,9 @@ class InfraProvisioner:
77
78
  self,
78
79
  aws_client: ServiceLevelClientFactory,
79
80
  namespace: str,
80
- base_path: Optional[str] = None,
81
- force_synth: Optional[bool] = False,
82
- persist_output: Optional[bool] = False,
81
+ base_path: str | None = None,
82
+ force_synth: bool | None = False,
83
+ persist_output: bool | None = False,
83
84
  ):
84
85
  """
85
86
  :param namespace: repo-unique identifier for this CDK app.
@@ -108,8 +109,8 @@ class InfraProvisioner:
108
109
 
109
110
  @contextmanager
110
111
  def provisioner(
111
- self, skip_deployment: Optional[bool] = False, skip_teardown: Optional[bool] = False
112
- ) -> ContextManager["InfraProvisioner"]:
112
+ self, skip_deployment: bool | None = False, skip_teardown: bool | None = False
113
+ ) -> AbstractContextManager["InfraProvisioner"]:
113
114
  """
114
115
  :param skip_deployment: Set to True to skip stack creation and re-use existing stack without modifications.
115
116
  Also skips custom setup steps.
@@ -136,7 +137,7 @@ class InfraProvisioner:
136
137
  else:
137
138
  LOG.debug("Skipping teardown. Resources and stacks are not deleted.")
138
139
 
139
- def provision(self, skip_deployment: Optional[bool] = False):
140
+ def provision(self, skip_deployment: bool | None = False):
140
141
  """
141
142
  Execute all previously added custom provisioning steps and deploy added CDK stacks via CloudFormation.
142
143
 
@@ -299,7 +300,7 @@ class InfraProvisioner:
299
300
  def add_cdk_stack(
300
301
  self,
301
302
  cdk_stack: cdk.Stack,
302
- autoclean_buckets: Optional[bool] = True,
303
+ autoclean_buckets: bool | None = True,
303
304
  ):
304
305
  """
305
306
  Register a CDK stack to be deployed in a later `InfraProvisioner.provision` call.
@@ -318,7 +319,7 @@ class InfraProvisioner:
318
319
  is_env_true("TEST_CDK_FORCE_SYNTH") or self.force_synth
319
320
  ) # EXPERIMENTAL / API subject to change
320
321
  if not template_path.exists() or should_update_template:
321
- with open(template_path, "wt") as fd:
322
+ with open(template_path, "w") as fd:
322
323
  template_json = cdk.assertions.Template.from_stack(cdk_stack).to_json()
323
324
  json.dump(template_json, fd, indent=2)
324
325
  # add trailing newline for linter and Git compliance
@@ -3,7 +3,7 @@ import logging
3
3
  import re
4
4
  from datetime import datetime
5
5
  from json import JSONDecodeError
6
- from typing import Optional, Pattern
6
+ from re import Pattern
7
7
 
8
8
  from localstack_snapshot.snapshots.transformer import (
9
9
  PATTERN_ISO8601,
@@ -45,12 +45,16 @@ PATTERN_KEY_ARN = re.compile(
45
45
  r"arn:(aws[a-zA-Z-]*)?:([a-zA-Z0-9-_.]+)?:([^:]+)?:(\d{12})?:key/[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"
46
46
  )
47
47
 
48
+ PATTERN_MRK_KEY_ARN = re.compile(
49
+ r"arn:(aws[a-zA-Z-]*)?:([a-zA-Z0-9-_.]+)?:([^:]+)?:(\d{12})?:key/mrk-[a-fA-F0-9]{32}"
50
+ )
51
+
48
52
 
49
53
  # TODO: split into generic/aws and put into lib
50
54
  class TransformerUtility:
51
55
  @staticmethod
52
56
  def key_value(
53
- key: str, value_replacement: Optional[str] = None, reference_replacement: bool = True
57
+ key: str, value_replacement: str | None = None, reference_replacement: bool = True
54
58
  ):
55
59
  """Creates a new KeyValueBasedTransformer. If the key matches, the value will be replaced.
56
60
 
@@ -500,7 +504,7 @@ class TransformerUtility:
500
504
  replacement="<stream-name>",
501
505
  ),
502
506
  TransformerUtility.key_value(
503
- "ContinuationSequenceNumber", "<continuation_sequence_number>"
507
+ "ContinuationSequenceNumber", "continuation_sequence_number"
504
508
  ),
505
509
  ]
506
510
 
@@ -573,6 +577,7 @@ class TransformerUtility:
573
577
  TransformerUtility.key_value("CiphertextBlob", reference_replacement=False),
574
578
  TransformerUtility.key_value("Plaintext", reference_replacement=False),
575
579
  RegexTransformer(PATTERN_KEY_ARN, replacement="<key-arn>"),
580
+ RegexTransformer(PATTERN_MRK_KEY_ARN, replacement="<mrk-key-arn>"),
576
581
  ]
577
582
 
578
583
  @staticmethod
@@ -2,7 +2,7 @@ import fnmatch
2
2
  import pathlib
3
3
  import re
4
4
  from collections import defaultdict
5
- from typing import Callable, Iterable, Optional
5
+ from collections.abc import Callable, Iterable
6
6
 
7
7
  from localstack.aws.scaffold import is_keyword
8
8
 
@@ -117,7 +117,7 @@ class Matchers:
117
117
 
118
118
  def generic_service_test_matching_rule(
119
119
  changed_file_path: str,
120
- api_dependencies: Optional[dict[str, Iterable[str]]] = None,
120
+ api_dependencies: dict[str, Iterable[str]] | None = None,
121
121
  search_patterns: Iterable[str] = DEFAULT_SEARCH_PATTERNS,
122
122
  test_dirs: Iterable[str] = ("tests/aws/services",),
123
123
  ) -> set[str]:
@@ -1,5 +1,5 @@
1
1
  import fnmatch
2
- from typing import Iterable
2
+ from collections.abc import Iterable
3
3
 
4
4
  OPT_OUT = []
5
5
 
@@ -24,7 +24,7 @@ def main():
24
24
  sys.exit(1)
25
25
 
26
26
  testselection_file_path = sys.argv[1]
27
- with open(testselection_file_path, "r") as file:
27
+ with open(testselection_file_path) as file:
28
28
  selected_tests = [line.strip() for line in file.readlines() if line.strip()]
29
29
  test_files = [line.strip() for line in sys.stdin]
30
30
  filter_test_files(test_files, selected_tests)
@@ -10,8 +10,8 @@ Optionally set the GITHUB_API_TOKEN environment variable to use the GitHub API.
10
10
  import argparse
11
11
  import os
12
12
  import sys
13
+ from collections.abc import Iterable
13
14
  from pathlib import Path
14
- from typing import Iterable
15
15
 
16
16
  from localstack.testing.testselection.git import (
17
17
  find_merge_base,
@@ -1,10 +1,10 @@
1
- from typing import Iterable, Optional
1
+ from collections.abc import Iterable
2
2
 
3
3
  from localstack.testing.testselection.matching import MATCHING_RULES, MatchingRule
4
4
 
5
5
 
6
6
  def get_affected_tests_from_changes(
7
- changed_files: Iterable[str], matching_rules: Optional[list[MatchingRule]] = None
7
+ changed_files: Iterable[str], matching_rules: list[MatchingRule] | None = None
8
8
  ) -> list[str]:
9
9
  """
10
10
  Generate test selectors based on the changed files and matching rules to apply to.
@@ -1,7 +1,6 @@
1
1
  import datetime
2
2
  import functools
3
3
  from multiprocessing import Process
4
- from typing import List
5
4
 
6
5
  import click
7
6
 
@@ -15,7 +14,7 @@ from .publisher import AnalyticsClientPublisher
15
14
  ANALYTICS_API_RESPONSE_TIMEOUT_SECS = 0.5
16
15
 
17
16
 
18
- def _publish_cmd_as_analytics_event(command_name: str, params: List[str]):
17
+ def _publish_cmd_as_analytics_event(command_name: str, params: list[str]):
19
18
  event = Event(
20
19
  name="cli_cmd",
21
20
  payload={"cmd": command_name, "params": params},
@@ -28,7 +27,7 @@ def _publish_cmd_as_analytics_event(command_name: str, params: List[str]):
28
27
  publisher.publish([event])
29
28
 
30
29
 
31
- def _get_parent_commands(ctx: click.Context) -> List[str]:
30
+ def _get_parent_commands(ctx: click.Context) -> list[str]:
32
31
  parent_commands = []
33
32
  parent = ctx.parent
34
33
  while parent is not None:
@@ -3,7 +3,7 @@ Client for the analytics backend.
3
3
  """
4
4
 
5
5
  import logging
6
- from typing import Any, Dict, List
6
+ from typing import Any
7
7
 
8
8
  import requests
9
9
 
@@ -18,10 +18,10 @@ LOG = logging.getLogger(__name__)
18
18
 
19
19
 
20
20
  class SessionResponse:
21
- response: Dict[str, Any]
21
+ response: dict[str, Any]
22
22
  status: int
23
23
 
24
- def __init__(self, response: Dict[str, Any], status: int = 200):
24
+ def __init__(self, response: dict[str, Any], status: int = 200):
25
25
  self.response = response
26
26
  self.status = status
27
27
 
@@ -70,7 +70,7 @@ class AnalyticsClient:
70
70
  )
71
71
 
72
72
  # TODO: naming seems confusing since this doesn't actually append, but directly sends all passed events via HTTP
73
- def append_events(self, events: List[Event]):
73
+ def append_events(self, events: list[Event]):
74
74
  # TODO: add compression to append_events
75
75
  # it would maybe be useful to compress analytics data, but it's unclear how that will
76
76
  # affect performance and what the benefit is. need to measure first.
@@ -104,7 +104,7 @@ class AnalyticsClient:
104
104
  # TODO: Add response type to analytics client
105
105
  return response
106
106
 
107
- def _create_headers(self) -> Dict[str, str]:
107
+ def _create_headers(self) -> dict[str, str]:
108
108
  return {
109
109
  "User-Agent": "localstack/" + constants.VERSION,
110
110
  "Localstack-Session-ID": self.localstack_session_id,
@@ -1,8 +1,8 @@
1
1
  import abc
2
2
  import dataclasses
3
- from typing import Any, Dict, Union
3
+ from typing import Any
4
4
 
5
- EventPayload = Union[Dict[str, Any], Any] # FIXME: better typing
5
+ EventPayload = dict[str, Any] | Any # FIXME: better typing
6
6
 
7
7
 
8
8
  @dataclasses.dataclass
@@ -2,7 +2,6 @@ import dataclasses
2
2
  import logging
3
3
  import os
4
4
  import platform
5
- from typing import Optional
6
5
 
7
6
  from localstack import config
8
7
  from localstack.constants import VERSION
@@ -41,7 +40,7 @@ class ClientMetadata:
41
40
  k = "*" * len(k)
42
41
  d["api_key"] = k
43
42
 
44
- return "ClientMetadata(%s)" % d
43
+ return f"ClientMetadata({d})"
45
44
 
46
45
 
47
46
  def get_version_string() -> str:
@@ -148,7 +147,10 @@ def is_license_activated() -> bool:
148
147
 
149
148
  return licensingv2.get_licensed_environment().activated
150
149
  except Exception:
151
- LOG.exception("Could not determine license activation status")
150
+ LOG.error(
151
+ "Could not determine license activation status",
152
+ exc_info=LOG.isEnabledFor(logging.DEBUG),
153
+ )
152
154
  return False
153
155
 
154
156
 
@@ -198,7 +200,7 @@ def _generate_machine_id() -> str:
198
200
  return f"gen_{long_uid()[:12]}"
199
201
 
200
202
 
201
- def get_api_key_or_auth_token() -> Optional[str]:
203
+ def get_api_key_or_auth_token() -> str | None:
202
204
  # TODO: this is duplicated code from ext, but should probably migrate that to localstack
203
205
  auth_token = os.environ.get("LOCALSTACK_AUTH_TOKEN", "").strip("'\" ")
204
206
  if auth_token:
@@ -1,7 +1,7 @@
1
1
  import threading
2
2
  from collections import defaultdict
3
3
  from dataclasses import dataclass
4
- from typing import Any, Optional, Union
4
+ from typing import Any
5
5
 
6
6
  from localstack import config
7
7
 
@@ -38,7 +38,7 @@ class LabeledCounterPayload:
38
38
  value: int
39
39
  type: str
40
40
  schema_version: int
41
- labels: dict[str, Union[str, float]]
41
+ labels: dict[str, str | float]
42
42
 
43
43
  def as_dict(self) -> dict[str, Any]:
44
44
  payload_dict = {
@@ -66,7 +66,7 @@ class ThreadSafeCounter:
66
66
  _count: int
67
67
 
68
68
  def __init__(self):
69
- super(ThreadSafeCounter, self).__init__()
69
+ super().__init__()
70
70
  self._mutex = threading.Lock()
71
71
  self._count = 0
72
72
 
@@ -113,11 +113,11 @@ class Counter(Metric, ThreadSafeCounter):
113
113
  def collect(self) -> list[CounterPayload]:
114
114
  """Collects the metric unless events are disabled."""
115
115
  if config.DISABLE_EVENTS:
116
- return list()
116
+ return []
117
117
 
118
118
  if self._count == 0:
119
119
  # Return an empty list if the count is 0, as there are no metrics to send to the analytics backend.
120
- return list()
120
+ return []
121
121
 
122
122
  return [
123
123
  CounterPayload(
@@ -140,15 +140,11 @@ class LabeledCounter(Metric):
140
140
 
141
141
  _type: str
142
142
  _labels: list[str]
143
- _label_values: tuple[Optional[Union[str, float]], ...]
144
- _counters_by_label_values: defaultdict[
145
- tuple[Optional[Union[str, float]], ...], ThreadSafeCounter
146
- ]
143
+ _label_values: tuple[str | float | None, ...]
144
+ _counters_by_label_values: defaultdict[tuple[str | float | None, ...], ThreadSafeCounter]
147
145
 
148
146
  def __init__(self, namespace: str, name: str, labels: list[str], schema_version: int = 1):
149
- super(LabeledCounter, self).__init__(
150
- namespace=namespace, name=name, schema_version=schema_version
151
- )
147
+ super().__init__(namespace=namespace, name=name, schema_version=schema_version)
152
148
 
153
149
  if not labels:
154
150
  raise ValueError("At least one label is required; the labels list cannot be empty.")
@@ -164,7 +160,7 @@ class LabeledCounter(Metric):
164
160
  self._counters_by_label_values = defaultdict(ThreadSafeCounter)
165
161
  MetricRegistry().register(self)
166
162
 
167
- def labels(self, **kwargs: Union[str, float, None]) -> ThreadSafeCounter:
163
+ def labels(self, **kwargs: str | float | None) -> ThreadSafeCounter:
168
164
  """
169
165
  Create a scoped counter instance with specific label values.
170
166
 
@@ -184,7 +180,7 @@ class LabeledCounter(Metric):
184
180
 
185
181
  def collect(self) -> list[LabeledCounterPayload]:
186
182
  if config.DISABLE_EVENTS:
187
- return list()
183
+ return []
188
184
 
189
185
  payload = []
190
186
  num_labels = len(self._labels)
@@ -200,10 +196,7 @@ class LabeledCounter(Metric):
200
196
  )
201
197
 
202
198
  # Create labels dictionary
203
- labels_dict = {
204
- label_name: label_value
205
- for label_name, label_value in zip(self._labels, label_values)
206
- }
199
+ labels_dict = dict(zip(self._labels, label_values, strict=False))
207
200
 
208
201
  payload.append(
209
202
  LabeledCounterPayload(
@@ -43,7 +43,7 @@ class MetricRegistry:
43
43
  Provides methods for retrieving and collecting metrics.
44
44
  """
45
45
 
46
- _instance: "MetricRegistry" = None
46
+ _instance: MetricRegistry = None
47
47
  _mutex: threading.Lock = threading.Lock()
48
48
 
49
49
  def __new__(cls):
@@ -57,7 +57,7 @@ class MetricRegistry:
57
57
 
58
58
  def __init__(self):
59
59
  if not hasattr(self, "_registry"):
60
- self._registry = dict()
60
+ self._registry = {}
61
61
 
62
62
  @property
63
63
  def registry(self) -> dict[MetricRegistryKey, Metric]:
@@ -4,7 +4,6 @@ import logging
4
4
  import threading
5
5
  import time
6
6
  from queue import Full, Queue
7
- from typing import List, Optional
8
7
 
9
8
  from localstack import config
10
9
  from localstack.utils.threads import start_thread, start_worker_thread
@@ -21,7 +20,7 @@ class Publisher(abc.ABC):
21
20
  A publisher takes a batch of events and publishes them to a destination.
22
21
  """
23
22
 
24
- def publish(self, events: List[Event]):
23
+ def publish(self, events: list[Event]):
25
24
  raise NotImplementedError
26
25
 
27
26
  def close(self):
@@ -35,7 +34,7 @@ class AnalyticsClientPublisher(Publisher):
35
34
  super().__init__()
36
35
  self.client = client or AnalyticsClient()
37
36
 
38
- def publish(self, events: List[Event]):
37
+ def publish(self, events: list[Event]):
39
38
  self.client.append_events(events)
40
39
 
41
40
  def close(self):
@@ -47,7 +46,7 @@ class Printer(Publisher):
47
46
  Publisher that prints serialized events to stdout.
48
47
  """
49
48
 
50
- def publish(self, events: List[Event]):
49
+ def publish(self, events: list[Event]):
51
50
  for event in events:
52
51
  print(event.asdict())
53
52
 
@@ -93,7 +92,7 @@ class PublisherBuffer(EventHandler):
93
92
  self._stopping.set()
94
93
  self._command_queue.put(self._cmd_stop)
95
94
 
96
- def close_sync(self, timeout: Optional[float] = None):
95
+ def close_sync(self, timeout: float | None = None):
97
96
  self.close()
98
97
  return self._stopped.wait(timeout)
99
98
 
@@ -0,0 +1,19 @@
1
+ from localstack.runtime import hooks
2
+
3
+
4
+ @hooks.on_runtime_ready()
5
+ def publish_provider_assignment():
6
+ """
7
+ Publishes the service provider assignment to the analytics service.
8
+ """
9
+
10
+ from localstack.config import SERVICE_PROVIDER_CONFIG
11
+ from localstack.services.plugins import SERVICE_PLUGINS
12
+ from localstack.utils.analytics import log
13
+
14
+ provider_assignment = {
15
+ service: f"localstack.aws.provider/{service}:{SERVICE_PROVIDER_CONFIG[service]}"
16
+ for service in SERVICE_PLUGINS.list_available()
17
+ }
18
+
19
+ log.event("ls_service_provider_assignment", provider_assignment)
@@ -2,7 +2,7 @@ import datetime
2
2
  import logging
3
3
  import threading
4
4
  from collections import Counter
5
- from typing import Dict, List, NamedTuple, Optional
5
+ from typing import NamedTuple
6
6
 
7
7
  from localstack import config
8
8
  from localstack.runtime.shutdown import SHUTDOWN_HANDLERS
@@ -20,7 +20,7 @@ class ServiceRequestInfo(NamedTuple):
20
20
  service: str
21
21
  operation: str
22
22
  status_code: int
23
- err_type: Optional[str] = None
23
+ err_type: str | None = None
24
24
 
25
25
 
26
26
  class ServiceRequestAggregator:
@@ -110,7 +110,7 @@ class ServiceRequestAggregator:
110
110
  "api_calls": self._aggregate_api_calls(self.counter),
111
111
  }
112
112
 
113
- def _aggregate_api_calls(self, counter) -> List:
113
+ def _aggregate_api_calls(self, counter) -> list:
114
114
  aggregations = []
115
115
  for api_call_info, count in counter.items():
116
116
  doc = api_call_info._asdict()
@@ -121,5 +121,5 @@ class ServiceRequestAggregator:
121
121
  aggregations.append(doc)
122
122
  return aggregations
123
123
 
124
- def _emit_payload(self, analytics_payload: Dict):
124
+ def _emit_payload(self, analytics_payload: dict):
125
125
  analytics.log.event(EVENT_NAME, analytics_payload)