Merge "Allow providing an endpoint_override to requests"

This commit is contained in:
Jenkins
2014-09-09 13:08:56 +00:00
committed by Gerrit Code Review
3 changed files with 80 additions and 7 deletions

View File

@@ -26,8 +26,8 @@ class Adapter(object):
@utils.positional() @utils.positional()
def __init__(self, session, service_type=None, service_name=None, def __init__(self, session, service_type=None, service_name=None,
interface=None, region_name=None, auth=None, interface=None, region_name=None, endpoint_override=None,
user_agent=None): auth=None, user_agent=None):
"""Create a new adapter. """Create a new adapter.
:param Session session: The session object to wrap. :param Session session: The session object to wrap.
@@ -35,16 +35,18 @@ class Adapter(object):
:param str service_name: The default service_name for URL discovery. :param str service_name: The default service_name for URL discovery.
:param str interface: The default interface for URL discovery. :param str interface: The default interface for URL discovery.
:param str region_name: The default region_name for URL discovery. :param str region_name: The default region_name for URL discovery.
:param str endpoint_override: Always use this endpoint URL for requests
for this client.
:param auth.BaseAuthPlugin auth: An auth plugin to use instead of the :param auth.BaseAuthPlugin auth: An auth plugin to use instead of the
session one. session one.
:param str user_agent: The User-Agent string to set. :param str user_agent: The User-Agent string to set.
""" """
self.session = session self.session = session
self.service_type = service_type self.service_type = service_type
self.service_name = service_name self.service_name = service_name
self.interface = interface self.interface = interface
self.region_name = region_name self.region_name = region_name
self.endpoint_override = endpoint_override
self.user_agent = user_agent self.user_agent = user_agent
self.auth = auth self.auth = auth
@@ -60,6 +62,9 @@ class Adapter(object):
if self.region_name: if self.region_name:
endpoint_filter.setdefault('region_name', self.region_name) endpoint_filter.setdefault('region_name', self.region_name)
if self.endpoint_override:
kwargs.setdefault('endpoint_override', self.endpoint_override)
if self.auth: if self.auth:
kwargs.setdefault('auth', self.auth) kwargs.setdefault('auth', self.auth)
if self.user_agent: if self.user_agent:

View File

@@ -183,7 +183,8 @@ class Session(object):
def request(self, url, method, json=None, original_ip=None, def request(self, url, method, json=None, original_ip=None,
user_agent=None, redirect=None, authenticated=None, user_agent=None, redirect=None, authenticated=None,
endpoint_filter=None, auth=None, requests_auth=None, endpoint_filter=None, auth=None, requests_auth=None,
raise_exc=True, allow_reauth=True, log=True, **kwargs): raise_exc=True, allow_reauth=True, log=True,
endpoint_override=None, **kwargs):
"""Send an HTTP request with the specified characteristics. """Send an HTTP request with the specified characteristics.
Wrapper around `requests.Session.request` to handle tasks such as Wrapper around `requests.Session.request` to handle tasks such as
@@ -218,6 +219,11 @@ class Session(object):
endpoint to use for this request. If not endpoint to use for this request. If not
provided then URL is expected to be a provided then URL is expected to be a
fully qualified URL. (optional) fully qualified URL. (optional)
:param str endpoint_override: The URL to use instead of looking up the
endpoint in the auth plugin. This will be
ignored if a fully qualified URL is
provided but take priority over an
endpoint_filter. (optional)
:param auth: The auth plugin to use when authenticating this request. :param auth: The auth plugin to use when authenticating this request.
This will override the plugin that is attached to the This will override the plugin that is attached to the
session (if any). (optional) session (if any). (optional)
@@ -266,9 +272,13 @@ class Session(object):
# should ignore the filter. This will make it easier for clients who # should ignore the filter. This will make it easier for clients who
# want to overrule the default endpoint_filter data added to all client # want to overrule the default endpoint_filter data added to all client
# requests. We check fully qualified here by the presence of a host. # requests. We check fully qualified here by the presence of a host.
url_data = urllib.parse.urlparse(url) if not urllib.parse.urlparse(url).netloc:
if endpoint_filter and not url_data.netloc: base_url = None
base_url = self.get_endpoint(auth, **endpoint_filter)
if endpoint_override:
base_url = endpoint_override
elif endpoint_filter:
base_url = self.get_endpoint(auth, **endpoint_filter)
if not base_url: if not base_url:
raise exceptions.EndpointNotFound() raise exceptions.EndpointNotFound()

View File

@@ -499,6 +499,47 @@ class SessionAuthTests(utils.TestCase):
authenticated=True, allow_reauth=False) authenticated=True, allow_reauth=False)
self.assertFalse(auth.invalidate_called) self.assertFalse(auth.invalidate_called)
def test_endpoint_override_overrides_filter(self):
auth = CalledAuthPlugin()
sess = client_session.Session(auth=auth)
override_base = 'http://mytest/'
path = 'path'
override_url = override_base + path
resp_text = uuid.uuid4().hex
self.requests.register_uri('GET', override_url, text=resp_text)
resp = sess.get(path,
endpoint_override=override_base,
endpoint_filter={'service_type': 'identity'})
self.assertEqual(resp_text, resp.text)
self.assertEqual(override_url, self.requests.last_request.url)
self.assertTrue(auth.get_token_called)
self.assertFalse(auth.get_endpoint_called)
def test_endpoint_override_ignore_full_url(self):
auth = CalledAuthPlugin()
sess = client_session.Session(auth=auth)
path = 'path'
url = self.TEST_URL + path
resp_text = uuid.uuid4().hex
self.requests.register_uri('GET', url, text=resp_text)
resp = sess.get(url,
endpoint_override='http://someother.url',
endpoint_filter={'service_type': 'identity'})
self.assertEqual(resp_text, resp.text)
self.assertEqual(url, self.requests.last_request.url)
self.assertTrue(auth.get_token_called)
self.assertFalse(auth.get_endpoint_called)
class AdapterTest(utils.TestCase): class AdapterTest(utils.TestCase):
@@ -585,6 +626,23 @@ class AdapterTest(utils.TestCase):
getattr(adpt, method)(url) getattr(adpt, method)(url)
m.assert_called_once_with(url, method.upper()) m.assert_called_once_with(url, method.upper())
def test_setting_endpoint_override(self):
endpoint_override = 'http://overrideurl'
path = '/path'
endpoint_url = endpoint_override + path
auth = CalledAuthPlugin()
sess = client_session.Session(auth=auth)
adpt = adapter.Adapter(sess, endpoint_override=endpoint_override)
response = uuid.uuid4().hex
self.requests.register_uri('GET', endpoint_url, text=response)
resp = adpt.get(path)
self.assertEqual(response, resp.text)
self.assertEqual(endpoint_url, self.requests.last_request.url)
class ConfLoadingTests(utils.TestCase): class ConfLoadingTests(utils.TestCase):