Cleanup session creation
When using the session object we want to pass through unknown kwargs to the adapter so that keystoneclient can add new parameters as required. This requires fixing the old options so that we can restrict what is passed and showing a warning when there are values that are being ignored. Change-Id: Ia795dfc8e16c60a08df1636816daefe2ebbd0b03
This commit is contained in:
		@@ -439,8 +439,18 @@ class VerifiedHTTPSConnection(six.moves.http_client.HTTPSConnection):
 | 
			
		||||
class SessionClient(VersionNegotiationMixin, adapter.LegacyJsonAdapter):
 | 
			
		||||
    """HTTP client based on Keystone client session."""
 | 
			
		||||
 | 
			
		||||
    conflict_max_retries = DEFAULT_MAX_RETRIES
 | 
			
		||||
    conflict_retry_interval = DEFAULT_RETRY_INTERVAL
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
                 os_ironic_api_version,
 | 
			
		||||
                 api_version_select_state,
 | 
			
		||||
                 max_retries,
 | 
			
		||||
                 retry_interval,
 | 
			
		||||
                 **kwargs):
 | 
			
		||||
        self.os_ironic_api_version = os_ironic_api_version
 | 
			
		||||
        self.api_version_select_state = api_version_select_state
 | 
			
		||||
        self.conflict_max_retries = max_retries
 | 
			
		||||
        self.conflict_retry_interval = retry_interval
 | 
			
		||||
 | 
			
		||||
        super(SessionClient, self).__init__(**kwargs)
 | 
			
		||||
 | 
			
		||||
    def _parse_version_headers(self, resp):
 | 
			
		||||
        return self._generic_parse_version_headers(resp.headers.get)
 | 
			
		||||
@@ -530,29 +540,61 @@ class ResponseBodyIterator(object):
 | 
			
		||||
            raise StopIteration()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _construct_http_client(*args, **kwargs):
 | 
			
		||||
    session = kwargs.pop('session', None)
 | 
			
		||||
    auth = kwargs.pop('auth', None)
 | 
			
		||||
 | 
			
		||||
def _construct_http_client(endpoint,
 | 
			
		||||
                           session=None,
 | 
			
		||||
                           token=None,
 | 
			
		||||
                           auth_ref=None,
 | 
			
		||||
                           os_ironic_api_version=DEFAULT_VER,
 | 
			
		||||
                           api_version_select_state='default',
 | 
			
		||||
                           max_retries=DEFAULT_MAX_RETRIES,
 | 
			
		||||
                           retry_interval=DEFAULT_RETRY_INTERVAL,
 | 
			
		||||
                           timeout=600,
 | 
			
		||||
                           ca_file=None,
 | 
			
		||||
                           cert_file=None,
 | 
			
		||||
                           key_file=None,
 | 
			
		||||
                           insecure=None,
 | 
			
		||||
                           **kwargs):
 | 
			
		||||
    if session:
 | 
			
		||||
        service_type = kwargs.pop('service_type', 'baremetal')
 | 
			
		||||
        interface = kwargs.pop('endpoint_type', None)
 | 
			
		||||
        region_name = kwargs.pop('region_name', None)
 | 
			
		||||
        os_ironic_api_version = kwargs.pop('os_ironic_api_version',
 | 
			
		||||
                                           DEFAULT_VER)
 | 
			
		||||
        session_client = SessionClient(session=session,
 | 
			
		||||
                                       auth=auth,
 | 
			
		||||
                                       interface=interface,
 | 
			
		||||
                                       service_type=service_type,
 | 
			
		||||
                                       region_name=region_name,
 | 
			
		||||
                                       service_name=None,
 | 
			
		||||
                                       user_agent='python-ironicclient')
 | 
			
		||||
        # Append an ironic specific variable to session
 | 
			
		||||
        session_client.os_ironic_api_version = os_ironic_api_version
 | 
			
		||||
        session_client.api_version_select_state = (
 | 
			
		||||
            kwargs.pop('api_version_select_state', 'default'))
 | 
			
		||||
        session_client.conflict_max_retries = kwargs.get('max_retries')
 | 
			
		||||
        session_client.conflict_retry_interval = kwargs.get('retry_interval')
 | 
			
		||||
        return session_client
 | 
			
		||||
        kwargs.setdefault('service_type', 'baremetal')
 | 
			
		||||
        kwargs.setdefault('user_agent', 'python-ironicclient')
 | 
			
		||||
        kwargs.setdefault('interface', kwargs.pop('endpoint_type', None))
 | 
			
		||||
        kwargs.setdefault('endpoint_override', endpoint)
 | 
			
		||||
 | 
			
		||||
        ignored = {'token': token,
 | 
			
		||||
                   'auth_ref': auth_ref,
 | 
			
		||||
                   'timeout': timeout != 600,
 | 
			
		||||
                   'ca_file': ca_file,
 | 
			
		||||
                   'cert_file': cert_file,
 | 
			
		||||
                   'key_file': key_file,
 | 
			
		||||
                   'insecure': insecure}
 | 
			
		||||
 | 
			
		||||
        dvars = [k for k, v in six.iteritems(ignored) if v]
 | 
			
		||||
 | 
			
		||||
        if dvars:
 | 
			
		||||
            LOG.warn('The following arguments are ignored when using the '
 | 
			
		||||
                     'session to construct a client: %s', ', '.join(dvars))
 | 
			
		||||
 | 
			
		||||
        return SessionClient(session=session,
 | 
			
		||||
                             os_ironic_api_version=os_ironic_api_version,
 | 
			
		||||
                             api_version_select_state=api_version_select_state,
 | 
			
		||||
                             max_retries=max_retries,
 | 
			
		||||
                             retry_interval=retry_interval,
 | 
			
		||||
                             **kwargs)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        return HTTPClient(*args, **kwargs)
 | 
			
		||||
        if kwargs:
 | 
			
		||||
            LOG.warn('The following arguments are being ignored when '
 | 
			
		||||
                     'constructing the client: %s', ', '.join(kwargs))
 | 
			
		||||
 | 
			
		||||
        return HTTPClient(endpoint=endpoint,
 | 
			
		||||
                          token=token,
 | 
			
		||||
                          auth_ref=auth_ref,
 | 
			
		||||
                          os_ironic_api_version=os_ironic_api_version,
 | 
			
		||||
                          api_version_select_state=api_version_select_state,
 | 
			
		||||
                          max_retries=max_retries,
 | 
			
		||||
                          retry_interval=retry_interval,
 | 
			
		||||
                          timeout=timeout,
 | 
			
		||||
                          ca_file=ca_file,
 | 
			
		||||
                          cert_file=cert_file,
 | 
			
		||||
                          key_file=key_file,
 | 
			
		||||
                          insecure=insecure)
 | 
			
		||||
 
 | 
			
		||||
@@ -515,14 +515,11 @@ class IronicShell(object):
 | 
			
		||||
 | 
			
		||||
            endpoint_type = args.os_endpoint_type or 'publicURL'
 | 
			
		||||
            kwargs = {
 | 
			
		||||
                'auth_url': args.os_auth_url,
 | 
			
		||||
                'session': keystone_session,
 | 
			
		||||
                'auth': keystone_auth,
 | 
			
		||||
                'service_type': service_type,
 | 
			
		||||
                'endpoint_type': endpoint_type,
 | 
			
		||||
                'region_name': args.os_region_name,
 | 
			
		||||
                'username': args.os_username,
 | 
			
		||||
                'password': args.os_password,
 | 
			
		||||
            }
 | 
			
		||||
        kwargs['os_ironic_api_version'] = os_ironic_api_version
 | 
			
		||||
        if args.max_retries < 0:
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,18 @@ def _get_error_body(faultstring=None, debuginfo=None):
 | 
			
		||||
    return raw_body
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def _session_client(**kwargs):
 | 
			
		||||
    return http.SessionClient(os_ironic_api_version='1.6',
 | 
			
		||||
                              api_version_select_state='default',
 | 
			
		||||
                              max_retries=5,
 | 
			
		||||
                              retry_interval=2,
 | 
			
		||||
                              auth=None,
 | 
			
		||||
                              interface=None,
 | 
			
		||||
                              service_type='publicURL',
 | 
			
		||||
                              region_name='',
 | 
			
		||||
                              **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class VersionNegotiationMixinTest(utils.BaseTestCase):
 | 
			
		||||
 | 
			
		||||
    def setUp(self):
 | 
			
		||||
@@ -410,12 +422,7 @@ class SessionClientTest(utils.BaseTestCase):
 | 
			
		||||
                                         error_body,
 | 
			
		||||
                                         500)
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
 | 
			
		||||
        error = self.assertRaises(exc.InternalServerError,
 | 
			
		||||
                                  client.json_request,
 | 
			
		||||
@@ -434,12 +441,7 @@ class SessionClientTest(utils.BaseTestCase):
 | 
			
		||||
                                         error_body,
 | 
			
		||||
                                         500)
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
 | 
			
		||||
        error = self.assertRaises(exc.InternalServerError,
 | 
			
		||||
                                  client.json_request,
 | 
			
		||||
@@ -457,12 +459,7 @@ class SessionClientTest(utils.BaseTestCase):
 | 
			
		||||
            None,
 | 
			
		||||
            506)
 | 
			
		||||
        expected_result = ('1.1', '1.6')
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
        result = client._parse_version_headers(fake_session)
 | 
			
		||||
        self.assertEqual(expected_result, result)
 | 
			
		||||
 | 
			
		||||
@@ -569,13 +566,7 @@ class RetriesTestCase(utils.BaseTestCase):
 | 
			
		||||
        fake_session = mock.Mock(spec=utils.FakeSession)
 | 
			
		||||
        fake_session.request.side_effect = iter((fake_resp, ok_resp))
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
        client.json_request('GET', '/v1/resources')
 | 
			
		||||
        self.assertEqual(2, fake_session.request.call_count)
 | 
			
		||||
 | 
			
		||||
@@ -589,12 +580,7 @@ class RetriesTestCase(utils.BaseTestCase):
 | 
			
		||||
        fake_session = mock.Mock(spec=utils.FakeSession)
 | 
			
		||||
        fake_session.request.return_value = fake_resp
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
 | 
			
		||||
        self.assertRaises(exc.Conflict, client.json_request,
 | 
			
		||||
                          'GET', '/v1/resources')
 | 
			
		||||
@@ -611,12 +597,7 @@ class RetriesTestCase(utils.BaseTestCase):
 | 
			
		||||
        fake_session = mock.Mock(spec=utils.FakeSession)
 | 
			
		||||
        fake_session.request.return_value = fake_resp
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
        client.conflict_max_retries = None
 | 
			
		||||
 | 
			
		||||
        self.assertRaises(exc.Conflict, client.json_request,
 | 
			
		||||
@@ -634,12 +615,7 @@ class RetriesTestCase(utils.BaseTestCase):
 | 
			
		||||
        fake_session = mock.Mock(spec=utils.FakeSession)
 | 
			
		||||
        fake_session.request.return_value = fake_resp
 | 
			
		||||
 | 
			
		||||
        client = http.SessionClient(session=fake_session,
 | 
			
		||||
                                    auth=None,
 | 
			
		||||
                                    interface=None,
 | 
			
		||||
                                    service_type='publicURL',
 | 
			
		||||
                                    region_name='',
 | 
			
		||||
                                    service_name=None)
 | 
			
		||||
        client = _session_client(session=fake_session)
 | 
			
		||||
        client.conflict_max_retries = http.DEFAULT_MAX_RETRIES + 1
 | 
			
		||||
 | 
			
		||||
        self.assertRaises(exc.Conflict, client.json_request,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user