apache-airflow-providers-amazon 9.5.0rc2__tar.gz → 9.5.0rc3__tar.gz

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 (270) hide show
  1. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/PKG-INFO +1 -1
  2. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/pyproject.toml +3 -2
  3. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py +12 -14
  4. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/router/login.py +3 -1
  5. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor.py +1 -1
  6. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/athena_sql.py +2 -2
  7. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/batch_client.py +1 -2
  8. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/batch_waiters.py +11 -3
  9. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/dms.py +3 -1
  10. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/redshift_cluster.py +9 -9
  11. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/redshift_data.py +1 -2
  12. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sagemaker.py +1 -1
  13. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/athena.py +1 -2
  14. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/log/cloudwatch_task_handler.py +174 -54
  15. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/log/s3_task_handler.py +123 -86
  16. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/ec2.py +1 -1
  17. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/eks.py +3 -3
  18. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/redshift_cluster.py +10 -3
  19. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sagemaker.py +3 -5
  20. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glacier.py +1 -1
  21. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/mwaa.py +2 -1
  22. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/s3.py +1 -1
  23. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/step_function.py +2 -1
  24. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/mongo_to_s3.py +2 -2
  25. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/sql_to_s3.py +1 -1
  26. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/get_provider_info.py +2 -2
  27. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/README.rst +0 -0
  28. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/LICENSE +0 -0
  29. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/__init__.py +0 -0
  30. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/__init__.py +0 -0
  31. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/assets/__init__.py +0 -0
  32. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/assets/s3.py +0 -0
  33. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/__init__.py +0 -0
  34. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/avp/__init__.py +0 -0
  35. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/avp/entities.py +0 -0
  36. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/avp/facade.py +0 -0
  37. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/avp/schema.json +0 -0
  38. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/cli/__init__.py +0 -0
  39. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/cli/avp_commands.py +0 -0
  40. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/cli/definition.py +0 -0
  41. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/constants.py +0 -0
  42. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/router/__init__.py +0 -0
  43. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/auth_manager/user.py +0 -0
  44. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/exceptions.py +0 -0
  45. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/Dockerfile +0 -0
  46. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/__init__.py +0 -0
  47. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/batch/__init__.py +0 -0
  48. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/batch/batch_executor.py +0 -0
  49. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/batch/batch_executor_config.py +0 -0
  50. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/batch/boto_schema.py +0 -0
  51. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/batch/utils.py +0 -0
  52. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/ecs/__init__.py +0 -0
  53. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/ecs/boto_schema.py +0 -0
  54. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/ecs/ecs_executor_config.py +0 -0
  55. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/ecs/utils.py +0 -0
  56. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/utils/__init__.py +0 -0
  57. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/utils/base_config_keys.py +0 -0
  58. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/utils/exponential_backoff_retry.py +0 -0
  59. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/fs/__init__.py +0 -0
  60. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/fs/s3.py +0 -0
  61. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/__init__.py +0 -0
  62. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/appflow.py +0 -0
  63. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/athena.py +0 -0
  64. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/base_aws.py +0 -0
  65. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/batch_waiters.json +0 -0
  66. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/bedrock.py +0 -0
  67. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/chime.py +0 -0
  68. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/cloud_formation.py +0 -0
  69. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/comprehend.py +0 -0
  70. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/datasync.py +0 -0
  71. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/dynamodb.py +0 -0
  72. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ec2.py +0 -0
  73. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ecr.py +0 -0
  74. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ecs.py +0 -0
  75. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/eks.py +0 -0
  76. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/elasticache_replication_group.py +0 -0
  77. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/emr.py +0 -0
  78. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/eventbridge.py +0 -0
  79. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glacier.py +0 -0
  80. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glue.py +0 -0
  81. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glue_catalog.py +0 -0
  82. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glue_crawler.py +0 -0
  83. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glue_databrew.py +0 -0
  84. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/kinesis.py +0 -0
  85. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/kinesis_analytics.py +0 -0
  86. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/lambda_function.py +0 -0
  87. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/logs.py +0 -0
  88. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/mwaa.py +0 -0
  89. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/neptune.py +0 -0
  90. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/opensearch_serverless.py +0 -0
  91. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/quicksight.py +0 -0
  92. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/rds.py +0 -0
  93. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/redshift_sql.py +0 -0
  94. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/s3.py +0 -0
  95. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sagemaker_unified_studio.py +0 -0
  96. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/secrets_manager.py +0 -0
  97. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ses.py +0 -0
  98. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sns.py +0 -0
  99. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sqs.py +0 -0
  100. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ssm.py +0 -0
  101. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/step_function.py +0 -0
  102. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sts.py +0 -0
  103. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/verified_permissions.py +0 -0
  104. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/__init__.py +0 -0
  105. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/base_aws.py +0 -0
  106. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/batch.py +0 -0
  107. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/comprehend.py +0 -0
  108. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/datasync.py +0 -0
  109. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/ec2.py +0 -0
  110. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/emr.py +0 -0
  111. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/glue.py +0 -0
  112. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/logs.py +0 -0
  113. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/sagemaker.py +0 -0
  114. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/sagemaker_unified_studio.py +0 -0
  115. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/step_function.py +0 -0
  116. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/log/__init__.py +0 -0
  117. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/__init__.py +0 -0
  118. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/chime.py +0 -0
  119. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/sns.py +0 -0
  120. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/sqs.py +0 -0
  121. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/__init__.py +0 -0
  122. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/appflow.py +0 -0
  123. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/athena.py +0 -0
  124. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/base_aws.py +0 -0
  125. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/batch.py +0 -0
  126. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/bedrock.py +0 -0
  127. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/cloud_formation.py +0 -0
  128. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/comprehend.py +0 -0
  129. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/datasync.py +0 -0
  130. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/dms.py +0 -0
  131. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/ecs.py +0 -0
  132. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/emr.py +0 -0
  133. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/eventbridge.py +0 -0
  134. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glacier.py +0 -0
  135. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glue.py +0 -0
  136. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glue_crawler.py +0 -0
  137. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glue_databrew.py +0 -0
  138. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/kinesis_analytics.py +0 -0
  139. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/lambda_function.py +0 -0
  140. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/mwaa.py +0 -0
  141. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/neptune.py +0 -0
  142. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/quicksight.py +0 -0
  143. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/rds.py +0 -0
  144. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/redshift_data.py +0 -0
  145. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/s3.py +0 -0
  146. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sagemaker_unified_studio.py +0 -0
  147. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sns.py +0 -0
  148. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sqs.py +0 -0
  149. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/step_function.py +0 -0
  150. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/secrets/__init__.py +0 -0
  151. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/secrets/secrets_manager.py +0 -0
  152. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/secrets/systems_manager.py +0 -0
  153. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/__init__.py +0 -0
  154. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/athena.py +0 -0
  155. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/base_aws.py +0 -0
  156. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/batch.py +0 -0
  157. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/bedrock.py +0 -0
  158. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/cloud_formation.py +0 -0
  159. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/comprehend.py +0 -0
  160. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/dms.py +0 -0
  161. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/dynamodb.py +0 -0
  162. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/ec2.py +0 -0
  163. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/ecs.py +0 -0
  164. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/eks.py +0 -0
  165. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/emr.py +0 -0
  166. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glue.py +0 -0
  167. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glue_catalog_partition.py +0 -0
  168. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glue_crawler.py +0 -0
  169. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/kinesis_analytics.py +0 -0
  170. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/lambda_function.py +0 -0
  171. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/opensearch_serverless.py +0 -0
  172. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/quicksight.py +0 -0
  173. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/rds.py +0 -0
  174. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/redshift_cluster.py +0 -0
  175. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/sagemaker.py +0 -0
  176. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/sagemaker_unified_studio.py +0 -0
  177. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/sqs.py +0 -0
  178. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/__init__.py +0 -0
  179. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/azure_blob_to_s3.py +0 -0
  180. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/base.py +0 -0
  181. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/dynamodb_to_s3.py +0 -0
  182. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/exasol_to_s3.py +0 -0
  183. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/ftp_to_s3.py +0 -0
  184. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/gcs_to_s3.py +0 -0
  185. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/glacier_to_gcs.py +0 -0
  186. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/google_api_to_s3.py +0 -0
  187. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/hive_to_dynamodb.py +0 -0
  188. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/http_to_s3.py +0 -0
  189. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/imap_attachment_to_s3.py +0 -0
  190. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/local_to_s3.py +0 -0
  191. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/redshift_to_s3.py +0 -0
  192. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/s3_to_dynamodb.py +0 -0
  193. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/s3_to_ftp.py +0 -0
  194. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/s3_to_redshift.py +0 -0
  195. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/s3_to_sftp.py +0 -0
  196. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/s3_to_sql.py +0 -0
  197. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/salesforce_to_s3.py +0 -0
  198. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/sftp_to_s3.py +0 -0
  199. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/README.md +0 -0
  200. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/__init__.py +0 -0
  201. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/athena.py +0 -0
  202. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/base.py +0 -0
  203. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/batch.py +0 -0
  204. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/bedrock.py +0 -0
  205. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/comprehend.py +0 -0
  206. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/dms.py +0 -0
  207. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/ec2.py +0 -0
  208. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/ecs.py +0 -0
  209. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/eks.py +0 -0
  210. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/emr.py +0 -0
  211. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/glue.py +0 -0
  212. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/glue_crawler.py +0 -0
  213. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/glue_databrew.py +0 -0
  214. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/kinesis_analytics.py +0 -0
  215. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/lambda_function.py +0 -0
  216. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/mwaa.py +0 -0
  217. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/neptune.py +0 -0
  218. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/opensearch_serverless.py +0 -0
  219. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/rds.py +0 -0
  220. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/redshift_cluster.py +0 -0
  221. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/redshift_data.py +0 -0
  222. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/s3.py +0 -0
  223. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/sagemaker.py +0 -0
  224. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/sagemaker_unified_studio.py +0 -0
  225. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/sqs.py +0 -0
  226. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/step_function.py +0 -0
  227. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/__init__.py +0 -0
  228. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/connection_wrapper.py +0 -0
  229. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/eks_get_token.py +0 -0
  230. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/emailer.py +0 -0
  231. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/identifiers.py +0 -0
  232. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/mixins.py +0 -0
  233. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/openlineage.py +0 -0
  234. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/rds.py +0 -0
  235. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/redshift.py +0 -0
  236. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/sagemaker.py +0 -0
  237. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/sagemaker_unified_studio.py +0 -0
  238. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/sqs.py +0 -0
  239. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/suppress.py +0 -0
  240. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/tags.py +0 -0
  241. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/task_log_fetcher.py +0 -0
  242. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/waiter.py +0 -0
  243. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/waiter_with_logging.py +0 -0
  244. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/README.md +0 -0
  245. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/__init__.py +0 -0
  246. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/appflow.json +0 -0
  247. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/athena.json +0 -0
  248. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/base_waiter.py +0 -0
  249. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/batch.json +0 -0
  250. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/bedrock-agent.json +0 -0
  251. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/bedrock.json +0 -0
  252. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/comprehend.json +0 -0
  253. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/databrew.json +0 -0
  254. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/dms.json +0 -0
  255. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/dynamodb.json +0 -0
  256. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/ecs.json +0 -0
  257. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/eks.json +0 -0
  258. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/emr-containers.json +0 -0
  259. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/emr-serverless.json +0 -0
  260. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/emr.json +0 -0
  261. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/glue.json +0 -0
  262. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/kinesisanalyticsv2.json +0 -0
  263. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/mwaa.json +0 -0
  264. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/neptune.json +0 -0
  265. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/opensearchserverless.json +0 -0
  266. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/rds.json +0 -0
  267. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/redshift.json +0 -0
  268. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/sagemaker.json +0 -0
  269. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/stepfunctions.json +0 -0
  270. {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/version_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-amazon
3
- Version: 9.5.0rc2
3
+ Version: 9.5.0rc3
4
4
  Summary: Provider package apache-airflow-providers-amazon for Apache Airflow
5
5
  Keywords: airflow-provider,amazon,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-amazon"
28
- version = "9.5.0.rc2"
28
+ version = "9.5.0.rc3"
29
29
  description = "Provider package apache-airflow-providers-amazon for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -164,8 +164,9 @@ dev = [
164
164
  "apache-airflow-providers-ssh",
165
165
  # Additional devel dependencies (do not remove this line and add extra development dependencies)
166
166
  "aiobotocore>=2.13.0",
167
+ "apache-airflow-providers-postgres",
167
168
  "aws_xray_sdk>=2.12.0",
168
- "moto[cloudformation,glue]>=5.0.0",
169
+ "moto[cloudformation,glue]>=5.1.2",
169
170
  "mypy-boto3-appflow>=1.37.0",
170
171
  "mypy-boto3-rds>=1.34.90",
171
172
  "mypy-boto3-redshift-data>=1.34.0",
@@ -27,15 +27,6 @@ from fastapi import FastAPI
27
27
 
28
28
  from airflow.api_fastapi.app import AUTH_MANAGER_FASTAPI_APP_PREFIX
29
29
  from airflow.api_fastapi.auth.managers.base_auth_manager import BaseAuthManager
30
- from airflow.api_fastapi.auth.managers.models.resource_details import (
31
- AccessView,
32
- BackfillDetails,
33
- ConnectionDetails,
34
- DagAccessEntity,
35
- DagDetails,
36
- PoolDetails,
37
- VariableDetails,
38
- )
39
30
  from airflow.cli.cli_config import CLICommand, DefaultHelpParser, GroupCommand
40
31
  from airflow.configuration import conf
41
32
  from airflow.exceptions import AirflowOptionalProviderFeatureException
@@ -59,9 +50,16 @@ if TYPE_CHECKING:
59
50
  IsAuthorizedVariableRequest,
60
51
  )
61
52
  from airflow.api_fastapi.auth.managers.models.resource_details import (
53
+ AccessView,
62
54
  AssetAliasDetails,
63
55
  AssetDetails,
56
+ BackfillDetails,
64
57
  ConfigurationDetails,
58
+ ConnectionDetails,
59
+ DagAccessEntity,
60
+ DagDetails,
61
+ PoolDetails,
62
+ VariableDetails,
65
63
  )
66
64
  from airflow.api_fastapi.common.types import MenuItem
67
65
 
@@ -256,7 +254,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
256
254
  {
257
255
  "method": request["method"],
258
256
  "entity_type": AvpEntities.CONNECTION,
259
- "entity_id": cast(ConnectionDetails, request["details"]).conn_id
257
+ "entity_id": cast("ConnectionDetails", request["details"]).conn_id
260
258
  if request.get("details")
261
259
  else None,
262
260
  }
@@ -274,10 +272,10 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
274
272
  {
275
273
  "method": request["method"],
276
274
  "entity_type": AvpEntities.DAG,
277
- "entity_id": cast(DagDetails, request["details"]).id if request.get("details") else None,
275
+ "entity_id": cast("DagDetails", request["details"]).id if request.get("details") else None,
278
276
  "context": {
279
277
  "dag_entity": {
280
- "string": cast(DagAccessEntity, request["access_entity"]).value,
278
+ "string": cast("DagAccessEntity", request["access_entity"]).value,
281
279
  },
282
280
  }
283
281
  if request.get("access_entity")
@@ -297,7 +295,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
297
295
  {
298
296
  "method": request["method"],
299
297
  "entity_type": AvpEntities.POOL,
300
- "entity_id": cast(PoolDetails, request["details"]).name if request.get("details") else None,
298
+ "entity_id": cast("PoolDetails", request["details"]).name if request.get("details") else None,
301
299
  }
302
300
  for request in requests
303
301
  ]
@@ -313,7 +311,7 @@ class AwsAuthManager(BaseAuthManager[AwsAuthManagerUser]):
313
311
  {
314
312
  "method": request["method"],
315
313
  "entity_type": AvpEntities.VARIABLE,
316
- "entity_id": cast(VariableDetails, request["details"]).key
314
+ "entity_id": cast("VariableDetails", request["details"]).key
317
315
  if request.get("details")
318
316
  else None,
319
317
  }
@@ -83,7 +83,9 @@ def login_callback(request: Request):
83
83
  url = conf.get("api", "base_url")
84
84
  token = get_auth_manager().generate_jwt(user)
85
85
  response = RedirectResponse(url=url, status_code=303)
86
- response.set_cookie(COOKIE_NAME_JWT_TOKEN, token, secure=True)
86
+
87
+ secure = conf.has_option("api", "ssl_cert")
88
+ response.set_cookie(COOKIE_NAME_JWT_TOKEN, token, secure=secure)
87
89
  return response
88
90
 
89
91
 
@@ -278,7 +278,7 @@ class AwsEcsExecutor(BaseExecutor):
278
278
  if not has_exit_codes:
279
279
  return ""
280
280
  reasons = [
281
- f'{container["container_arn"]} - {container["reason"]}'
281
+ f"{container['container_arn']} - {container['reason']}"
282
282
  for container in containers
283
283
  if "reason" in container
284
284
  ]
@@ -146,10 +146,10 @@ class AthenaSQLHook(AwsBaseHook, DbApiHook):
146
146
  creds = self.get_credentials(region_name=conn_params["region_name"])
147
147
 
148
148
  return URL.create(
149
- f'awsathena+{conn_params["driver"]}',
149
+ f"awsathena+{conn_params['driver']}",
150
150
  username=creds.access_key,
151
151
  password=creds.secret_key,
152
- host=f'athena.{conn_params["region_name"]}.{conn_params["aws_domain"]}',
152
+ host=f"athena.{conn_params['region_name']}.{conn_params['aws_domain']}",
153
153
  port=443,
154
154
  database=conn_params["schema_name"],
155
155
  query={"aws_session_token": creds.token, **self.conn.extra_dejson},
@@ -416,8 +416,7 @@ class BatchClientHook(AwsBaseHook):
416
416
  )
417
417
  else:
418
418
  raise AirflowException(
419
- f"AWS Batch job ({job_id}) description error: exceeded status_retries "
420
- f"({self.status_retries})"
419
+ f"AWS Batch job ({job_id}) description error: exceeded status_retries ({self.status_retries})"
421
420
  )
422
421
 
423
422
  @staticmethod
@@ -30,7 +30,7 @@ import json
30
30
  import sys
31
31
  from copy import deepcopy
32
32
  from pathlib import Path
33
- from typing import TYPE_CHECKING, Callable
33
+ from typing import TYPE_CHECKING, Any, Callable
34
34
 
35
35
  import botocore.client
36
36
  import botocore.exceptions
@@ -144,7 +144,12 @@ class BatchWaitersHook(BatchClientHook):
144
144
  return self._waiter_model
145
145
 
146
146
  def get_waiter(
147
- self, waiter_name: str, _: dict[str, str] | None = None, deferrable: bool = False, client=None
147
+ self,
148
+ waiter_name: str,
149
+ parameters: dict[str, str] | None = None,
150
+ config_overrides: dict[str, Any] | None = None,
151
+ deferrable: bool = False,
152
+ client=None,
148
153
  ) -> botocore.waiter.Waiter:
149
154
  """
150
155
  Get an AWS Batch service waiter, using the configured ``.waiter_model``.
@@ -175,7 +180,10 @@ class BatchWaitersHook(BatchClientHook):
175
180
  the name (including the casing) of the key name in the waiter
176
181
  model file (typically this is CamelCasing); see ``.list_waiters``.
177
182
 
178
- :param _: unused, just here to match the method signature in base_aws
183
+ :param parameters: unused, just here to match the method signature in base_aws
184
+ :param config_overrides: unused, just here to match the method signature in base_aws
185
+ :param deferrable: unused, just here to match the method signature in base_aws
186
+ :param client: unused, just here to match the method signature in base_aws
179
187
 
180
188
  :return: a waiter object for the named AWS Batch service
181
189
  """
@@ -292,7 +292,9 @@ class DmsHook(AwsBaseHook):
292
292
  return arn
293
293
 
294
294
  except ClientError as err:
295
- err_str = f"Error: {err.get('Error','').get('Code','')}: {err.get('Error','').get('Message','')}"
295
+ err_str = (
296
+ f"Error: {err.get('Error', '').get('Code', '')}: {err.get('Error', '').get('Message', '')}"
297
+ )
296
298
  self.log.error("Error while creating replication config: %s", err_str)
297
299
  raise err
298
300
 
@@ -67,7 +67,7 @@ class RedshiftHook(AwsBaseHook):
67
67
  for the cluster that is being created.
68
68
  :param params: Remaining AWS Create cluster API params.
69
69
  """
70
- response = self.get_conn().create_cluster(
70
+ response = self.conn.create_cluster(
71
71
  ClusterIdentifier=cluster_identifier,
72
72
  NodeType=node_type,
73
73
  MasterUsername=master_username,
@@ -87,9 +87,9 @@ class RedshiftHook(AwsBaseHook):
87
87
  :param cluster_identifier: unique identifier of a cluster
88
88
  """
89
89
  try:
90
- response = self.get_conn().describe_clusters(ClusterIdentifier=cluster_identifier)["Clusters"]
90
+ response = self.conn.describe_clusters(ClusterIdentifier=cluster_identifier)["Clusters"]
91
91
  return response[0]["ClusterStatus"] if response else None
92
- except self.get_conn().exceptions.ClusterNotFoundFault:
92
+ except self.conn.exceptions.ClusterNotFoundFault:
93
93
  return "cluster_not_found"
94
94
 
95
95
  async def cluster_status_async(self, cluster_identifier: str) -> str:
@@ -115,7 +115,7 @@ class RedshiftHook(AwsBaseHook):
115
115
  """
116
116
  final_cluster_snapshot_identifier = final_cluster_snapshot_identifier or ""
117
117
 
118
- response = self.get_conn().delete_cluster(
118
+ response = self.conn.delete_cluster(
119
119
  ClusterIdentifier=cluster_identifier,
120
120
  SkipFinalClusterSnapshot=skip_final_cluster_snapshot,
121
121
  FinalClusterSnapshotIdentifier=final_cluster_snapshot_identifier,
@@ -131,7 +131,7 @@ class RedshiftHook(AwsBaseHook):
131
131
 
132
132
  :param cluster_identifier: unique identifier of a cluster
133
133
  """
134
- response = self.get_conn().describe_cluster_snapshots(ClusterIdentifier=cluster_identifier)
134
+ response = self.conn.describe_cluster_snapshots(ClusterIdentifier=cluster_identifier)
135
135
  if "Snapshots" not in response:
136
136
  return None
137
137
  snapshots = response["Snapshots"]
@@ -149,7 +149,7 @@ class RedshiftHook(AwsBaseHook):
149
149
  :param cluster_identifier: unique identifier of a cluster
150
150
  :param snapshot_identifier: unique identifier for a snapshot of a cluster
151
151
  """
152
- response = self.get_conn().restore_from_cluster_snapshot(
152
+ response = self.conn.restore_from_cluster_snapshot(
153
153
  ClusterIdentifier=cluster_identifier, SnapshotIdentifier=snapshot_identifier
154
154
  )
155
155
  return response["Cluster"] if response["Cluster"] else None
@@ -175,7 +175,7 @@ class RedshiftHook(AwsBaseHook):
175
175
  """
176
176
  if tags is None:
177
177
  tags = []
178
- response = self.get_conn().create_cluster_snapshot(
178
+ response = self.conn.create_cluster_snapshot(
179
179
  SnapshotIdentifier=snapshot_identifier,
180
180
  ClusterIdentifier=cluster_identifier,
181
181
  ManualSnapshotRetentionPeriod=retention_period,
@@ -192,11 +192,11 @@ class RedshiftHook(AwsBaseHook):
192
192
  :param snapshot_identifier: A unique identifier for the snapshot that you are requesting
193
193
  """
194
194
  try:
195
- response = self.get_conn().describe_cluster_snapshots(
195
+ response = self.conn.describe_cluster_snapshots(
196
196
  SnapshotIdentifier=snapshot_identifier,
197
197
  )
198
198
  snapshot = response.get("Snapshots")[0]
199
199
  snapshot_status: str = snapshot.get("Status")
200
200
  return snapshot_status
201
- except self.get_conn().exceptions.ClusterSnapshotNotFoundFault:
201
+ except self.conn.exceptions.ClusterSnapshotNotFoundFault:
202
202
  return None
@@ -186,8 +186,7 @@ class RedshiftDataHook(AwsGenericHook["RedshiftDataAPIServiceClient"]):
186
186
  RedshiftDataQueryFailedError if status == FAILED_STATE else RedshiftDataQueryAbortedError
187
187
  )
188
188
  raise exception_cls(
189
- f"Statement {resp['Id']} terminated with status {status}. "
190
- f"Response details: {pformat(resp)}"
189
+ f"Statement {resp['Id']} terminated with status {status}. Response details: {pformat(resp)}"
191
190
  )
192
191
 
193
192
  self.log.info("Query status: %s", status)
@@ -131,7 +131,7 @@ def secondary_training_status_message(
131
131
  status_strs = []
132
132
  for transition in transitions_to_print:
133
133
  message = transition["StatusMessage"]
134
- time_utc = timezone.convert_to_utc(cast(datetime, job_description["LastModifiedTime"]))
134
+ time_utc = timezone.convert_to_utc(cast("datetime", job_description["LastModifiedTime"]))
135
135
  status_strs.append(f"{time_utc:%Y-%m-%d %H:%M:%S} {transition['Status']} - {message}")
136
136
 
137
137
  return "\n".join(status_strs)
@@ -25,6 +25,5 @@ class AthenaQueryResultsLink(BaseAwsLink):
25
25
  name = "Query Results"
26
26
  key = "_athena_query_results"
27
27
  format_str = (
28
- BASE_AWS_CONSOLE_LINK + "/athena/home?region={region_name}#"
29
- "/query-editor/history/{query_execution_id}"
28
+ BASE_AWS_CONSOLE_LINK + "/athena/home?region={region_name}#/query-editor/history/{query_execution_id}"
30
29
  )
@@ -17,20 +17,31 @@
17
17
  # under the License.
18
18
  from __future__ import annotations
19
19
 
20
+ import copy
21
+ import json
22
+ import logging
23
+ import os
20
24
  from datetime import date, datetime, timedelta, timezone
21
25
  from functools import cached_property
26
+ from pathlib import Path
22
27
  from typing import TYPE_CHECKING, Any
23
28
 
29
+ import attrs
24
30
  import watchtower
25
31
 
26
32
  from airflow.configuration import conf
27
33
  from airflow.providers.amazon.aws.hooks.logs import AwsLogsHook
28
34
  from airflow.providers.amazon.aws.utils import datetime_to_epoch_utc_ms
35
+ from airflow.providers.amazon.version_compat import AIRFLOW_V_3_0_PLUS
29
36
  from airflow.utils.log.file_task_handler import FileTaskHandler
30
37
  from airflow.utils.log.logging_mixin import LoggingMixin
31
38
 
32
39
  if TYPE_CHECKING:
33
- from airflow.models import TaskInstance
40
+ import structlog.typing
41
+
42
+ from airflow.models.taskinstance import TaskInstance
43
+ from airflow.sdk.types import RuntimeTaskInstanceProtocol as RuntimeTI
44
+ from airflow.utils.log.file_task_handler import LogMessages, LogSourceInfo
34
45
 
35
46
 
36
47
  def json_serialize_legacy(value: Any) -> str | None:
@@ -62,6 +73,155 @@ def json_serialize(value: Any) -> str | None:
62
73
  return watchtower._json_serialize_default(value)
63
74
 
64
75
 
76
+ @attrs.define(kw_only=True)
77
+ class CloudWatchRemoteLogIO(LoggingMixin): # noqa: D101
78
+ base_log_folder: Path = attrs.field(converter=Path)
79
+ remote_base: str = ""
80
+ delete_local_copy: bool = True
81
+
82
+ log_group_arn: str
83
+ log_stream_name: str = ""
84
+ log_group: str = attrs.field(init=False, repr=False)
85
+ region_name: str = attrs.field(init=False, repr=False)
86
+
87
+ @log_group.default
88
+ def _(self):
89
+ return self.log_group_arn.split(":")[6]
90
+
91
+ @region_name.default
92
+ def _(self):
93
+ return self.log_group_arn.split(":")[3]
94
+
95
+ @cached_property
96
+ def hook(self):
97
+ """Returns AwsLogsHook."""
98
+ return AwsLogsHook(
99
+ aws_conn_id=conf.get("logging", "remote_log_conn_id"), region_name=self.region_name
100
+ )
101
+
102
+ @cached_property
103
+ def handler(self) -> watchtower.CloudWatchLogHandler:
104
+ _json_serialize = conf.getimport("aws", "cloudwatch_task_handler_json_serializer", fallback=None)
105
+ return watchtower.CloudWatchLogHandler(
106
+ log_group_name=self.log_group,
107
+ log_stream_name=self.log_stream_name,
108
+ use_queues=True,
109
+ boto3_client=self.hook.get_conn(),
110
+ json_serialize_default=_json_serialize or json_serialize_legacy,
111
+ )
112
+
113
+ @cached_property
114
+ def processors(self) -> tuple[structlog.typing.Processor, ...]:
115
+ from logging import getLogRecordFactory
116
+
117
+ import structlog.stdlib
118
+
119
+ logRecordFactory = getLogRecordFactory()
120
+ # The handler MUST be initted here, before the processor is actually used to log anything.
121
+ # Otherwise, logging that occurs during the creation of the handler can create infinite loops.
122
+ _handler = self.handler
123
+ from airflow.sdk.log import relative_path_from_logger
124
+
125
+ def proc(logger: structlog.typing.WrappedLogger, method_name: str, event: structlog.typing.EventDict):
126
+ if not logger or not (stream_name := relative_path_from_logger(logger)):
127
+ return event
128
+ # Only init the handler stream_name once. We cannot do it above when we init the handler because
129
+ # we don't yet know the log path at that point.
130
+ if not _handler.log_stream_name:
131
+ _handler.log_stream_name = stream_name.as_posix().replace(":", "_")
132
+ name = event.get("logger_name") or event.get("logger", "")
133
+ level = structlog.stdlib.NAME_TO_LEVEL.get(method_name.lower(), logging.INFO)
134
+ msg = copy.copy(event)
135
+ created = None
136
+ if ts := msg.pop("timestamp", None):
137
+ try:
138
+ created = datetime.fromisoformat(ts)
139
+ except Exception:
140
+ pass
141
+ record = logRecordFactory(
142
+ name, level, pathname="", lineno=0, msg=msg, args=(), exc_info=None, func=None, sinfo=None
143
+ )
144
+ if created is not None:
145
+ ct = created.timestamp()
146
+ record.created = ct
147
+ record.msecs = int((ct - int(ct)) * 1000) + 0.0 # Copied from stdlib logging
148
+ _handler.handle(record)
149
+ return event
150
+
151
+ return (proc,)
152
+
153
+ def close(self):
154
+ self.handler.close()
155
+
156
+ def upload(self, path: os.PathLike | str, ti: RuntimeTI):
157
+ # No-op, as we upload via the processor as we go
158
+ # But we need to give the handler time to finish off its business
159
+ self.close()
160
+ return
161
+
162
+ def read(self, relative_path, ti: RuntimeTI) -> tuple[LogSourceInfo, LogMessages | None]:
163
+ logs: LogMessages | None = []
164
+ messages = [
165
+ f"Reading remote log from Cloudwatch log_group: {self.log_group} log_stream: {relative_path}"
166
+ ]
167
+ try:
168
+ if AIRFLOW_V_3_0_PLUS:
169
+ from airflow.utils.log.file_task_handler import StructuredLogMessage
170
+
171
+ logs = [
172
+ StructuredLogMessage.model_validate(log)
173
+ for log in self.get_cloudwatch_logs(relative_path, ti)
174
+ ]
175
+ else:
176
+ logs = [self.get_cloudwatch_logs(relative_path, ti)] # type: ignore[arg-value]
177
+ except Exception as e:
178
+ logs = None
179
+ messages.append(str(e))
180
+
181
+ return messages, logs
182
+
183
+ def get_cloudwatch_logs(self, stream_name: str, task_instance: RuntimeTI):
184
+ """
185
+ Return all logs from the given log stream.
186
+
187
+ :param stream_name: name of the Cloudwatch log stream to get all logs from
188
+ :param task_instance: the task instance to get logs about
189
+ :return: string of all logs from the given log stream
190
+ """
191
+ stream_name = stream_name.replace(":", "_")
192
+ # If there is an end_date to the task instance, fetch logs until that date + 30 seconds
193
+ # 30 seconds is an arbitrary buffer so that we don't miss any logs that were emitted
194
+ end_time = (
195
+ None
196
+ if (end_date := getattr(task_instance, "end_date", None)) is None
197
+ else datetime_to_epoch_utc_ms(end_date + timedelta(seconds=30))
198
+ )
199
+ events = self.hook.get_log_events(
200
+ log_group=self.log_group,
201
+ log_stream_name=stream_name,
202
+ end_time=end_time,
203
+ )
204
+ if AIRFLOW_V_3_0_PLUS:
205
+ return list(self._event_to_dict(e) for e in events)
206
+ return "\n".join(self._event_to_str(event) for event in events)
207
+
208
+ def _event_to_dict(self, event: dict) -> dict:
209
+ event_dt = datetime.fromtimestamp(event["timestamp"] / 1000.0, tz=timezone.utc).isoformat()
210
+ message = event["message"]
211
+ try:
212
+ message = json.loads(message)
213
+ message["timestamp"] = event_dt
214
+ return message
215
+ except Exception:
216
+ return {"timestamp": event_dt, "event": message}
217
+
218
+ def _event_to_str(self, event: dict) -> str:
219
+ event_dt = datetime.fromtimestamp(event["timestamp"] / 1000.0, tz=timezone.utc)
220
+ formatted_event_dt = event_dt.strftime("%Y-%m-%d %H:%M:%S,%f")[:-3]
221
+ message = event["message"]
222
+ return f"[{formatted_event_dt}] {message}"
223
+
224
+
65
225
  class CloudwatchTaskHandler(FileTaskHandler, LoggingMixin):
66
226
  """
67
227
  CloudwatchTaskHandler is a python log handler that handles and reads task instance logs.
@@ -84,6 +244,11 @@ class CloudwatchTaskHandler(FileTaskHandler, LoggingMixin):
84
244
  self.region_name = split_arn[3]
85
245
  self.closed = False
86
246
 
247
+ self.io = CloudWatchRemoteLogIO(
248
+ base_log_folder=base_log_folder,
249
+ log_group_arn=log_group_arn,
250
+ )
251
+
87
252
  @cached_property
88
253
  def hook(self):
89
254
  """Returns AwsLogsHook."""
@@ -97,14 +262,9 @@ class CloudwatchTaskHandler(FileTaskHandler, LoggingMixin):
97
262
 
98
263
  def set_context(self, ti: TaskInstance, *, identifier: str | None = None):
99
264
  super().set_context(ti)
100
- _json_serialize = conf.getimport("aws", "cloudwatch_task_handler_json_serializer", fallback=None)
101
- self.handler = watchtower.CloudWatchLogHandler(
102
- log_group_name=self.log_group,
103
- log_stream_name=self._render_filename(ti, ti.try_number),
104
- use_queues=not getattr(ti, "is_trigger_log_context", False),
105
- boto3_client=self.hook.get_conn(),
106
- json_serialize_default=_json_serialize or json_serialize_legacy,
107
- )
265
+ self.io.log_stream_name = self._render_filename(ti, ti.try_number)
266
+
267
+ self.handler = self.io.handler
108
268
 
109
269
  def close(self):
110
270
  """Close the handler responsible for the upload of the local log file to Cloudwatch."""
@@ -120,49 +280,9 @@ class CloudwatchTaskHandler(FileTaskHandler, LoggingMixin):
120
280
  # Mark closed so we don't double write if close is called twice
121
281
  self.closed = True
122
282
 
123
- def _read(self, task_instance, try_number, metadata=None):
283
+ def _read_remote_logs(
284
+ self, task_instance, try_number, metadata=None
285
+ ) -> tuple[LogSourceInfo, LogMessages]:
124
286
  stream_name = self._render_filename(task_instance, try_number)
125
- try:
126
- return (
127
- f"*** Reading remote log from Cloudwatch log_group: {self.log_group} "
128
- f"log_stream: {stream_name}.\n"
129
- f"{self.get_cloudwatch_logs(stream_name=stream_name, task_instance=task_instance)}\n",
130
- {"end_of_log": True},
131
- )
132
- except Exception as e:
133
- log = (
134
- f"*** Unable to read remote logs from Cloudwatch (log_group: {self.log_group}, log_stream: "
135
- f"{stream_name})\n*** {e}\n\n"
136
- )
137
- self.log.error(log)
138
- local_log, metadata = super()._read(task_instance, try_number, metadata)
139
- log += local_log
140
- return log, metadata
141
-
142
- def get_cloudwatch_logs(self, stream_name: str, task_instance: TaskInstance) -> str:
143
- """
144
- Return all logs from the given log stream.
145
-
146
- :param stream_name: name of the Cloudwatch log stream to get all logs from
147
- :param task_instance: the task instance to get logs about
148
- :return: string of all logs from the given log stream
149
- """
150
- # If there is an end_date to the task instance, fetch logs until that date + 30 seconds
151
- # 30 seconds is an arbitrary buffer so that we don't miss any logs that were emitted
152
- end_time = (
153
- None
154
- if task_instance.end_date is None
155
- else datetime_to_epoch_utc_ms(task_instance.end_date + timedelta(seconds=30))
156
- )
157
- events = self.hook.get_log_events(
158
- log_group=self.log_group,
159
- log_stream_name=stream_name,
160
- end_time=end_time,
161
- )
162
- return "\n".join(self._event_to_str(event) for event in events)
163
-
164
- def _event_to_str(self, event: dict) -> str:
165
- event_dt = datetime.fromtimestamp(event["timestamp"] / 1000.0, tz=timezone.utc)
166
- formatted_event_dt = event_dt.strftime("%Y-%m-%d %H:%M:%S,%f")[:-3]
167
- message = event["message"]
168
- return f"[{formatted_event_dt}] {message}"
287
+ messages, logs = self.io.read(stream_name, task_instance)
288
+ return messages, logs or []