From 0ecaefb68d96944c2ba81f33b05613c45da860b1 Mon Sep 17 00:00:00 2001 From: Helio Machado <0x2b3bfa0+git@googlemail.com> Date: Fri, 3 Apr 2026 09:42:55 +0400 Subject: [PATCH] Skip cloud credential method when NO_GCE_CHECK=true When auto-detecting credentials (method=None), skip the "cloud" method if the NO_GCE_CHECK environment variable is set to "true". This avoids unnecessary metadata server requests in environments where GCE is known to be unavailable. Co-Authored-By: Claude Opus 4.6 --- gcsfs/credentials.py | 5 ++++- gcsfs/tests/test_credentials.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gcsfs/credentials.py b/gcsfs/credentials.py index 2a7814a5..796dad47 100644 --- a/gcsfs/credentials.py +++ b/gcsfs/credentials.py @@ -322,7 +322,10 @@ def connect(self, method=None): ]: self._connect_token(method) elif method is None: - for meth in ["google_default", "cache", "cloud", "anon"]: + methods = ["google_default", "cache", "cloud", "anon"] + if os.environ.get("NO_GCE_CHECK") == "true": + methods.remove("cloud") + for meth in methods: try: self.connect(method=meth) logger.debug("Connected with method %s", meth) diff --git a/gcsfs/tests/test_credentials.py b/gcsfs/tests/test_credentials.py index 942cd045..af9d47df 100644 --- a/gcsfs/tests/test_credentials.py +++ b/gcsfs/tests/test_credentials.py @@ -18,6 +18,20 @@ def test_googlecredentials_none(): credentials.apply(headers) +def test_no_gce_check_skips_cloud(): + """When NO_GCE_CHECK=true, the 'cloud' method should not be attempted.""" + with patch.dict(os.environ, {"NO_GCE_CHECK": "true"}): + with patch.object(GoogleCredentials, "_connect_cloud") as mock_cloud: + # google_default and cloud will fail; anon will succeed + with patch.object( + GoogleCredentials, + "_connect_google_default", + side_effect=ValueError("no default"), + ): + GoogleCredentials(project="myproject", token=None, access="read_only") + mock_cloud.assert_not_called() + + def test_connect_google_default_uses_request(): with patch("gcsfs.credentials.gauth.default") as mock_default: mock_default.return_value = (Mock(), "my-project")