This is an automated email from the ASF dual-hosted git repository.
shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new fecccf8eeb5 Fix Amazon provider log messages to show actual values
(#69967)
fecccf8eeb5 is described below
commit fecccf8eeb5cdf3a05fec61bd96701df69a31266
Author: Hojeong Park <[email protected]>
AuthorDate: Thu Jul 23 03:00:28 2026 +0900
Fix Amazon provider log messages to show actual values (#69967)
---
.../src/airflow/providers/amazon/aws/hooks/s3.py | 2 +-
.../providers/amazon/aws/sensors/dynamodb.py | 2 +-
.../amazon/tests/unit/amazon/aws/hooks/test_s3.py | 32 +++++++++++++++++++++-
.../tests/unit/amazon/aws/sensors/test_dynamodb.py | 6 +++-
4 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
index 626ac19730d..e182afef051 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
@@ -831,7 +831,7 @@ class S3Hook(AwsBaseHook):
if current_num_objects >= min_objects:
success_message = (
f"SUCCESS: Sensor found {current_num_objects} objects at
{path}. "
- "Waited at least {inactivity_period} seconds, with no new
objects uploaded."
+ f"Waited at least {inactivity_period} seconds, with no new
objects uploaded."
)
self.log.info(success_message)
return {
diff --git
a/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
b/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
index c4236054110..8bf1a67f56c 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
@@ -122,7 +122,7 @@ class DynamoDBValueSensor(AwsBaseSensor[DynamoDBHook]):
item_attribute_value = response["Item"][self.attribute_name]
self.log.info("Response: %s", response)
self.log.info("Want: %s = %s", self.attribute_name,
self.attribute_value)
- self.log.info("Got: {response['Item'][self.attribute_name]} =
%s", item_attribute_value)
+ self.log.info("Got: %s = %s", self.attribute_name,
item_attribute_value)
return item_attribute_value in (
[self.attribute_value] if isinstance(self.attribute_value,
str) else self.attribute_value
)
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
index c4cc20d2231..d45f2642c1d 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
@@ -22,7 +22,7 @@ import inspect
import os
import re
from collections.abc import Iterator
-from datetime import datetime as std_datetime, timezone
+from datetime import datetime as std_datetime, timedelta, timezone
from pathlib import Path
from unittest import mock, mock as async_mock
from unittest.mock import AsyncMock, MagicMock, Mock, patch
@@ -1137,6 +1137,36 @@ class TestAwsS3Hook:
assert response == {"message": "test_bucket/test between pokes.",
"status": "error"}
+ @pytest.mark.asyncio
+ @mock.patch.object(S3Hook, "_list_keys_async", autospec=True)
+ async def test_s3_key_hook_is_keys_unchanged_success_async(self,
mock_list_keys, time_machine):
+ frozen_dt = std_datetime(2026, 1, 1, 12, 0, 5, tzinfo=timezone.utc)
+ time_machine.move_to(frozen_dt, tick=False)
+ mock_list_keys.return_value = ["test"]
+
+ s3_hook_async = S3Hook()
+ mock_client = AsyncMock()
+
+ response = await s3_hook_async.is_keys_unchanged_async(
+ client=mock_client,
+ bucket_name="test_bucket",
+ prefix="test",
+ inactivity_period=3,
+ min_objects=1,
+ previous_objects={"test"},
+ inactivity_seconds=0,
+ allow_delete=False,
+ last_activity_time=frozen_dt - timedelta(seconds=5),
+ )
+
+ assert response == {
+ "status": "success",
+ "message": (
+ "SUCCESS: Sensor found 1 objects at test_bucket/test. "
+ "Waited at least 3 seconds, with no new objects uploaded."
+ ),
+ }
+
@pytest.mark.asyncio
@async_mock.patch("airflow.providers.amazon.aws.triggers.s3.S3Hook._list_keys_async")
async def test_s3_key_hook_is_keys_unchanged_async_handle_tzinfo(self,
mock_list_keys):
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
b/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
index f34acf3aac4..e8ea324ff8c 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
@@ -17,6 +17,8 @@
from __future__ import annotations
+from unittest import mock
+
from moto import mock_aws
from airflow.providers.amazon.aws.hooks.dynamodb import DynamoDBHook
@@ -187,8 +189,9 @@ class TestDynamoDBMultipleValuesSensor:
assert sensor.hook._verify is None
assert sensor.hook._config is None
+ @mock.patch.object(DynamoDBValueSensor, "log")
@mock_aws
- def test_sensor_with_pk(self):
+ def test_sensor_with_pk(self, mock_log):
hook = DynamoDBHook(table_name=self.table_name,
table_keys=[self.pk_name])
hook.conn.create_table(
@@ -204,6 +207,7 @@ class TestDynamoDBMultipleValuesSensor:
hook.write_batch_data(items)
assert self.sensor_pk.poke(None)
+ mock_log.info.assert_any_call("Got: %s = %s", self.attribute_name,
self.attribute_value[1])
@mock_aws
def test_sensor_with_pk_and_sk(self):