diff --git a/cinderclient/client.py b/cinderclient/client.py index 69d89d61a..ee429ffb6 100644 --- a/cinderclient/client.py +++ b/cinderclient/client.py @@ -11,10 +11,6 @@ import httplib2 import logging import os import urlparse -try: - from eventlet import sleep -except ImportError: - from time import sleep try: import json @@ -46,7 +42,7 @@ class HTTPClient(httplib2.Http): timeout=None, tenant_id=None, proxy_tenant_id=None, proxy_token=None, region_name=None, endpoint_type='publicURL', service_type=None, - service_name=None, volume_service_name=None, retries=0): + service_name=None, volume_service_name=None): super(HTTPClient, self).__init__(timeout=timeout) self.user = user self.password = password @@ -59,7 +55,6 @@ class HTTPClient(httplib2.Http): self.service_type = service_type self.service_name = service_name self.volume_service_name = volume_service_name - self.retries = retries self.management_url = None self.auth_token = None @@ -116,40 +111,28 @@ class HTTPClient(httplib2.Http): return resp, body def _cs_request(self, url, method, **kwargs): - attempts = 0 - backoff = 1 - while attempts <= self.retries: - attempts += 1 - if not self.management_url or not self.auth_token: - self.authenticate() + if not self.management_url: + self.authenticate() + + # Perform the request once. If we get a 401 back then it + # might be because the auth token expired, so try to + # re-authenticate and try again. If it still fails, bail. + try: kwargs.setdefault('headers', {})['X-Auth-Token'] = self.auth_token if self.projectid: kwargs['headers']['X-Auth-Project-Id'] = self.projectid + + resp, body = self.request(self.management_url + url, method, + **kwargs) + return resp, body + except exceptions.Unauthorized, ex: try: + self.authenticate() resp, body = self.request(self.management_url + url, method, **kwargs) return resp, body - except exceptions.BadRequest as e: - # Socket errors show up here (400) when - # force_exception_to_status_code = True - if e.message != 'n/a': - raise except exceptions.Unauthorized: - if attempts > 1: - raise - _logger.debug("Unauthorized, reauthenticating.") - self.management_url = self.auth_token = None - except exceptions.ClientException as e: - if 500 <= e.code <= 599: - pass - else: - raise - if attempts > self.retries: - raise - _logger.debug("Failed attempt(%s), retrying in %s seconds" % - (attempts, backoff)) - sleep(backoff) - backoff *= 2 + raise ex def get(self, url, **kwargs): return self._cs_request(url, 'GET', **kwargs) diff --git a/cinderclient/shell.py b/cinderclient/shell.py index d82d1024e..0dfec5bcf 100644 --- a/cinderclient/shell.py +++ b/cinderclient/shell.py @@ -169,11 +169,6 @@ class OpenStackCinderShell(object): action='store_true', help=argparse.SUPPRESS) - parser.add_argument('--retries', - metavar='', - default=0, - help='Number of retries.') - # FIXME(dtroyer): The args below are here for diablo compatibility, # remove them in folsum cycle @@ -413,8 +408,7 @@ class OpenStackCinderShell(object): extensions=self.extensions, service_type=service_type, service_name=service_name, - volume_service_name=volume_service_name, - retries=options.retries) + volume_service_name=volume_service_name) try: if not utils.isunauthenticated(args.func): diff --git a/cinderclient/v1/client.py b/cinderclient/v1/client.py index 7c81734f6..e8e1207c2 100644 --- a/cinderclient/v1/client.py +++ b/cinderclient/v1/client.py @@ -27,7 +27,7 @@ class Client(object): proxy_tenant_id=None, proxy_token=None, region_name=None, endpoint_type='publicURL', extensions=None, service_type='volume', service_name=None, - volume_service_name=None, retries=None): + volume_service_name=None): # FIXME(comstud): Rename the api_key argument above when we # know it's not being used as keyword argument password = api_key @@ -61,8 +61,7 @@ class Client(object): endpoint_type=endpoint_type, service_type=service_type, service_name=service_name, - volume_service_name=volume_service_name, - retries=retries) + volume_service_name=volume_service_name) def authenticate(self): """ diff --git a/tests/test_http.py b/tests/test_http.py index 8c31ca914..0b6ec6ff7 100644 --- a/tests/test_http.py +++ b/tests/test_http.py @@ -13,7 +13,7 @@ mock_request = mock.Mock(return_value=(fake_response, fake_body)) def get_client(): cl = client.HTTPClient("username", "password", - "project_id", "auth_test", retries=1) + "project_id", "auth_test") return cl @@ -44,66 +44,6 @@ class ClientTest(utils.TestCase): test_get_call() - def test_get_retry_500(self): - cl = get_authed_client() - - bad_response = httplib2.Response({"status": 500}) - bad_body = '{"error": {"message": "FAILED!", "details": "DETAILS!"}}' - bad_request = mock.Mock(return_value=(bad_response, bad_body)) - self.requests = [bad_request, mock_request] - - def request(*args, **kwargs): - next_request = self.requests.pop(0) - return next_request(*args, **kwargs) - - @mock.patch.object(httplib2.Http, "request", request) - @mock.patch('time.time', mock.Mock(return_value=1234)) - def test_get_call(): - resp, body = cl.get("/hi") - - test_get_call() - self.assertEqual(self.requests, []) - - def test_get_no_retry_400(self): - cl = get_authed_client() - - bad_response = httplib2.Response({"status": 400}) - bad_body = '{"error": {"message": "Bad!", "details": "Terrible!"}}' - bad_request = mock.Mock(return_value=(bad_response, bad_body)) - self.requests = [bad_request, mock_request] - - def request(*args, **kwargs): - next_request = self.requests.pop(0) - return next_request(*args, **kwargs) - - @mock.patch.object(httplib2.Http, "request", request) - @mock.patch('time.time', mock.Mock(return_value=1234)) - def test_get_call(): - resp, body = cl.get("/hi") - - self.assertRaises(exceptions.BadRequest, test_get_call) - self.assertEqual(self.requests, [mock_request]) - - def test_get_retry_400_socket(self): - cl = get_authed_client() - - bad_response = httplib2.Response({"status": 400}) - bad_body = '{"error": {"message": "n/a", "details": "n/a"}}' - bad_request = mock.Mock(return_value=(bad_response, bad_body)) - self.requests = [bad_request, mock_request] - - def request(*args, **kwargs): - next_request = self.requests.pop(0) - return next_request(*args, **kwargs) - - @mock.patch.object(httplib2.Http, "request", request) - @mock.patch('time.time', mock.Mock(return_value=1234)) - def test_get_call(): - resp, body = cl.get("/hi") - - test_get_call() - self.assertEqual(self.requests, []) - def test_post(self): cl = get_authed_client()