Commit d337d476 authored by Giorgos Korfiatis's avatar Giorgos Korfiatis
Browse files

New quota functions in astakos

Handle quotas as nested dictionaries indexed by:
user uuid, source, resource name
parent 3c713bcc
# Copyright 2013 GRNET S.A. All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above
# copyright notice, this list of conditions and the following
# disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.
from astakos.quotaholder.callpoint import QuotaholderDjangoDBCallpoint
qh = QuotaholderDjangoDBCallpoint()
def from_holding(holding):
limit, imported_min, imported_max = holding
body = {'limit': limit,
'used': imported_min,
'available': max(0, limit-imported_max),
}
return body
def limits_only(holding):
limit, imported_min, imported_max = holding
return limit
def transform_data(holdings, func=None):
if func is None:
func = from_holding
quota = {}
for (holder, source, resource), value in holdings.iteritems():
holder_quota = quota.get(holder, {})
source_quota = holder_quota.get(source, {})
body = func(value)
source_quota[resource] = body
holder_quota[source] = source_quota
quota[holder] = holder_quota
return quota
def get_counters(users, resources=None, sources=None):
uuids = [user.uuid for user in users]
counters = qh.get_holder_quota(holders=uuids,
resources=resources,
sources=sources)
return counters
def get_users_quotas(users, resources=None, sources=None):
counters = get_counters(users, resources, sources)
quotas = transform_data(counters)
return quotas
def get_users_quotas_and_limits(users, resources=None, sources=None):
counters = get_counters(users, resources, sources)
quotas = transform_data(counters)
limits = transform_data(counters, limits_only)
return quotas, limits
def get_user_quotas(user, resources=None, sources=None):
quotas = get_users_quotas([user], resources, sources)
return quotas[user.uuid]
def set_user_quota(quotas):
qh.set_holder_quota(quotas)
......@@ -165,6 +165,23 @@ class QuotaholderDjangoDBCallpoint(object):
return holdings_list, rejected
def get_holder_quota(self, holders=None, sources=None, resources=None):
holdings = Holding.objects.filter(holder__in=holders)
if sources is not None:
holdings = holdings.filter(source__in=sources)
if resources is not None:
holdings = holdings.filter(resource__in=resources)
quotas = {}
for holding in holdings:
key = (holding.holder, holding.source, holding.resource)
value = (holding.limit, holding.imported_min, holding.imported_max)
quotas[key] = value
return quotas
def get_quota(self, context=None, get_quota=[]):
quotas = []
append = quotas.append
......@@ -187,6 +204,26 @@ class QuotaholderDjangoDBCallpoint(object):
return quotas
def set_holder_quota(self, quotas):
holders = quotas.keys()
hs = Holding.objects.filter(holder__in=holders).select_for_update()
holdings = {}
for h in hs:
holdings[(h.holder, h.source, h.resource)] = h
for holder, holder_quota in quotas.iteritems():
for source, source_quota in holder_quota.iteritems():
for resource, limit in source_quota.iteritems():
try:
h = holdings[(holder, source, resource)]
except KeyError:
h = Holding(holder=holder,
source=source,
resource=resource)
h.limit = limit
h.save()
def set_quota(self, context=None, set_quota=[]):
rejected = []
append = rejected.append
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment