diff --git a/boto3/s3/inject.py b/boto3/s3/inject.py index 45880b9c0c..9d691893ca 100644 --- a/boto3/s3/inject.py +++ b/boto3/s3/inject.py @@ -64,15 +64,19 @@ def bucket_load(self, *args, **kwargs): # We can't actually get the bucket's attributes from a HeadBucket, # so we need to use a ListBuckets and search for our bucket. - response = self.meta.client.list_buckets() - for bucket_data in response['Buckets']: - if bucket_data['Name'] == self.name: - self.meta.data = bucket_data - break - else: - raise ClientError({'Error': {'Code': '404', 'Message': 'NotFound'}}, - 'ListBuckets') - + # However, we may fail if we lack permissions to ListBuckets + # or the bucket is in another account. In which case, creation_date + # will be None. + self.meta.data = {} + try: + response = self.meta.client.list_buckets() + for bucket_data in response['Buckets']: + if bucket_data['Name'] == self.name: + self.meta.data = bucket_data + break + except ClientError as e: + if not e.response.get('Error', {}).get('Code') == 'AccessDenied': + raise def object_summary_load(self, *args, **kwargs): """ diff --git a/tests/unit/s3/test_inject.py b/tests/unit/s3/test_inject.py index dd2b85d2f2..8677a1964f 100644 --- a/tests/unit/s3/test_inject.py +++ b/tests/unit/s3/test_inject.py @@ -70,7 +70,7 @@ def test_bucket_load_finds_bucket(self): self.resource.meta.data, {'Name': self.resource.name, 'CreationDate': 2}) - def test_bucket_load_raise_error(self): + def test_bucket_load_doesnt_find_bucket(self): self.resource.name = 'MyBucket' self.client.list_buckets.return_value = { 'Buckets': [ @@ -78,10 +78,27 @@ def test_bucket_load_raise_error(self): {'Name': 'NotMine2', 'CreationDate': 2}, ], } + inject.bucket_load(self.resource) + self.assertEqual(self.resource.meta.data, {}) + + def test_bucket_load_encounters_access_exception(self): + self.client.list_buckets.side_effect = ClientError( + {'Error': + {'Code': 'AccessDenied', + 'Message': 'Access Denied'}}, + 'ListBuckets') + inject.bucket_load(self.resource) + self.assertEqual(self.resource.meta.data, {}) + + def test_bucket_load_encounters_other_exception(self): + self.client.list_buckets.side_effect = ClientError( + {'Error': + {'Code': 'ExpiredToken', + 'Message': 'The provided token has expired.'}}, + 'ListBuckets') with self.assertRaises(ClientError): inject.bucket_load(self.resource) - class TestBucketTransferMethods(unittest.TestCase): def setUp(self):