Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTORS
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,4 @@ Swapnil Khanapurkar <swapnil_khanapurkar@persistent.co.in>
The SoftLayer Developer Network <sldn@softlayer.com>
Tim Ariyeh <tim.ariyeh@gmail.com>
Wissam Elriachy <wissam.elriachy@gmail.com>
Anthony Monthe (ZuluPro) <anthony.monthe@gmail.com>
3 changes: 2 additions & 1 deletion SoftLayer/fixtures/SoftLayer_Account.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,8 @@
"statusId": 4,
"accountId": 1234
}
]
],
'accountId': 1234
}

getRwhoisData = {
Expand Down
75 changes: 52 additions & 23 deletions SoftLayer/transports.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import time

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

from SoftLayer import consts
from SoftLayer import exceptions
Expand Down Expand Up @@ -38,6 +40,20 @@
}


def get_session(user_agent):
"""Sets up urllib sessions"""

client = requests.Session()
client.headers.update({
'Content-Type': 'application/json',
'User-Agent': user_agent,
})
retry = Retry(connect=3, backoff_factor=3)
adapter = HTTPAdapter(max_retries=retry)
client.mount('https://', adapter)
return client


class Request(object):
"""Transport request object."""

Expand Down Expand Up @@ -107,6 +123,15 @@ def __init__(self, endpoint_url=None, timeout=None, proxy=None, user_agent=None,
self.proxy = proxy
self.user_agent = user_agent or consts.USER_AGENT
self.verify = verify
self._client = None

@property
def client(self):
"""Returns client session object"""

if self._client is None:
self._client = get_session(self.user_agent)
return self._client

def __call__(self, request):
"""Makes a SoftLayer API call against the XML-RPC endpoint.
Expand Down Expand Up @@ -154,13 +179,13 @@ def __call__(self, request):
LOGGER.debug(payload)

try:
resp = requests.request('POST', url,
data=payload,
headers=request.transport_headers,
timeout=self.timeout,
verify=verify,
cert=request.cert,
proxies=_proxies_dict(self.proxy))
resp = self.client.request('POST', url,
data=payload,
headers=request.transport_headers,
timeout=self.timeout,
verify=verify,
cert=request.cert,
proxies=_proxies_dict(self.proxy))
LOGGER.debug("=== RESPONSE ===")
LOGGER.debug(resp.headers)
LOGGER.debug(resp.content)
Expand Down Expand Up @@ -208,6 +233,15 @@ def __init__(self, endpoint_url=None, timeout=None, proxy=None, user_agent=None,
self.proxy = proxy
self.user_agent = user_agent or consts.USER_AGENT
self.verify = verify
self._client = None

@property
def client(self):
"""Returns client session object"""

if self._client is None:
self._client = get_session(self.user_agent)
return self._client

def __call__(self, request):
"""Makes a SoftLayer API call against the REST endpoint.
Expand All @@ -217,9 +251,6 @@ def __call__(self, request):

:param request request: Request object
"""
request.transport_headers.setdefault('Content-Type', 'application/json')
request.transport_headers.setdefault('User-Agent', self.user_agent)

params = request.headers.copy()
if request.mask:
params['objectMask'] = _format_object_mask(request.mask)
Expand Down Expand Up @@ -275,15 +306,15 @@ def __call__(self, request):
LOGGER.debug(request.transport_headers)
LOGGER.debug(raw_body)
try:
resp = requests.request(method, url,
auth=auth,
headers=request.transport_headers,
params=params,
data=raw_body,
timeout=self.timeout,
verify=verify,
cert=request.cert,
proxies=_proxies_dict(self.proxy))
resp = self.client.request(method, url,
auth=auth,
headers=request.transport_headers,
params=params,
data=raw_body,
timeout=self.timeout,
verify=verify,
cert=request.cert,
proxies=_proxies_dict(self.proxy))
LOGGER.debug("=== RESPONSE ===")
LOGGER.debug(resp.headers)
LOGGER.debug(resp.text)
Expand Down Expand Up @@ -339,13 +370,11 @@ def __call__(self, call):
module_path = 'SoftLayer.fixtures.%s' % call.service
module = importlib.import_module(module_path)
except ImportError:
raise NotImplementedError('%s fixture is not implemented'
% call.service)
raise NotImplementedError('%s fixture is not implemented' % call.service)
try:
return getattr(module, call.method)
except AttributeError:
raise NotImplementedError('%s::%s fixture is not implemented'
% (call.service, call.method))
raise NotImplementedError('%s::%s fixture is not implemented' % (call.service, call.method))


def _proxies_dict(proxy):
Expand Down
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,10 @@
'six >= 1.7.0',
'prettytable >= 0.7.0',
'click >= 5',
'requests >= 2.7.0',
'requests >= 2.18.4',
'prompt_toolkit >= 0.53',
'pygments >= 2.0.0',
'urllib3 >= 1.22'
],
keywords=['softlayer', 'cloud'],
classifiers=[
Expand Down
5 changes: 0 additions & 5 deletions tests/decoration_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import logging
import mock
import unittest

from SoftLayer.decoration import retry
from SoftLayer import exceptions
Expand Down Expand Up @@ -89,7 +88,3 @@ def raise_unexpected_error():
raise TypeError('unexpected error')

self.assertRaises(TypeError, raise_unexpected_error)

if __name__ == '__main__':

unittest.main()
Loading