Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / quotas / util.py @ ff5edb80

History | View | Annotate | Download (8 kB)

1 ff5edb80 Giorgos Korfiatis
# Copyright 2012-2014 GRNET S.A. All rights reserved.
2 600a3d4d Christos Stavrakakis
#
3 600a3d4d Christos Stavrakakis
# Redistribution and use in source and binary forms, with or
4 600a3d4d Christos Stavrakakis
# without modification, are permitted provided that the following
5 600a3d4d Christos Stavrakakis
# conditions are met:
6 600a3d4d Christos Stavrakakis
#
7 600a3d4d Christos Stavrakakis
#   1. Redistributions of source code must retain the above
8 600a3d4d Christos Stavrakakis
#      copyright notice, this list of conditions and the following
9 600a3d4d Christos Stavrakakis
#      disclaimer.
10 600a3d4d Christos Stavrakakis
#
11 600a3d4d Christos Stavrakakis
#   2. Redistributions in binary form must reproduce the above
12 600a3d4d Christos Stavrakakis
#      copyright notice, this list of conditions and the following
13 600a3d4d Christos Stavrakakis
#      disclaimer in the documentation and/or other materials
14 600a3d4d Christos Stavrakakis
#      provided with the distribution.
15 600a3d4d Christos Stavrakakis
#
16 600a3d4d Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 600a3d4d Christos Stavrakakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 600a3d4d Christos Stavrakakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 600a3d4d Christos Stavrakakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 600a3d4d Christos Stavrakakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 600a3d4d Christos Stavrakakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 600a3d4d Christos Stavrakakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 600a3d4d Christos Stavrakakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 600a3d4d Christos Stavrakakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 600a3d4d Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 600a3d4d Christos Stavrakakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 600a3d4d Christos Stavrakakis
# POSSIBILITY OF SUCH DAMAGE.
28 600a3d4d Christos Stavrakakis
#
29 600a3d4d Christos Stavrakakis
# The views and conclusions contained in the software and
30 600a3d4d Christos Stavrakakis
# documentation are those of the authors and should not be
31 600a3d4d Christos Stavrakakis
# interpreted as representing official policies, either expressed
32 600a3d4d Christos Stavrakakis
# or implied, of GRNET S.A.
33 600a3d4d Christos Stavrakakis
34 41a7fae7 Christos Stavrakakis
from django.db.models import Sum, Count, Q
35 600a3d4d Christos Stavrakakis
36 326c3ec8 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network, IPAddress
37 e407f159 Ilias Tsitsimpis
from synnefo.quotas import Quotaholder
38 dfc7aab7 Giorgos Korfiatis
from collections import defaultdict
39 600a3d4d Christos Stavrakakis
40 dfc7aab7 Giorgos Korfiatis
QuotaDict = lambda: defaultdict(lambda: defaultdict(dict))
41 c4e45b57 Christos Stavrakakis
42 2e2fc330 Giorgos Korfiatis
MiB = 2 ** 20
43 2e2fc330 Giorgos Korfiatis
GiB = 2 ** 30
44 2e2fc330 Giorgos Korfiatis
45 2e2fc330 Giorgos Korfiatis
46 2e2fc330 Giorgos Korfiatis
def get_db_holdings(user=None, project=None):
47 600a3d4d Christos Stavrakakis
    """Get holdings from Cyclades DB."""
48 dfc7aab7 Giorgos Korfiatis
    holdings = QuotaDict()
49 600a3d4d Christos Stavrakakis
50 5d3675bb Christos Stavrakakis
    vms = VirtualMachine.objects.filter(deleted=False)
51 5d3675bb Christos Stavrakakis
    networks = Network.objects.filter(deleted=False)
52 19441a04 Giorgos Korfiatis
    floating_ips = IPAddress.objects.filter(deleted=False, floating_ip=True)
53 600a3d4d Christos Stavrakakis
54 656cf771 Christos Stavrakakis
    if user is not None:
55 656cf771 Christos Stavrakakis
        vms = vms.filter(userid=user)
56 656cf771 Christos Stavrakakis
        networks = networks.filter(userid=user)
57 8b41683a Christos Stavrakakis
        floating_ips = floating_ips.filter(userid=user)
58 600a3d4d Christos Stavrakakis
59 2e2fc330 Giorgos Korfiatis
    if project is not None:
60 2e2fc330 Giorgos Korfiatis
        vms = vms.filter(project=project)
61 2e2fc330 Giorgos Korfiatis
        networks = networks.filter(project=project)
62 2e2fc330 Giorgos Korfiatis
        floating_ips = floating_ips.filter(project=project)
63 2e2fc330 Giorgos Korfiatis
64 600a3d4d Christos Stavrakakis
    # Get resources related with VMs
65 2e2fc330 Giorgos Korfiatis
    vm_resources = vms.values("userid", "project")\
66 2e2fc330 Giorgos Korfiatis
        .annotate(num=Count("id"),
67 2e2fc330 Giorgos Korfiatis
                  total_ram=Sum("flavor__ram"),
68 2e2fc330 Giorgos Korfiatis
                  total_cpu=Sum("flavor__cpu"),
69 2e2fc330 Giorgos Korfiatis
                  disk=Sum("flavor__disk"))
70 41a7fae7 Christos Stavrakakis
71 8b41683a Christos Stavrakakis
    for vm_res in vm_resources.iterator():
72 600a3d4d Christos Stavrakakis
        user = vm_res['userid']
73 2e2fc330 Giorgos Korfiatis
        project = vm_res['project']
74 656cf771 Christos Stavrakakis
        res = {"cyclades.vm": vm_res["num"],
75 5083fc47 Christos Stavrakakis
               "cyclades.total_cpu": vm_res["total_cpu"],
76 2e2fc330 Giorgos Korfiatis
               "cyclades.disk": vm_res["disk"] * GiB,
77 2e2fc330 Giorgos Korfiatis
               "cyclades.total_ram": vm_res["total_ram"] * MiB}
78 dfc7aab7 Giorgos Korfiatis
        holdings[user][project] = res
79 2e2fc330 Giorgos Korfiatis
80 2e2fc330 Giorgos Korfiatis
    vm_active_resources = vms.values("userid", "project")\
81 2e2fc330 Giorgos Korfiatis
        .filter(Q(operstate="STARTED") | Q(operstate="BUILD") |
82 2e2fc330 Giorgos Korfiatis
                Q(operstate="ERROR"))\
83 2e2fc330 Giorgos Korfiatis
        .annotate(ram=Sum("flavor__ram"),
84 2e2fc330 Giorgos Korfiatis
                  cpu=Sum("flavor__cpu"))
85 600a3d4d Christos Stavrakakis
86 8b41683a Christos Stavrakakis
    for vm_res in vm_active_resources.iterator():
87 41a7fae7 Christos Stavrakakis
        user = vm_res['userid']
88 2e2fc330 Giorgos Korfiatis
        project = vm_res['project']
89 dfc7aab7 Giorgos Korfiatis
        holdings[user][project]["cyclades.cpu"] = vm_res["cpu"]
90 dfc7aab7 Giorgos Korfiatis
        holdings[user][project]["cyclades.ram"] = vm_res["ram"] * MiB
91 41a7fae7 Christos Stavrakakis
92 600a3d4d Christos Stavrakakis
    # Get resources related with networks
93 2e2fc330 Giorgos Korfiatis
    net_resources = networks.values("userid", "project")\
94 68b952f9 Christos Stavrakakis
                            .annotate(num=Count("id"))
95 2e2fc330 Giorgos Korfiatis
96 8b41683a Christos Stavrakakis
    for net_res in net_resources.iterator():
97 600a3d4d Christos Stavrakakis
        user = net_res['userid']
98 2e2fc330 Giorgos Korfiatis
        if user is None:
99 2e2fc330 Giorgos Korfiatis
            continue
100 2e2fc330 Giorgos Korfiatis
        project = net_res['project']
101 dfc7aab7 Giorgos Korfiatis
        holdings[user][project]["cyclades.network.private"] = net_res["num"]
102 600a3d4d Christos Stavrakakis
103 2e2fc330 Giorgos Korfiatis
    floating_ips_resources = floating_ips.values("userid", "project")\
104 8b41683a Christos Stavrakakis
                                         .annotate(num=Count("id"))
105 2e2fc330 Giorgos Korfiatis
106 8b41683a Christos Stavrakakis
    for floating_ip_res in floating_ips_resources.iterator():
107 8b41683a Christos Stavrakakis
        user = floating_ip_res["userid"]
108 2e2fc330 Giorgos Korfiatis
        project = floating_ip_res["project"]
109 dfc7aab7 Giorgos Korfiatis
        holdings[user][project]["cyclades.floating_ip"] = \
110 dfc7aab7 Giorgos Korfiatis
            floating_ip_res["num"]
111 2e2fc330 Giorgos Korfiatis
112 2e2fc330 Giorgos Korfiatis
    return holdings
113 2e2fc330 Giorgos Korfiatis
114 2e2fc330 Giorgos Korfiatis
115 2e2fc330 Giorgos Korfiatis
def get_db_project_holdings(project=None):
116 2e2fc330 Giorgos Korfiatis
    """Get holdings from Cyclades DB."""
117 dfc7aab7 Giorgos Korfiatis
    holdings = QuotaDict()
118 2e2fc330 Giorgos Korfiatis
119 2e2fc330 Giorgos Korfiatis
    vms = VirtualMachine.objects.filter(deleted=False)
120 2e2fc330 Giorgos Korfiatis
    networks = Network.objects.filter(deleted=False)
121 2e2fc330 Giorgos Korfiatis
    floating_ips = IPAddress.objects.filter(deleted=False, floating_ip=True)
122 2e2fc330 Giorgos Korfiatis
123 2e2fc330 Giorgos Korfiatis
    if project is not None:
124 2e2fc330 Giorgos Korfiatis
        vms = vms.filter(project=project)
125 2e2fc330 Giorgos Korfiatis
        networks = networks.filter(project=project)
126 2e2fc330 Giorgos Korfiatis
        floating_ips = floating_ips.filter(project=project)
127 2e2fc330 Giorgos Korfiatis
128 2e2fc330 Giorgos Korfiatis
    # Get resources related with VMs
129 2e2fc330 Giorgos Korfiatis
    vm_resources = vms.values("project")\
130 2e2fc330 Giorgos Korfiatis
        .annotate(num=Count("id"),
131 2e2fc330 Giorgos Korfiatis
                  total_ram=Sum("flavor__ram"),
132 2e2fc330 Giorgos Korfiatis
                  total_cpu=Sum("flavor__cpu"),
133 2e2fc330 Giorgos Korfiatis
                  disk=Sum("flavor__disk"))
134 2e2fc330 Giorgos Korfiatis
135 2e2fc330 Giorgos Korfiatis
    for vm_res in vm_resources.iterator():
136 2e2fc330 Giorgos Korfiatis
        project = vm_res['project']
137 2e2fc330 Giorgos Korfiatis
        res = {"cyclades.vm": vm_res["num"],
138 2e2fc330 Giorgos Korfiatis
               "cyclades.total_cpu": vm_res["total_cpu"],
139 2e2fc330 Giorgos Korfiatis
               "cyclades.disk": vm_res["disk"] * GiB,
140 2e2fc330 Giorgos Korfiatis
               "cyclades.total_ram": vm_res["total_ram"] * MiB}
141 dfc7aab7 Giorgos Korfiatis
        holdings[project] = res
142 2e2fc330 Giorgos Korfiatis
143 2e2fc330 Giorgos Korfiatis
    vm_active_resources = vms.values("project")\
144 2e2fc330 Giorgos Korfiatis
        .filter(Q(operstate="STARTED") | Q(operstate="BUILD") |
145 2e2fc330 Giorgos Korfiatis
                Q(operstate="ERROR"))\
146 2e2fc330 Giorgos Korfiatis
        .annotate(ram=Sum("flavor__ram"),
147 2e2fc330 Giorgos Korfiatis
                  cpu=Sum("flavor__cpu"))
148 2e2fc330 Giorgos Korfiatis
149 2e2fc330 Giorgos Korfiatis
    for vm_res in vm_active_resources.iterator():
150 2e2fc330 Giorgos Korfiatis
        project = vm_res['project']
151 dfc7aab7 Giorgos Korfiatis
        holdings[project]["cyclades.cpu"] = vm_res["cpu"]
152 dfc7aab7 Giorgos Korfiatis
        holdings[project]["cyclades.ram"] = vm_res["ram"] * MiB
153 2e2fc330 Giorgos Korfiatis
154 2e2fc330 Giorgos Korfiatis
    # Get resources related with networks
155 2e2fc330 Giorgos Korfiatis
    net_resources = networks.values("project").annotate(num=Count("id"))
156 2e2fc330 Giorgos Korfiatis
157 2e2fc330 Giorgos Korfiatis
    for net_res in net_resources.iterator():
158 2e2fc330 Giorgos Korfiatis
        project = net_res['project']
159 2e2fc330 Giorgos Korfiatis
        if project is None:
160 2e2fc330 Giorgos Korfiatis
            continue
161 dfc7aab7 Giorgos Korfiatis
        holdings[project]["cyclades.network.private"] = net_res["num"]
162 2e2fc330 Giorgos Korfiatis
163 2e2fc330 Giorgos Korfiatis
    floating_ips_resources = floating_ips.values("project")\
164 2e2fc330 Giorgos Korfiatis
        .annotate(num=Count("id"))
165 2e2fc330 Giorgos Korfiatis
166 2e2fc330 Giorgos Korfiatis
    for floating_ip_res in floating_ips_resources.iterator():
167 2e2fc330 Giorgos Korfiatis
        project = floating_ip_res["project"]
168 dfc7aab7 Giorgos Korfiatis
        holdings[project]["cyclades.floating_ip"] = floating_ip_res["num"]
169 8b41683a Christos Stavrakakis
170 600a3d4d Christos Stavrakakis
    return holdings
171 600a3d4d Christos Stavrakakis
172 600a3d4d Christos Stavrakakis
173 629acc65 Giorgos Korfiatis
def get_quotaholder_holdings(user=None):
174 629acc65 Giorgos Korfiatis
    """Get quotas from Quotaholder for all Cyclades resources.
175 600a3d4d Christos Stavrakakis

176 629acc65 Giorgos Korfiatis
    Returns quotas for all users, unless a single user is specified.
177 600a3d4d Christos Stavrakakis
    """
178 629acc65 Giorgos Korfiatis
    qh = Quotaholder.get()
179 e407f159 Ilias Tsitsimpis
    return qh.service_get_quotas(user)
180 600a3d4d Christos Stavrakakis
181 600a3d4d Christos Stavrakakis
182 d14155e3 Giorgos Korfiatis
def get_qh_users_holdings(users=None):
183 d14155e3 Giorgos Korfiatis
    qh = Quotaholder.get()
184 d14155e3 Giorgos Korfiatis
    if users is None or len(users) != 1:
185 d14155e3 Giorgos Korfiatis
        req = None
186 d14155e3 Giorgos Korfiatis
    else:
187 d14155e3 Giorgos Korfiatis
        req = users[0]
188 d14155e3 Giorgos Korfiatis
    quotas = qh.service_get_quotas(req)
189 d14155e3 Giorgos Korfiatis
190 d14155e3 Giorgos Korfiatis
    if users is None:
191 d14155e3 Giorgos Korfiatis
        return quotas
192 d14155e3 Giorgos Korfiatis
193 d14155e3 Giorgos Korfiatis
    qs = {}
194 d14155e3 Giorgos Korfiatis
    for user in users:
195 d14155e3 Giorgos Korfiatis
        try:
196 d14155e3 Giorgos Korfiatis
            qs[user] = quotas[user]
197 d14155e3 Giorgos Korfiatis
        except KeyError:
198 d14155e3 Giorgos Korfiatis
            pass
199 d14155e3 Giorgos Korfiatis
    return qs
200 d14155e3 Giorgos Korfiatis
201 d14155e3 Giorgos Korfiatis
202 f600b74e Giorgos Korfiatis
def get_qh_project_holdings(projects=None):
203 f600b74e Giorgos Korfiatis
    qh = Quotaholder.get()
204 f600b74e Giorgos Korfiatis
    if projects is None or len(projects) != 1:
205 f600b74e Giorgos Korfiatis
        req = None
206 f600b74e Giorgos Korfiatis
    else:
207 f600b74e Giorgos Korfiatis
        req = projects[0]
208 f600b74e Giorgos Korfiatis
    quotas = qh.service_get_project_quotas(req)
209 f600b74e Giorgos Korfiatis
210 f600b74e Giorgos Korfiatis
    if projects is None:
211 f600b74e Giorgos Korfiatis
        return quotas
212 f600b74e Giorgos Korfiatis
213 f600b74e Giorgos Korfiatis
    qs = {}
214 f600b74e Giorgos Korfiatis
    for project in projects:
215 f600b74e Giorgos Korfiatis
        try:
216 f600b74e Giorgos Korfiatis
            qs[project] = quotas[project]
217 f600b74e Giorgos Korfiatis
        except KeyError:
218 f600b74e Giorgos Korfiatis
            pass
219 f600b74e Giorgos Korfiatis
    return qs
220 f600b74e Giorgos Korfiatis
221 f600b74e Giorgos Korfiatis
222 629acc65 Giorgos Korfiatis
def transform_quotas(quotas):
223 629acc65 Giorgos Korfiatis
    d = {}
224 629acc65 Giorgos Korfiatis
    for resource, counters in quotas.iteritems():
225 656cf771 Christos Stavrakakis
        used = counters['usage']
226 629acc65 Giorgos Korfiatis
        limit = counters['limit']
227 656cf771 Christos Stavrakakis
        pending = counters['pending']
228 656cf771 Christos Stavrakakis
        d[resource] = (used, limit, pending)
229 629acc65 Giorgos Korfiatis
    return d
230 f600b74e Giorgos Korfiatis
231 f600b74e Giorgos Korfiatis
232 f600b74e Giorgos Korfiatis
def transform_project_quotas(quotas):
233 f600b74e Giorgos Korfiatis
    d = {}
234 f600b74e Giorgos Korfiatis
    for resource, counters in quotas.iteritems():
235 f600b74e Giorgos Korfiatis
        used = counters['project_usage']
236 f600b74e Giorgos Korfiatis
        limit = counters['project_limit']
237 f600b74e Giorgos Korfiatis
        pending = counters['project_pending']
238 f600b74e Giorgos Korfiatis
        d[resource] = (used, limit, pending)
239 f600b74e Giorgos Korfiatis
    return d