Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.9 kB)

1 629acc65 Giorgos Korfiatis
# Copyright 2012, 2013 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 d05e5324 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network, IPAddress, Volume
37 e407f159 Ilias Tsitsimpis
from synnefo.quotas import Quotaholder
38 600a3d4d Christos Stavrakakis
39 c4e45b57 Christos Stavrakakis
40 656cf771 Christos Stavrakakis
def get_db_holdings(user=None):
41 600a3d4d Christos Stavrakakis
    """Get holdings from Cyclades DB."""
42 600a3d4d Christos Stavrakakis
    holdings = {}
43 600a3d4d Christos Stavrakakis
44 5d3675bb Christos Stavrakakis
    vms = VirtualMachine.objects.filter(deleted=False)
45 5d3675bb Christos Stavrakakis
    networks = Network.objects.filter(deleted=False)
46 19441a04 Giorgos Korfiatis
    floating_ips = IPAddress.objects.filter(deleted=False, floating_ip=True)
47 d05e5324 Christos Stavrakakis
    volumes = Volume.objects.filter(deleted=False)
48 600a3d4d Christos Stavrakakis
49 656cf771 Christos Stavrakakis
    if user is not None:
50 656cf771 Christos Stavrakakis
        vms = vms.filter(userid=user)
51 656cf771 Christos Stavrakakis
        networks = networks.filter(userid=user)
52 8b41683a Christos Stavrakakis
        floating_ips = floating_ips.filter(userid=user)
53 600a3d4d Christos Stavrakakis
54 600a3d4d Christos Stavrakakis
    # Get resources related with VMs
55 5083fc47 Christos Stavrakakis
    vm_resources = vms.values("userid")\
56 5083fc47 Christos Stavrakakis
                      .annotate(num=Count("id"),
57 5083fc47 Christos Stavrakakis
                                total_ram=Sum("flavor__ram"),
58 d05e5324 Christos Stavrakakis
                                total_cpu=Sum("flavor__cpu"))
59 41a7fae7 Christos Stavrakakis
    vm_active_resources = \
60 41a7fae7 Christos Stavrakakis
        vms.values("userid")\
61 32e4e343 Christos Stavrakakis
           .filter(Q(operstate="STARTED") | Q(operstate="BUILD") |
62 41a7fae7 Christos Stavrakakis
                   Q(operstate="ERROR"))\
63 5083fc47 Christos Stavrakakis
           .annotate(ram=Sum("flavor__ram"),
64 5083fc47 Christos Stavrakakis
                     cpu=Sum("flavor__cpu"))
65 41a7fae7 Christos Stavrakakis
66 8b41683a Christos Stavrakakis
    for vm_res in vm_resources.iterator():
67 600a3d4d Christos Stavrakakis
        user = vm_res['userid']
68 656cf771 Christos Stavrakakis
        res = {"cyclades.vm": vm_res["num"],
69 5083fc47 Christos Stavrakakis
               "cyclades.total_cpu": vm_res["total_cpu"],
70 d05e5324 Christos Stavrakakis
               "cyclades.total_ram": vm_res["total_ram"] << 20}
71 600a3d4d Christos Stavrakakis
        holdings[user] = res
72 600a3d4d Christos Stavrakakis
73 8b41683a Christos Stavrakakis
    for vm_res in vm_active_resources.iterator():
74 41a7fae7 Christos Stavrakakis
        user = vm_res['userid']
75 5083fc47 Christos Stavrakakis
        holdings[user]["cyclades.cpu"] = vm_res["cpu"]
76 d05e5324 Christos Stavrakakis
        holdings[user]["cyclades.ram"] = vm_res["ram"] << 20
77 d05e5324 Christos Stavrakakis
78 d05e5324 Christos Stavrakakis
    # Get disk resource
79 d05e5324 Christos Stavrakakis
    disk_resources = volumes.values("userid").annotate(Sum("size"))
80 d05e5324 Christos Stavrakakis
    for disk_res in disk_resources.iterator():
81 d05e5324 Christos Stavrakakis
        user = disk_res["userid"]
82 d05e5324 Christos Stavrakakis
        holdings.setdefault(user, {})
83 d05e5324 Christos Stavrakakis
        holdings[user]["cyclades.disk"] = disk_res["size__sum"] << 30
84 41a7fae7 Christos Stavrakakis
85 600a3d4d Christos Stavrakakis
    # Get resources related with networks
86 600a3d4d Christos Stavrakakis
    net_resources = networks.values("userid")\
87 68b952f9 Christos Stavrakakis
                            .annotate(num=Count("id"))
88 8b41683a Christos Stavrakakis
    for net_res in net_resources.iterator():
89 600a3d4d Christos Stavrakakis
        user = net_res['userid']
90 8b41683a Christos Stavrakakis
        holdings.setdefault(user, {})
91 656cf771 Christos Stavrakakis
        holdings[user]["cyclades.network.private"] = net_res["num"]
92 600a3d4d Christos Stavrakakis
93 8b41683a Christos Stavrakakis
    floating_ips_resources = floating_ips.values("userid")\
94 8b41683a Christos Stavrakakis
                                         .annotate(num=Count("id"))
95 8b41683a Christos Stavrakakis
    for floating_ip_res in floating_ips_resources.iterator():
96 8b41683a Christos Stavrakakis
        user = floating_ip_res["userid"]
97 8b41683a Christos Stavrakakis
        holdings.setdefault(user, {})
98 8b41683a Christos Stavrakakis
        holdings[user]["cyclades.floating_ip"] = floating_ip_res["num"]
99 8b41683a Christos Stavrakakis
100 600a3d4d Christos Stavrakakis
    return holdings
101 600a3d4d Christos Stavrakakis
102 600a3d4d Christos Stavrakakis
103 629acc65 Giorgos Korfiatis
def get_quotaholder_holdings(user=None):
104 629acc65 Giorgos Korfiatis
    """Get quotas from Quotaholder for all Cyclades resources.
105 600a3d4d Christos Stavrakakis

106 629acc65 Giorgos Korfiatis
    Returns quotas for all users, unless a single user is specified.
107 600a3d4d Christos Stavrakakis
    """
108 629acc65 Giorgos Korfiatis
    qh = Quotaholder.get()
109 e407f159 Ilias Tsitsimpis
    return qh.service_get_quotas(user)
110 600a3d4d Christos Stavrakakis
111 600a3d4d Christos Stavrakakis
112 d14155e3 Giorgos Korfiatis
def get_qh_users_holdings(users=None):
113 d14155e3 Giorgos Korfiatis
    qh = Quotaholder.get()
114 d14155e3 Giorgos Korfiatis
    if users is None or len(users) != 1:
115 d14155e3 Giorgos Korfiatis
        req = None
116 d14155e3 Giorgos Korfiatis
    else:
117 d14155e3 Giorgos Korfiatis
        req = users[0]
118 d14155e3 Giorgos Korfiatis
    quotas = qh.service_get_quotas(req)
119 d14155e3 Giorgos Korfiatis
120 d14155e3 Giorgos Korfiatis
    if users is None:
121 d14155e3 Giorgos Korfiatis
        return quotas
122 d14155e3 Giorgos Korfiatis
123 d14155e3 Giorgos Korfiatis
    qs = {}
124 d14155e3 Giorgos Korfiatis
    for user in users:
125 d14155e3 Giorgos Korfiatis
        try:
126 d14155e3 Giorgos Korfiatis
            qs[user] = quotas[user]
127 d14155e3 Giorgos Korfiatis
        except KeyError:
128 d14155e3 Giorgos Korfiatis
            pass
129 d14155e3 Giorgos Korfiatis
    return qs
130 d14155e3 Giorgos Korfiatis
131 d14155e3 Giorgos Korfiatis
132 629acc65 Giorgos Korfiatis
def transform_quotas(quotas):
133 629acc65 Giorgos Korfiatis
    d = {}
134 629acc65 Giorgos Korfiatis
    for resource, counters in quotas.iteritems():
135 656cf771 Christos Stavrakakis
        used = counters['usage']
136 629acc65 Giorgos Korfiatis
        limit = counters['limit']
137 656cf771 Christos Stavrakakis
        pending = counters['pending']
138 656cf771 Christos Stavrakakis
        d[resource] = (used, limit, pending)
139 629acc65 Giorgos Korfiatis
    return d