Skip to content

Commit 9f7d3fa

Browse files
authored
fix: add request timeout for MDS requests (#1699)
* fix: add request timeout for MDS requests * add seconds
1 parent 7495960 commit 9f7d3fa

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

google/auth/compute_engine/_metadata.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ def get(
159159
retry_count=5,
160160
headers=None,
161161
return_none_for_not_found_error=False,
162+
timeout=_METADATA_DEFAULT_TIMEOUT,
162163
):
163164
"""Fetch a resource from the metadata server.
164165
@@ -178,6 +179,7 @@ def get(
178179
headers (Optional[Mapping[str, str]]): Headers for the request.
179180
return_none_for_not_found_error (Optional[bool]): If True, returns None
180181
for 404 error instead of throwing an exception.
182+
timeout (int): How long to wait, in seconds for the metadata server to respond.
181183
182184
Returns:
183185
Union[Mapping, str]: If the metadata server returns JSON, a mapping of
@@ -204,7 +206,9 @@ def get(
204206
failure_reason = None
205207
for attempt in backoff:
206208
try:
207-
response = request(url=url, method="GET", headers=headers_to_use)
209+
response = request(
210+
url=url, method="GET", headers=headers_to_use, timeout=timeout
211+
)
208212
if response.status in transport.DEFAULT_RETRYABLE_STATUS_CODES:
209213
_LOGGER.warning(
210214
"Compute Engine Metadata server unavailable on "

system_tests/secrets.tar.enc

0 Bytes
Binary file not shown.

tests/compute_engine/test__metadata.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ def test_get_success_json():
174174
method="GET",
175175
url=_metadata._METADATA_ROOT + PATH,
176176
headers=_metadata._METADATA_HEADERS,
177+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
177178
)
178179
assert result[key] == value
179180

@@ -192,6 +193,7 @@ def test_get_success_json_content_type_charset():
192193
method="GET",
193194
url=_metadata._METADATA_ROOT + PATH,
194195
headers=_metadata._METADATA_HEADERS,
196+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
195197
)
196198
assert result[key] == value
197199

@@ -211,6 +213,7 @@ def test_get_success_retry(mock_sleep):
211213
method="GET",
212214
url=_metadata._METADATA_ROOT + PATH,
213215
headers=_metadata._METADATA_HEADERS,
216+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
214217
)
215218
assert request.call_count == 2
216219
assert result[key] == value
@@ -226,6 +229,7 @@ def test_get_success_text():
226229
method="GET",
227230
url=_metadata._METADATA_ROOT + PATH,
228231
headers=_metadata._METADATA_HEADERS,
232+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
229233
)
230234
assert result == data
231235

@@ -241,6 +245,7 @@ def test_get_success_params():
241245
method="GET",
242246
url=_metadata._METADATA_ROOT + PATH + "?recursive=true",
243247
headers=_metadata._METADATA_HEADERS,
248+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
244249
)
245250
assert result == data
246251

@@ -255,6 +260,7 @@ def test_get_success_recursive_and_params():
255260
method="GET",
256261
url=_metadata._METADATA_ROOT + PATH + "?recursive=true",
257262
headers=_metadata._METADATA_HEADERS,
263+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
258264
)
259265
assert result == data
260266

@@ -269,6 +275,7 @@ def test_get_success_recursive():
269275
method="GET",
270276
url=_metadata._METADATA_ROOT + PATH + "?recursive=true",
271277
headers=_metadata._METADATA_HEADERS,
278+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
272279
)
273280
assert result == data
274281

@@ -290,6 +297,7 @@ def test_get_success_custom_root_new_variable():
290297
method="GET",
291298
url="http://{}/computeMetadata/v1/{}".format(fake_root, PATH),
292299
headers=_metadata._METADATA_HEADERS,
300+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
293301
)
294302

295303

@@ -310,6 +318,7 @@ def test_get_success_custom_root_old_variable():
310318
method="GET",
311319
url="http://{}/computeMetadata/v1/{}".format(fake_root, PATH),
312320
headers=_metadata._METADATA_HEADERS,
321+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
313322
)
314323

315324

@@ -326,6 +335,7 @@ def test_get_failure(mock_sleep):
326335
method="GET",
327336
url=_metadata._METADATA_ROOT + PATH,
328337
headers=_metadata._METADATA_HEADERS,
338+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
329339
)
330340

331341

@@ -338,6 +348,7 @@ def test_get_return_none_for_not_found_error():
338348
method="GET",
339349
url=_metadata._METADATA_ROOT + PATH,
340350
headers=_metadata._METADATA_HEADERS,
351+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
341352
)
342353

343354

@@ -357,6 +368,7 @@ def test_get_failure_connection_failed(mock_sleep):
357368
method="GET",
358369
url=_metadata._METADATA_ROOT + PATH,
359370
headers=_metadata._METADATA_HEADERS,
371+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
360372
)
361373
assert request.call_count == 5
362374

@@ -375,6 +387,7 @@ def test_get_too_many_requests_retryable_error_failure():
375387
method="GET",
376388
url=_metadata._METADATA_ROOT + PATH,
377389
headers=_metadata._METADATA_HEADERS,
390+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
378391
)
379392
assert request.call_count == 5
380393

@@ -391,6 +404,7 @@ def test_get_failure_bad_json():
391404
method="GET",
392405
url=_metadata._METADATA_ROOT + PATH,
393406
headers=_metadata._METADATA_HEADERS,
407+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
394408
)
395409

396410

@@ -404,6 +418,7 @@ def test_get_project_id():
404418
method="GET",
405419
url=_metadata._METADATA_ROOT + "project/project-id",
406420
headers=_metadata._METADATA_HEADERS,
421+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
407422
)
408423
assert project_id == project
409424

@@ -419,6 +434,7 @@ def test_get_universe_domain_success():
419434
method="GET",
420435
url=_metadata._METADATA_ROOT + "universe/universe-domain",
421436
headers=_metadata._METADATA_HEADERS,
437+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
422438
)
423439
assert universe_domain == "fake_universe_domain"
424440

@@ -432,6 +448,7 @@ def test_get_universe_domain_success_empty_response():
432448
method="GET",
433449
url=_metadata._METADATA_ROOT + "universe/universe-domain",
434450
headers=_metadata._METADATA_HEADERS,
451+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
435452
)
436453
assert universe_domain == "googleapis.com"
437454

@@ -447,6 +464,7 @@ def test_get_universe_domain_not_found():
447464
method="GET",
448465
url=_metadata._METADATA_ROOT + "universe/universe-domain",
449466
headers=_metadata._METADATA_HEADERS,
467+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
450468
)
451469
assert universe_domain == "googleapis.com"
452470

@@ -467,6 +485,7 @@ def test_get_universe_domain_retryable_error_failure():
467485
method="GET",
468486
url=_metadata._METADATA_ROOT + "universe/universe-domain",
469487
headers=_metadata._METADATA_HEADERS,
488+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
470489
)
471490
assert request.call_count == 5
472491

@@ -509,11 +528,13 @@ def request(self, *args, **kwargs):
509528
method="GET",
510529
url=_metadata._METADATA_ROOT + "universe/universe-domain",
511530
headers=_metadata._METADATA_HEADERS,
531+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
512532
)
513533
request_ok.assert_called_once_with(
514534
method="GET",
515535
url=_metadata._METADATA_ROOT + "universe/universe-domain",
516536
headers=_metadata._METADATA_HEADERS,
537+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
517538
)
518539

519540
assert universe_domain == "fake_universe_domain"
@@ -533,6 +554,7 @@ def test_get_universe_domain_other_error():
533554
method="GET",
534555
url=_metadata._METADATA_ROOT + "universe/universe-domain",
535556
headers=_metadata._METADATA_HEADERS,
557+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
536558
)
537559

538560

@@ -557,6 +579,7 @@ def test_get_service_account_token(utcnow, mock_metrics_header_value):
557579
"metadata-flavor": "Google",
558580
"x-goog-api-client": ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE,
559581
},
582+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
560583
)
561584
assert token == "token"
562585
assert expiry == utcnow() + datetime.timedelta(seconds=ttl)
@@ -583,6 +606,7 @@ def test_get_service_account_token_with_scopes_list(utcnow, mock_metrics_header_
583606
"metadata-flavor": "Google",
584607
"x-goog-api-client": ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE,
585608
},
609+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
586610
)
587611
assert token == "token"
588612
assert expiry == utcnow() + datetime.timedelta(seconds=ttl)
@@ -611,6 +635,7 @@ def test_get_service_account_token_with_scopes_string(
611635
"metadata-flavor": "Google",
612636
"x-goog-api-client": ACCESS_TOKEN_REQUEST_METRICS_HEADER_VALUE,
613637
},
638+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
614639
)
615640
assert token == "token"
616641
assert expiry == utcnow() + datetime.timedelta(seconds=ttl)
@@ -628,6 +653,7 @@ def test_get_service_account_info():
628653
method="GET",
629654
url=_metadata._METADATA_ROOT + PATH + "/?recursive=true",
630655
headers=_metadata._METADATA_HEADERS,
656+
timeout=_metadata._METADATA_DEFAULT_TIMEOUT,
631657
)
632658

633659
assert info[key] == value

0 commit comments

Comments
 (0)