Revision b14f55b5

b/snf-cyclades-app/synnefo/app_settings/default/api.py
104 104

  
105 105
# Quota
106 106
#
107
# Set to True to use the Quotaholder service. Otherwise, static
108
# limits are used
109
USE_QUOTAHOLDER = False
107 110
# Maximum number of VMs a user is allowed to have.
108 111
MAX_VMS_PER_USER = 3
109 112

  
b/snf-cyclades-app/synnefo/quotas/__init__.py
30 30
from functools import wraps
31 31
from contextlib import contextmanager
32 32

  
33
from synnefo.settings import QUOTAHOLDER_URL
34
from synnefo.db.models import QuotaHolderSerial
33
from synnefo.settings import (QUOTAHOLDER_URL, USE_QUOTAHOLDER,
34
                              VMS_USER_QUOTA, MAX_VMS_PER_USER,
35
                              NETWORKS_USER_QUOTA, MAX_NETWORKS_PER_USER)
36

  
37
from synnefo.db.models import QuotaHolderSerial, VirtualMachine, Network
35 38
from synnefo.api.faults import OverLimit
36 39

  
37 40
from kamaki.clients.quotaholder import QuotaholderClient
......
42 45
log = logging.getLogger(__name__)
43 46

  
44 47

  
48
class DummySerial(QuotaHolderSerial):
49
    accepted = True
50
    rejected = True
51
    pending = True
52
    id = None
53

  
54
    def save(*args, **kwargs):
55
        pass
56

  
57

  
58
class DummyQuotaholderClient(object):
59
    def issue_commission(self, **commission_info):
60
        provisions = commission_info["provisions"]
61
        userid = commission_info["target"]
62
        for provision in provisions:
63
            entity, resource, size = provision
64
            if resource == "cyclades.vm":
65
                user_vms = VirtualMachine.objects.filter(userid=userid,
66
                                                         deleted=False).count()
67
                user_vm_limit = VMS_USER_QUOTA.get(userid, MAX_VMS_PER_USER)
68
                log.warning("Users VMs %s User Limits %s", user_vms,
69
                        user_vm_limit)
70
                if user_vms + size >= user_vm_limit:
71
                    raise NoQuantityError()
72
            if resource == "cyclades.network.private":
73
                user_networks = Network.objects.filter(userid=userid,
74
                                                       deleted=False).count()
75
                user_network_limit = NETWORKS_USER_QUOTA.get(userid,
76
                                                         MAX_NETWORKS_PER_USER)
77
                if user_networks + size >= user_network_limit:
78
                    raise NoQuantityError()
79

  
80
        return None
81

  
82
    def accept_commission(self, *args, **kwargs):
83
        pass
84

  
85
    def reject_commission(self, *args, **kwargs):
86
        pass
87

  
88
    def get_pending_commissions(self, *args, **kwargs):
89
        return []
90

  
91

  
45 92
@contextmanager
46 93
def get_quota_holder():
47 94
    """Context manager for using a QuotaHolder."""
48
    quotaholder = QuotaholderClient(QUOTAHOLDER_URL)
95
    if USE_QUOTAHOLDER:
96
        quotaholder = QuotaholderClient(QUOTAHOLDER_URL)
97
    else:
98
        quotaholder = DummyQuotaholderClient()
49 99

  
50 100
    try:
51 101
        yield quotaholder
......
75 125
            return ret
76 126
        except CallError:
77 127
            log.exception("Unexpected error")
128
            raise
78 129
        except:
79 130
            if serials:
80 131
                reject_commission(serials=serials)
......
136 187
            if e.call_error in ["NoCapacityError", "NoQuantityError"]:
137 188
                raise OverLimit("Limit exceeded for your account")
138 189

  
139
    db_serial = QuotaHolderSerial.objects.create(serial=serial)
140
    return db_serial
190
    if serial:
191
        return QuotaHolderSerial.objects.create(serial=serial)
192
    elif not USE_QUOTAHOLDER:
193
        return DummySerial()
194
    else:
195
        raise Exception("No serial")
141 196

  
142 197

  
143 198
# Wrapper functions for issuing commissions for each resource type.  Each
......
182 237
        resources = invert_resources(resources)
183 238
    provisions = [('cyclades', 'cyclades.' + r, s)
184 239
                  for r, s in resources.items()]
185
    log.debug("Provisions are %s", provisions)
186 240
    return  {"context":    {},
187 241
             "target":     user,
188 242
             "key":        "1",

Also available in: Unified diff