diff --git a/google/auth/compute_engine/_metadata.py b/google/auth/compute_engine/_metadata.py index 35b6c4495..f8a403b2e 100644 --- a/google/auth/compute_engine/_metadata.py +++ b/google/auth/compute_engine/_metadata.py @@ -294,7 +294,7 @@ def get( url = _helpers.update_query(base_url, query_params) backoff = ExponentialBackoff(total_attempts=retry_count) - failure_reason = None + last_exception = None for attempt in backoff: try: response = request( @@ -308,13 +308,10 @@ def get( retry_count, response.status, ) - failure_reason = ( - response.data.decode("utf-8") - if hasattr(response.data, "decode") - else response.data - ) + last_exception = None continue else: + last_exception = None break except exceptions.TransportError as e: @@ -325,14 +322,27 @@ def get( retry_count, e, ) - failure_reason = e + last_exception = e else: - raise exceptions.TransportError( - "Failed to retrieve {} from the Google Compute Engine " - "metadata service. Compute Engine Metadata server unavailable due to {}".format( - url, failure_reason + if last_exception: + raise exceptions.TransportError( + "Failed to retrieve {} from the Google Compute Engine " + "metadata service. Compute Engine Metadata server unavailable. " + "Last exception: {}".format(url, last_exception) + ) from last_exception + else: + error_details = ( + response.data.decode("utf-8") + if hasattr(response.data, "decode") + else response.data + ) + raise exceptions.TransportError( + "Failed to retrieve {} from the Google Compute Engine " + "metadata service. Compute Engine Metadata server unavailable. " + "Response status: {}\nResponse details:\n{}".format( + url, response.status, error_details + ) ) - ) content = _helpers.from_bytes(response.data) diff --git a/tests/compute_engine/test__metadata.py b/tests/compute_engine/test__metadata.py index 5bb85c264..2a3f4c7ed 100644 --- a/tests/compute_engine/test__metadata.py +++ b/tests/compute_engine/test__metadata.py @@ -407,7 +407,7 @@ def test_get_failure_connection_failed(mock_sleep): _metadata.get(request, PATH) assert excinfo.match( - r"Compute Engine Metadata server unavailable due to failure message" + r"Compute Engine Metadata server unavailable. Last exception: failure message" ) request.assert_called_with( @@ -426,7 +426,7 @@ def test_get_too_many_requests_retryable_error_failure(): _metadata.get(request, PATH) assert excinfo.match( - r"Compute Engine Metadata server unavailable due to too many requests" + r"Compute Engine Metadata server unavailable. Response status: 429\nResponse details:\ntoo many requests" ) request.assert_called_with(