From 0fce5e31dfba299018e5efd0ec7e263ef48bf271 Mon Sep 17 00:00:00 2001
From: Stanislaw Pitucha <stanislaw.pitucha@hp.com>
Date: Tue, 19 Feb 2013 15:40:16 +0000
Subject: [PATCH] Report name resolution errors properly
Errors in name resolution have been logged previously with the url path
rather than the hostname. That resulted in incorrect errors like:
InvalidEndpoint: Error finding address for
/v1/images/detail?is_public=none&limit=20: [Errno -2]
Name or service not known
rather than one mentioning hostname itself. This patch changes the log
message to fit the situation.
Change-Id: I1eecbcb22d41b1341c214937b9cbfd046fd301a0
---
glanceclient/common/http.py | 3 ++-
tests/test_http.py | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/glanceclient/common/http.py b/glanceclient/common/http.py
index 115204f..7146ace 100644
--- a/glanceclient/common/http.py
+++ b/glanceclient/common/http.py
@@ -183,7 +183,8 @@ class HTTPClient(object):
conn.request(method, conn_url, **kwargs)
resp = conn.getresponse()
except socket.gaierror as e:
- message = "Error finding address for %(url)s: %(e)s" % locals()
+ message = "Error finding address for %s: %s" % (
+ self.endpoint_hostname, e)
raise exc.InvalidEndpoint(message=message)
except (socket.error, socket.timeout) as e:
endpoint = self.endpoint
diff --git a/tests/test_http.py b/tests/test_http.py
index cabcf8d..3d87444 100644
--- a/tests/test_http.py
+++ b/tests/test_http.py
@@ -83,6 +83,48 @@ class TestClient(testtools.TestCase):
self.assertEqual(resp, fake)
+class TestHostResolutionError(testtools.TestCase):
+
+ def setUp(self):
+ super(TestHostResolutionError, self).setUp()
+ self.mock = mox.Mox()
+ self.invalid_host = "example.com.incorrect_top_level_domain"
+
+ def test_incorrect_domain_error(self):
+ """
+ Make sure that using a domain which does not resolve causes an
+ exception which mentions that specific hostname as a reason for
+ failure.
+ """
+ class FailingConnectionClass(object):
+ def __init__(self, *args, **kwargs):
+ pass
+
+ def putrequest(self, *args, **kwargs):
+ raise socket.gaierror(-2, "Name or service not known")
+
+ def request(self, *args, **kwargs):
+ raise socket.gaierror(-2, "Name or service not known")
+
+ self.endpoint = 'http://%s:9292' % (self.invalid_host,)
+ self.client = http.HTTPClient(self.endpoint, token=u'abc123')
+
+ self.mock.StubOutWithMock(self.client, 'get_connection')
+ self.client.get_connection().AndReturn(FailingConnectionClass())
+ self.mock.ReplayAll()
+
+ try:
+ self.client.raw_request('GET', '/example/path')
+ self.fail("gaierror should be raised")
+ except exc.InvalidEndpoint as e:
+ self.assertTrue(self.invalid_host in str(e),
+ "exception should contain the hostname")
+
+ def tearDown(self):
+ super(TestHostResolutionError, self).tearDown()
+ self.mock.UnsetStubs()
+
+
class TestResponseBodyIterator(testtools.TestCase):
def test_iter_default_chunk_size_64k(self):
resp = utils.FakeResponse({}, StringIO.StringIO('X' * 98304))