WIP: support for storing rate limits configuration

This commit is contained in:
Javier Goizueta
2017-03-16 19:12:39 +01:00
parent 7f6c19b292
commit 945c6cd685
5 changed files with 100 additions and 8 deletions
@@ -65,3 +65,40 @@ class RateLimitsConfigBuilder(object):
self._username,
rate_limit.get('limit', None),
rate_limit.get('period', None))
class RateLimitsConfigSetter(object):
def __init__(self, service, username, orgname=None):
self._service = service
self._service_config = ServerConfiguration(service, username, orgname)
def set_user_rate_limits(self, rate_limits_config):
# Note we allow copying a config from another user/service, so we
# ignore rate_limits:config.service and rate_limits:config.username
rate_limit_key = "{0}_rate_limit".format(service)
if rate_limits_config.is_limited():
rate_limit = {'limit': rate_limits_config.limit, 'period': rate_limits_config.period}
self.service_config.user.set(rate_limit_key, rate_limit)
else
self.service_config.user.remove(rate_limit_key)
def set_org_rate_limits(self, rate_limits_config):
rate_limit_key = "{0}_rate_limit".format(service)
if rate_limits_config.is_limited():
rate_limit = {'limit': rate_limits_config.limit, 'period': rate_limits_config.period}
self.service_config.org.set(rate_limit_key, rate_limit)
else
self.service_config.org.remove(rate_limit_key)
def set_server_rate_limits(self, rate_limits_config):
rate_limits = self.service_config.server.get('rate_limits', {})
if rate_limits_config.is_limited():
rate_limits[self._service] = {'limit': rate_limits_config.limit, 'period': rate_limits_config.period}
else
rate_limits.pop(self._service, None)
if rate_limits:
self.service_config.server.set('rate_limits', rate_limits)
else
self.service_config.server.remove('rate_limits')
@@ -17,6 +17,12 @@ class RedisConfigStorage(ConfigBackendInterface):
else:
return self._data.get(key, default)
def set(self, key, value):
self._connection.hset(self._config_key, key, value)
def remove(self, key):
self._connection.hdel(self._config_key, key)
class RedisUserConfigStorageBuilder(object):
def __init__(self, redis_connection, username):
self._redis_connection = redis_connection
@@ -19,3 +19,13 @@ class InDbServerConfigStorage(ConfigBackendInterface):
raise KeyError
else:
return default
def set(self, key, config):
json_config = json.dumps(config)
quoted_config = cartodb_services.plpy.quote_nullable(json_config)
sql = "SELECT cdb_dataservices_server.cdb_conf_setconf('{0}', {0})".format(key, quoted_config)
cartodb_services.plpy.execute(sql)
def remove(self, key):
sql = "SELECT cdb_dataservices_server.cdb_conf_removeconf('{0}')".format(key)
cartodb_services.plpy.execute(sql)