Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.4 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 326c3ec8 Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network, IPAddress
37 629acc65 Giorgos Korfiatis
from synnefo.quotas import Quotaholder, ASTAKOS_TOKEN
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 326c3ec8 Christos Stavrakakis
    floating_ips = IPAddress.objects.filter(deleted=False)
47 600a3d4d Christos Stavrakakis
48 656cf771 Christos Stavrakakis
    if user is not None:
49 656cf771 Christos Stavrakakis
        vms = vms.filter(userid=user)
50 656cf771 Christos Stavrakakis
        networks = networks.filter(userid=user)
51 8b41683a Christos Stavrakakis
        floating_ips = floating_ips.filter(userid=user)
52 600a3d4d Christos Stavrakakis
53 600a3d4d Christos Stavrakakis
    # Get resources related with VMs
54 600a3d4d Christos Stavrakakis
    vm_resources = vms.values("userid").annotate(num=Count("id"),
55 600a3d4d Christos Stavrakakis
                                                 ram=Sum("flavor__ram"),
56 600a3d4d Christos Stavrakakis
                                                 cpu=Sum("flavor__cpu"),
57 600a3d4d Christos Stavrakakis
                                                 disk=Sum("flavor__disk"))
58 41a7fae7 Christos Stavrakakis
    vm_active_resources = \
59 41a7fae7 Christos Stavrakakis
        vms.values("userid")\
60 32e4e343 Christos Stavrakakis
           .filter(Q(operstate="STARTED") | Q(operstate="BUILD") |
61 41a7fae7 Christos Stavrakakis
                   Q(operstate="ERROR"))\
62 41a7fae7 Christos Stavrakakis
           .annotate(active_ram=Sum("flavor__ram"),
63 41a7fae7 Christos Stavrakakis
                     active_cpu=Sum("flavor__cpu"))
64 41a7fae7 Christos Stavrakakis
65 8b41683a Christos Stavrakakis
    for vm_res in vm_resources.iterator():
66 600a3d4d Christos Stavrakakis
        user = vm_res['userid']
67 656cf771 Christos Stavrakakis
        res = {"cyclades.vm": vm_res["num"],
68 656cf771 Christos Stavrakakis
               "cyclades.cpu": vm_res["cpu"],
69 656cf771 Christos Stavrakakis
               "cyclades.disk": 1073741824 * vm_res["disk"],
70 656cf771 Christos Stavrakakis
               "cyclades.ram": 1048576 * vm_res["ram"]}
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 41a7fae7 Christos Stavrakakis
        holdings[user]["cyclades.active_cpu"] = vm_res["active_cpu"]
76 41a7fae7 Christos Stavrakakis
        holdings[user]["cyclades.active_ram"] = 1048576 * vm_res["active_ram"]
77 41a7fae7 Christos Stavrakakis
78 600a3d4d Christos Stavrakakis
    # Get resources related with networks
79 600a3d4d Christos Stavrakakis
    net_resources = networks.values("userid")\
80 68b952f9 Christos Stavrakakis
                            .annotate(num=Count("id"))
81 8b41683a Christos Stavrakakis
    for net_res in net_resources.iterator():
82 600a3d4d Christos Stavrakakis
        user = net_res['userid']
83 8b41683a Christos Stavrakakis
        holdings.setdefault(user, {})
84 656cf771 Christos Stavrakakis
        holdings[user]["cyclades.network.private"] = net_res["num"]
85 600a3d4d Christos Stavrakakis
86 8b41683a Christos Stavrakakis
    floating_ips_resources = floating_ips.values("userid")\
87 8b41683a Christos Stavrakakis
                                         .annotate(num=Count("id"))
88 8b41683a Christos Stavrakakis
    for floating_ip_res in floating_ips_resources.iterator():
89 8b41683a Christos Stavrakakis
        user = floating_ip_res["userid"]
90 8b41683a Christos Stavrakakis
        holdings.setdefault(user, {})
91 8b41683a Christos Stavrakakis
        holdings[user]["cyclades.floating_ip"] = floating_ip_res["num"]
92 8b41683a Christos Stavrakakis
93 600a3d4d Christos Stavrakakis
    return holdings
94 600a3d4d Christos Stavrakakis
95 600a3d4d Christos Stavrakakis
96 629acc65 Giorgos Korfiatis
def get_quotaholder_holdings(user=None):
97 629acc65 Giorgos Korfiatis
    """Get quotas from Quotaholder for all Cyclades resources.
98 600a3d4d Christos Stavrakakis

99 629acc65 Giorgos Korfiatis
    Returns quotas for all users, unless a single user is specified.
100 600a3d4d Christos Stavrakakis
    """
101 629acc65 Giorgos Korfiatis
    qh = Quotaholder.get()
102 656cf771 Christos Stavrakakis
    return qh.service_get_quotas(ASTAKOS_TOKEN, user)
103 600a3d4d Christos Stavrakakis
104 600a3d4d Christos Stavrakakis
105 629acc65 Giorgos Korfiatis
def transform_quotas(quotas):
106 629acc65 Giorgos Korfiatis
    d = {}
107 629acc65 Giorgos Korfiatis
    for resource, counters in quotas.iteritems():
108 656cf771 Christos Stavrakakis
        used = counters['usage']
109 629acc65 Giorgos Korfiatis
        limit = counters['limit']
110 656cf771 Christos Stavrakakis
        pending = counters['pending']
111 656cf771 Christos Stavrakakis
        d[resource] = (used, limit, pending)
112 629acc65 Giorgos Korfiatis
    return d