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.
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/PKG-INFO +1 -1
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/pyproject.toml +3 -2
- {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
- {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
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/dms.py +3 -1
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sagemaker.py +1 -1
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/athena.py +1 -2
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/ec2.py +1 -1
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/eks.py +3 -3
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sagemaker.py +3 -5
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glacier.py +1 -1
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/mwaa.py +2 -1
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/s3.py +1 -1
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/get_provider_info.py +2 -2
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/README.rst +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/LICENSE +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/assets/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/assets/s3.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/exceptions.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/Dockerfile +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/executors/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/fs/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/fs/s3.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/appflow.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/athena.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/bedrock.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/chime.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/comprehend.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/datasync.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/dynamodb.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ec2.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ecr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ecs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/eks.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/emr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/eventbridge.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glacier.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/glue.py +0 -0
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/kinesis.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/logs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/mwaa.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/neptune.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/quicksight.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/rds.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/s3.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ses.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sns.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sqs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/ssm.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/hooks/sts.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/__init__.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/batch.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/comprehend.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/datasync.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/ec2.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/emr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/glue.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/logs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/links/sagemaker.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/log/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/chime.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/sns.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/notifications/sqs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/appflow.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/athena.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/batch.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/bedrock.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/comprehend.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/datasync.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/dms.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/ecs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/emr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/eventbridge.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glacier.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/glue.py +0 -0
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/mwaa.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/neptune.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/quicksight.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/rds.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/s3.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sns.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/operators/sqs.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/secrets/__init__.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/athena.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/batch.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/bedrock.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/comprehend.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/dms.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/dynamodb.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/ec2.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/ecs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/eks.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/emr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/glue.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/quicksight.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/rds.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/sagemaker.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/sensors/sqs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/__init__.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/transfers/base.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/README.md +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/athena.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/base.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/batch.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/bedrock.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/comprehend.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/dms.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/ec2.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/ecs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/eks.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/emr.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/glue.py +0 -0
- {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
- {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
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/mwaa.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/neptune.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/rds.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/s3.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/sagemaker.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/triggers/sqs.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/__init__.py +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/emailer.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/identifiers.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/mixins.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/openlineage.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/rds.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/redshift.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/sagemaker.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/sqs.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/suppress.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/tags.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/utils/waiter.py +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/README.md +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/__init__.py +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/appflow.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/athena.json +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/batch.json +0 -0
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/bedrock.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/comprehend.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/databrew.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/dms.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/dynamodb.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/ecs.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/eks.json +0 -0
- {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
- {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
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/emr.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/glue.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/kinesisanalyticsv2.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/mwaa.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/neptune.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/opensearchserverless.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/rds.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/redshift.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/sagemaker.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/aws/waiters/stepfunctions.json +0 -0
- {apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/src/airflow/providers/amazon/version_compat.py +0 -0
{apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: apache-airflow-providers-amazon
|
3
|
-
Version: 9.5.
|
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>
|
{apache_airflow_providers_amazon-9.5.0rc2 → apache_airflow_providers_amazon-9.5.0rc3}/pyproject.toml
RENAMED
@@ -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.
|
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.
|
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
|
-
|
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
|
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
|
149
|
+
f"awsathena+{conn_params['driver']}",
|
150
150
|
username=creds.access_key,
|
151
151
|
password=creds.secret_key,
|
152
|
-
host=f
|
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,
|
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
|
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 =
|
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.
|
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.
|
90
|
+
response = self.conn.describe_clusters(ClusterIdentifier=cluster_identifier)["Clusters"]
|
91
91
|
return response[0]["ClusterStatus"] if response else None
|
92
|
-
except self.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
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
|
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
|
-
|
126
|
-
|
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 []
|