This is an automated email from the ASF dual-hosted git repository.

vincbeck 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 cb7f6afe039 fix RedshiftSQLHook._get_conn_params connection mutation 
with iam (#64991)
cb7f6afe039 is described below

commit cb7f6afe039e1dd10650d71015b357af74e43801
Author: Justin Pakzad <[email protected]>
AuthorDate: Mon Apr 13 09:25:32 2026 -0400

    fix RedshiftSQLHook._get_conn_params connection mutation with iam (#64991)
---
 .../providers/amazon/aws/hooks/redshift_sql.py     | 20 +++++++++-------
 .../unit/amazon/aws/hooks/test_redshift_sql.py     | 27 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 8 deletions(-)

diff --git 
a/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_sql.py 
b/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_sql.py
index eca7bd5afb3..0a55c2bdc26 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_sql.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/redshift_sql.py
@@ -88,16 +88,20 @@ class RedshiftSQLHook(DbApiHook):
         conn_params: dict[str, str | int] = {}
 
         if conn.extra_dejson.get("iam", False):
-            conn.login, conn.password, conn.port = self.get_iam_token(conn)
-
-        if conn.login:
-            conn_params["user"] = conn.login
-        if conn.password:
-            conn_params["password"] = conn.password
+            login, password, port = self.get_iam_token(conn)
+        else:
+            login = conn.login
+            password = conn.password
+            port = conn.port
+
+        if login:
+            conn_params["user"] = login
+        if password:
+            conn_params["password"] = password
+        if port:
+            conn_params["port"] = port
         if conn.host:
             conn_params["host"] = conn.host
-        if conn.port:
-            conn_params["port"] = conn.port
         if conn.schema:
             conn_params["database"] = conn.schema
 
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_redshift_sql.py 
b/providers/amazon/tests/unit/amazon/aws/hooks/test_redshift_sql.py
index f1cf9855170..c8aaa5ac938 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_redshift_sql.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_redshift_sql.py
@@ -242,6 +242,33 @@ class TestRedshiftSQLHookConn:
                 AutoCreate=False,
             )
 
+    @mock.patch("airflow.providers.amazon.aws.hooks.base_aws.AwsBaseHook.conn")
+    
@mock.patch("airflow.providers.amazon.aws.hooks.redshift_sql.redshift_connector.connect")
+    def test_get_conn_iam_does_not_mutate_connection(self, mock_connect, 
mock_aws_hook_conn):
+        self.connection.extra = json.dumps(
+            {"iam": True, "profile": "default", "cluster_identifier": 
"my-test-cluster"}
+        )
+
+        mock_db_user = f"IAM:{LOGIN_USER}"
+        mock_db_pass = "aws_token"
+
+        mock_aws_hook_conn.get_cluster_credentials.return_value = {
+            "DbPassword": mock_db_pass,
+            "DbUser": mock_db_user,
+        }
+        self.db_hook.get_conn()
+        self.db_hook.get_conn()
+        assert mock_aws_hook_conn.get_cluster_credentials.call_count == 2
+        for call in mock_aws_hook_conn.get_cluster_credentials.call_args_list:
+            assert call == mock.call(
+                DbUser=LOGIN_USER,
+                DbName=LOGIN_SCHEMA,
+                ClusterIdentifier="my-test-cluster",
+                AutoCreate=False,
+            )
+
+        assert self.connection.login == LOGIN_USER
+
     @mock.patch.dict("os.environ", 
AIRFLOW_CONN_AWS_DEFAULT=f"aws://?region_name={MOCK_REGION_NAME}")
     @pytest.mark.parametrize(
         ("connection_host", "connection_extra", "expected_identity"),

Reply via email to