Source code for ahoyhoy.client.builder
import abc
import logging
from six import add_metaclass
from . import Client, SimpleClient
from ..retries import Retry
logger = logging.getLogger(__name__)
@add_metaclass(abc.ABCMeta)
[docs]class IClientBuilder(object):
"""
Abstract Builder class. Contains required methods
for all other client builders.
"""
def __init__(self):
self._session = None
self._headers = {}
self._retries = None
[docs] def add_session(self, session):
"""
Add your custom session here.
"""
self._session = session
return self
[docs] def add_retries(self, retries):
"""
Custom retries function. It has to accept function to retry w/ its args and kwargs.
It's highly recommended to use :func:`ahoyhoy.retries.Retry` function with custom parameters.
"""
self._retries = retries
return self
@abc.abstractmethod
def _validate_required_params(self):
"""
Check that all required parameters were provided.
"""
return
@abc.abstractmethod
[docs] def build(self):
"""
Build and return the client.
"""
self._validate_required_params()
return
[docs]class LBClientBuilder(IClientBuilder):
"""
Usage examples:
1. Round Robin LB
>>> from ahoyhoy.utils import Host
>>> from ahoyhoy.lb.providers import ListProvider
>>> from ahoyhoy.lb import RoundRobinLB
>>>
>>> rrlb = RoundRobinLB(ListProvider(Host('badhost2.bla', 80), Host('google.com', 80), Host('badhost3.bla', 80)))
>>>
>>> client = LBClientBuilder().add_lb(rrlb).build()
>>> client.get('/')
<Response [200]>
2. Round Robin LB and custom session
>>> import requests
>>> s = requests.Session()
>>> s.headers.update({'bla': 'foo'})
>>> client = LBClientBuilder().add_lb(rrlb).add_session(s).build()
>>> client.get('/')
<Response [200]>
3. Round Robin LB with custom HTTP retries
>>> from ahoyhoy.retries import Retry
>>> from requests.exceptions import ConnectTimeout
>>>
>>> retries = Retry(exceptions=ConnectTimeout, tries=3, delay=0, max_delay=None, backoff=2, jitter=0)
>>> rrlb = RoundRobinLB(ListProvider(Host('google.com', 80)))
>>>
>>> client = LBClientBuilder().add_lb(rrlb).add_retries(retries).build()
>>> client.get('/')
<Response [200]>
4. Set multiple updates for endpoints list
>>> client = LBClientBuilder().add_lb(rrlb).set_endpoint_updates(3)
"""
def __init__(self):
super(LBClientBuilder, self).__init__()
self._lb = None
self._ep_updates = 1
[docs] def add_lb(self, lb):
"""
Add your load balancer instance here.
"""
self._lb = lb
return self
[docs] def set_endpoint_updates(self, ep_updates):
"""
Sets the number of times an endpoints list has to be updated.
By default it's 1, which is the initial update of available endpoints.
:param ep_updates: int, number of updates of ep list if there're no endpoints
in the closed state
"""
self._ep_updates = ep_updates
return self
def _validate_required_params(self):
assert self._lb
def build(self):
super(LBClientBuilder, self).build()
return Client(self._lb,
session=self._session,
headers=self._headers,
retry_http_call_func=self._retries,
ep_list_update_tries=self._ep_updates)
[docs]class SessionClientBuilder(IClientBuilder):
"""
Usage example:
>>> import requests
>>> from ahoyhoy.client.builder import SessionClientBuilder
>>>
>>> s = requests.Session()
>>>
>>> client = SessionClientBuilder().add_session(s).build()
>>> client.get('http://google.com')
<Response [200]>
Custom headers:
>>> s.headers.update({'bla': 'foo'})
>>> client = SessionClientBuilder().add_session(s).build()
>>> response = client.get('http://google.com')
>>> assert 'bla' in response.request.headers
or
>>> client = SessionClientBuilder().add_session(s).add_headers({'foo': 'bar'}).build()
>>> response = client.get('http://google.com')
>>> assert 'foo' in response.request.headers
Custom retries:
>>> from ahoyhoy.retries import Retry
>>> from requests.exceptions import ConnectTimeout
>>>
>>> retries = Retry(exceptions=ConnectTimeout, tries=3, delay=0, max_delay=None, backoff=2, jitter=0)
>>>
>>> client = SessionClientBuilder().add_session(s).add_retries(retries).build()
>>> client.get('http://google.com')
<Response [200]>
"""
def _validate_required_params(self):
assert self._session
def build(self):
super(SessionClientBuilder, self).build()
self._session.headers.update(self._headers)
return SimpleClient(session=self._session,
retry_http_call=self._retries)