Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 22 additions & 12 deletions google/auth/compute_engine/_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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:
Expand All @@ -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)

Expand Down
4 changes: 2 additions & 2 deletions tests/compute_engine/test__metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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(
Expand Down
Loading