Merge "Allow providing an endpoint_override to requests"
This commit is contained in:
@@ -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:
|
||||||
|
@@ -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()
|
||||||
|
@@ -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):
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user