Repository: GoogleCloudPlatform/cloud-sql-python-connector (python)

Issue:
Add support for `GOOGLE_CLOUD_UNIVERSE_DOMAIN` env variable
Google Client libraries should check the env variable `GOOGLE_CLOUD_UNIVERSE_DOMAIN` as a secondary way of setting the TPC universe.

Priority should be as follows:

1. Use `universe_domain` param of `Connector` if set
2. Use `GOOGLE_CLOUD_UNIVERSE_DOMAIN` env variable if set
3. Default to `googleapis.com`

Pull request description:
feat: add support for `GOOGLE_CLOUD_UNIVERSE_DOMAIN` env var
Add support for `universe_domain` to be set via the `GOOGLE_CLOUD_UNIVERSE_DOMAIN` env var.

This will allow zero code changes to support non-GDU environments, instead users can set the env var.

Order of operations for setting universe domain will be as follows:

1. Use `universe_domain` argument passed to `Connector()`
2. Use `GOOGLE_CLOUD_UNIVERSE_DOMAIN` env var
3. Use default `"googleapis.com"`

Fixes #1217 

Patch:
diff --git a/google/cloud/sql/connector/connector.py b/google/cloud/sql/connector/connector.py
index ada14cb..5160513 100755
--- a/google/cloud/sql/connector/connector.py
+++ b/google/cloud/sql/connector/connector.py
@@ -19,6 +19,7 @@ from __future__ import annotations
 import asyncio
 from functools import partial
 import logging
+import os
 from threading import Thread
 from types import TracebackType
 from typing import Any, Optional, Union
@@ -171,7 +172,11 @@ class Connector:
         if isinstance(ip_type, str):
             ip_type = IPTypes._from_str(ip_type)
         self._ip_type = ip_type
-        self._universe_domain = universe_domain
+        # check for universe domain arg and then env var
+        if universe_domain:
+            self._universe_domain = universe_domain
+        else:
+            self._universe_domain = os.environ.get("GOOGLE_CLOUD_UNIVERSE_DOMAIN")  # type: ignore
         # construct service endpoint for Cloud SQL Admin API calls
         if not sqladmin_api_endpoint:
             self._sqladmin_api_endpoint = (


Test patch:
diff --git a/tests/unit/test_connector.py b/tests/unit/test_connector.py
index d4f53ed..eaf188c 100644
--- a/tests/unit/test_connector.py
+++ b/tests/unit/test_connector.py
@@ -15,6 +15,7 @@ limitations under the License.
 """
 
 import asyncio
+import os
 from typing import Union
 
 from aiohttp import ClientResponseError
@@ -428,3 +429,25 @@ def test_configured_universe_domain_mismatched_credentials(
         "is the default."
     )
     assert exc_info.value.args[0] == err_msg
+
+
+def test_configured_universe_domain_env_var(
+    fake_credentials: Credentials,
+) -> None:
+    """Test that configured universe domain succeeds with universe
+    domain set via GOOGLE_CLOUD_UNIVERSE_DOMAIN env var.
+    """
+    universe_domain = "test-universe.test"
+    # set fake credentials to be configured for the universe domain
+    fake_credentials._universe_domain = universe_domain
+    # set environment variable
+    os.environ["GOOGLE_CLOUD_UNIVERSE_DOMAIN"] = universe_domain
+    # Note: we are not passing universe_domain arg, env var should set it
+    with Connector(credentials=fake_credentials) as connector:
+        # test universe domain was configured
+        assert connector._universe_domain == universe_domain
+        # test property and service endpoint construction
+        assert connector.universe_domain == universe_domain
+        assert connector._sqladmin_api_endpoint == f"https://sqladmin.{universe_domain}"
+    # unset env var
+    del os.environ["GOOGLE_CLOUD_UNIVERSE_DOMAIN"]