Tomtom QPS fix

Tomtom return 403 status code in the following scenarios:

- Forbidden
- Not authorized
- Account inactive
- Account over queries per second limit
- Account over rate limit
- Rate limit exceeded

So when we reach the QPS limit we receive a 403 instead of 429 so we
have to include the provider in the qps service to differentiate between
providers that returns 429 and special cases like tomtom
This commit is contained in:
Mario de Frutos
2018-10-03 14:21:55 +02:00
parent 247e9040dd
commit 61a27a9f9d
3 changed files with 13 additions and 14 deletions

View File

@@ -64,7 +64,7 @@ class TomTomIsolines():
return self._parse_coordinates(reachable_range[ENTRY_BOUNDARY])
@qps_retry(qps=5)
@qps_retry(qps=5, provider='tomtom')
def _calculate_isoline(self, origin, time_range,
profile=DEFAULT_PROFILE,
date_time=DEFAULT_DEPARTAT):

View File

@@ -18,15 +18,10 @@ def qps_retry(original_function=None, **options):
"""
if original_function is not None:
def wrapped_function(*args, **kwargs):
if 'timeout' in options:
timeout = options['timeout']
else:
timeout = DEFAULT_RETRY_TIMEOUT
if 'qps' in options:
qps = options['qps']
else:
qps = DEFAULT_QUERIES_PER_SECOND
return QPSService(retry_timeout=timeout, queries_per_second=qps).call(original_function, *args, **kwargs)
timeout = options.get('timeout', DEFAULT_RETRY_TIMEOUT)
qps = options.get('qps', DEFAULT_QUERIES_PER_SECOND)
provider = options.get('provider', None)
return QPSService(retry_timeout=timeout, queries_per_second=qps, provider=provider).call(original_function, *args, **kwargs)
return wrapped_function
else:
def partial_wrapper(func):
@@ -36,9 +31,10 @@ def qps_retry(original_function=None, **options):
class QPSService:
def __init__(self, queries_per_second, retry_timeout):
def __init__(self, queries_per_second, retry_timeout, provider):
self._queries_per_second = queries_per_second
self._retry_timeout = retry_timeout
self._provider = provider
def call(self, fn, *args, **kwargs):
start_time = datetime.now()
@@ -48,8 +44,11 @@ class QPSService:
return fn(*args, **kwargs)
except Exception as e:
response = getattr(e, 'response', None)
if response is not None and (response.status_code == 429):
self.retry(start_time, attempt_number)
if response is not None:
if self._provider is not None and self._provider == 'tomtom' and (response.status_code == 403):
self.retry(start_time, attempt_number)
elif response.status_code == 429:
self.retry(start_time, attempt_number)
else:
raise e
attempt_number += 1

View File

@@ -10,7 +10,7 @@ from setuptools import setup, find_packages
setup(
name='cartodb_services',
version='0.20.0',
version='0.20.1',
description='CartoDB Services API Python Library',