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 25c9c0557e6 Update SecretsManagerBackend to support multi-team (#65395)
25c9c0557e6 is described below

commit 25c9c0557e6ff3bdeaf8185ba2977cf77339eae3
Author: Justin Pakzad <[email protected]>
AuthorDate: Mon Apr 20 14:07:47 2026 -0400

    Update SecretsManagerBackend to support multi-team (#65395)
---
 .../amazon/aws/secrets/secrets_manager.py          | 15 ++++++++++----
 .../amazon/aws/secrets/test_secrets_manager.py     | 24 ++++++++++++++++++++++
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git 
a/providers/amazon/src/airflow/providers/amazon/aws/secrets/secrets_manager.py 
b/providers/amazon/src/airflow/providers/amazon/aws/secrets/secrets_manager.py
index 3ec98f0a629..93210798b06 100644
--- 
a/providers/amazon/src/airflow/providers/amazon/aws/secrets/secrets_manager.py
+++ 
b/providers/amazon/src/airflow/providers/amazon/aws/secrets/secrets_manager.py
@@ -207,7 +207,9 @@ class SecretsManagerBackend(BaseSecretsBackend, 
LoggingMixin):
         if self.connections_prefix is None:
             return None
 
-        secret = self._get_secret(self.connections_prefix, conn_id, 
self.connections_lookup_pattern)
+        secret = self._get_secret(
+            self.connections_prefix, conn_id, self.connections_lookup_pattern, 
team_name
+        )
 
         if secret is not None and secret.strip().startswith("{"):
             # Before Airflow 2.3, the AWS SecretsManagerBackend added support 
for JSON secrets.
@@ -237,7 +239,7 @@ class SecretsManagerBackend(BaseSecretsBackend, 
LoggingMixin):
         if self.variables_prefix is None:
             return None
 
-        return self._get_secret(self.variables_prefix, key, 
self.variables_lookup_pattern)
+        return self._get_secret(self.variables_prefix, key, 
self.variables_lookup_pattern, team_name)
 
     def get_config(self, key: str) -> str | None:
         """
@@ -251,7 +253,9 @@ class SecretsManagerBackend(BaseSecretsBackend, 
LoggingMixin):
 
         return self._get_secret(self.config_prefix, key, 
self.config_lookup_pattern)
 
-    def _get_secret(self, path_prefix, secret_id: str, lookup_pattern: str | 
None) -> str | None:
+    def _get_secret(
+        self, path_prefix, secret_id: str, lookup_pattern: str | None, 
team_name: str | None = None
+    ) -> str | None:
         """
         Get secret value from Secrets Manager.
 
@@ -264,7 +268,10 @@ class SecretsManagerBackend(BaseSecretsBackend, 
LoggingMixin):
             return None
 
         error_msg = "An error occurred when calling the get_secret_value 
operation"
-        if path_prefix:
+        if path_prefix and team_name:
+            secrets_path = self.build_path(path_prefix, team_name, self.sep)
+            secrets_path = self.build_path(secrets_path, secret_id, self.sep)
+        elif path_prefix:
             secrets_path = self.build_path(path_prefix, secret_id, self.sep)
         else:
             secrets_path = secret_id
diff --git 
a/providers/amazon/tests/unit/amazon/aws/secrets/test_secrets_manager.py 
b/providers/amazon/tests/unit/amazon/aws/secrets/test_secrets_manager.py
index ea4b2e4a658..5a4c669775a 100644
--- a/providers/amazon/tests/unit/amazon/aws/secrets/test_secrets_manager.py
+++ b/providers/amazon/tests/unit/amazon/aws/secrets/test_secrets_manager.py
@@ -65,6 +65,20 @@ class TestSecretsManagerBackend:
         assert secrets_manager_backend.get_conn_value(conn_id=conn_id) is None
         assert secrets_manager_backend.get_connection(conn_id=conn_id) is None
 
+    @mock_aws
+    def test_get_conn_value_with_team_name(self):
+        secret_id = "airflow/connections/my_team/test_postgres"
+        create_param = {
+            "Name": secret_id,
+            "SecretString": "postgresql://airflow:airflow@host:5432/airflow",
+        }
+
+        secrets_manager_backend = SecretsManagerBackend()
+        secrets_manager_backend.client.create_secret(**create_param)
+
+        returned_uri = 
secrets_manager_backend.get_conn_value(conn_id="test_postgres", 
team_name="my_team")
+        assert returned_uri == "postgresql://airflow:airflow@host:5432/airflow"
+
     @mock_aws
     def test_get_variable(self):
         secret_id = "airflow/variables/hello"
@@ -90,6 +104,16 @@ class TestSecretsManagerBackend:
 
         assert secrets_manager_backend.get_variable("test_mysql") is None
 
+    @mock_aws
+    def test_get_variable_with_team_name(self):
+        secret_id = "airflow/variables/my_team/hello"
+        create_param = {"Name": secret_id, "SecretString": "world"}
+
+        secrets_manager_backend = SecretsManagerBackend()
+        secrets_manager_backend.client.create_secret(**create_param)
+
+        assert secrets_manager_backend.get_variable(key="hello", 
team_name="my_team") == "world"
+
     @mock_aws
     def test_get_config_non_existent_key(self):
         """

Reply via email to