diff --git a/novaclient/client.py b/novaclient/client.py index ba90e0fc4..36baffa58 100644 --- a/novaclient/client.py +++ b/novaclient/client.py @@ -30,6 +30,7 @@ import os import re import time +from keystoneclient import adapter import requests from requests import adapters @@ -133,65 +134,22 @@ class CompletionCache(object): self._write_attribute(resource, attribute, value) -class SessionClient(object): - - def __init__(self, session, auth, interface, service_type, region_name): - self.session = session - self.auth = auth - - self.interface = interface - self.service_type = service_type - self.region_name = region_name +class SessionClient(adapter.LegacyJsonAdapter): def request(self, url, method, **kwargs): - kwargs.setdefault('user_agent', 'python-novaclient') - kwargs.setdefault('auth', self.auth) - kwargs.setdefault('authenticated', False) + # NOTE(jamielennox): The standard call raises errors from + # keystoneclient, where we need to raise the novaclient errors. + raise_exc = kwargs.pop('raise_exc', True) + resp, body = super(SessionClient, self).request(url, + method, + raise_exc=False, + **kwargs) - try: - kwargs['json'] = kwargs.pop('body') - except KeyError: - pass - - headers = kwargs.setdefault('headers', {}) - headers.setdefault('Accept', 'application/json') - - endpoint_filter = kwargs.setdefault('endpoint_filter', {}) - endpoint_filter.setdefault('interface', self.interface) - endpoint_filter.setdefault('service_type', self.service_type) - endpoint_filter.setdefault('region_name', self.region_name) - - resp = self.session.request(url, method, raise_exc=False, **kwargs) - - body = None - if resp.text: - try: - body = resp.json() - except ValueError: - pass - - if resp.status_code >= 400: + if raise_exc and resp.status_code >= 400: raise exceptions.from_response(resp, body, url, method) return resp, body - def _cs_request(self, url, method, **kwargs): - # this function is mostly redundant but makes compatibility easier - kwargs.setdefault('authenticated', True) - return self.request(url, method, **kwargs) - - def get(self, url, **kwargs): - return self._cs_request(url, 'GET', **kwargs) - - def post(self, url, **kwargs): - return self._cs_request(url, 'POST', **kwargs) - - def put(self, url, **kwargs): - return self._cs_request(url, 'PUT', **kwargs) - - def delete(self, url, **kwargs): - return self._cs_request(url, 'DELETE', **kwargs) - def _original_only(f): """Indicates and enforces that this function can only be used if we are @@ -745,13 +703,17 @@ def _construct_http_client(username=None, password=None, project_id=None, auth_system='keystone', auth_plugin=None, auth_token=None, cacert=None, tenant_id=None, user_id=None, connection_pool=False, session=None, - auth=None): + auth=None, user_agent='python-novaclient', + **kwargs): if session: return SessionClient(session=session, auth=auth, interface=endpoint_type, service_type=service_type, - region_name=region_name) + region_name=region_name, + service_name=service_name, + user_agent=user_agent, + **kwargs) else: # FIXME(jamielennox): username and password are now optional. Need # to test that they were provided in this mode.