Skip to content

Commit

Permalink
Rearranged exception handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Zidaan Dutta authored and nateprewitt committed Nov 16, 2020
1 parent ccdc98a commit 60d2bf7
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 6 deletions.
8 changes: 4 additions & 4 deletions botocore/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -374,15 +374,15 @@ def _fetch_metadata_token(self):
raise BadIMDSRequestError(request)
except ReadTimeoutError:
return None
except RETRYABLE_HTTP_ERRORS as e:
logger.debug(
"Caught retryable HTTP exception while making metadata "
"service request to %s: %s", url, e, exc_info=True)
except HTTPClientError as e:
if isinstance(e.kwargs.get('error'), LocationParseError):
raise InvalidIMDSEndpointError(endpoint=url, error=e)
else:
raise
except RETRYABLE_HTTP_ERRORS as e:
logger.debug(
"Caught retryable HTTP exception while making metadata "
"service request to %s: %s", url, e, exc_info=True)
return None

def _get_request(self, url_path, retry_func, token=None):
Expand Down
27 changes: 25 additions & 2 deletions tests/functional/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@
import os
import tempfile
import shutil
from tests import unittest
from tests import unittest, mock

from botocore.utils import FileWebIdentityTokenLoader
from botocore.exceptions import (ConnectionClosedError, HTTPClientError,
InvalidIMDSEndpointError)
from botocore.utils import FileWebIdentityTokenLoader, InstanceMetadataFetcher
from urllib3.exceptions import LocationParseError


class TestFileWebIdentityTokenLoader(unittest.TestCase):
Expand All @@ -40,3 +43,23 @@ def test_can_load_token(self):
loader = FileWebIdentityTokenLoader(self.token_file)
token = loader()
self.assertEqual(self.token, token)


class TestInstanceMetadataFetcher(unittest.TestCase):
def test_catch_retryable_http_errors(self):
with mock.patch('botocore.httpsession.URLLib3Session.send') as send_mock:
fetcher = InstanceMetadataFetcher()
send_mock.side_effect = ConnectionClosedError(endpoint_url="foo")
creds = fetcher.retrieve_iam_role_credentials()
self.assertEquals(send_mock.call_count, 2)
for call_instance in send_mock.call_args_list:
self.assertTrue(call_instance[0][0].url.startswith(fetcher.get_base_url()))
self.assertEquals(creds, {})

def test_catch_invalid_imds_error(self):
with mock.patch('botocore.httpsession.URLLib3Session.send') as send_mock:
fetcher = InstanceMetadataFetcher()
e = LocationParseError(location="foo")
send_mock.side_effect = HTTPClientError(error=e)
with self.assertRaises(InvalidIMDSEndpointError):
fetcher.retrieve_iam_role_credentials()

0 comments on commit 60d2bf7

Please sign in to comment.