Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4 kB)

1 600a3d4d Christos Stavrakakis
# Copyright 2012 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 600a3d4d Christos Stavrakakis
from django.db.models import Sum, Count
35 600a3d4d Christos Stavrakakis
36 600a3d4d Christos Stavrakakis
from synnefo.db.models import VirtualMachine, Network
37 498b2bd0 Georgios D. Tsoukalas
from synnefo.quotas import get_quota_holder, NoEntityError
38 600a3d4d Christos Stavrakakis
39 c4e45b57 Christos Stavrakakis
40 600a3d4d Christos Stavrakakis
def get_db_holdings(users=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 600a3d4d Christos Stavrakakis
47 600a3d4d Christos Stavrakakis
    if users:
48 600a3d4d Christos Stavrakakis
        assert(type(users) is list)
49 600a3d4d Christos Stavrakakis
        vms = vms.filter(userid__in=users)
50 600a3d4d Christos Stavrakakis
        networks = networks.filter(userid__in=users)
51 600a3d4d Christos Stavrakakis
52 600a3d4d Christos Stavrakakis
    # Get resources related with VMs
53 600a3d4d Christos Stavrakakis
    vm_resources = vms.values("userid").annotate(num=Count("id"),
54 600a3d4d Christos Stavrakakis
                                                 ram=Sum("flavor__ram"),
55 600a3d4d Christos Stavrakakis
                                                 cpu=Sum("flavor__cpu"),
56 600a3d4d Christos Stavrakakis
                                                 disk=Sum("flavor__disk"))
57 600a3d4d Christos Stavrakakis
    for vm_res in vm_resources:
58 600a3d4d Christos Stavrakakis
        user = vm_res['userid']
59 600a3d4d Christos Stavrakakis
        res = {"vm": vm_res["num"],
60 600a3d4d Christos Stavrakakis
               "cpu": vm_res["cpu"],
61 600a3d4d Christos Stavrakakis
               "disk": 1073741824 * vm_res["disk"],
62 600a3d4d Christos Stavrakakis
               "ram": 1048576 * vm_res["ram"]}
63 600a3d4d Christos Stavrakakis
        holdings[user] = res
64 600a3d4d Christos Stavrakakis
65 600a3d4d Christos Stavrakakis
    # Get resources related with networks
66 600a3d4d Christos Stavrakakis
    net_resources = networks.values("userid")\
67 68b952f9 Christos Stavrakakis
                            .annotate(num=Count("id"))
68 600a3d4d Christos Stavrakakis
    for net_res in net_resources:
69 600a3d4d Christos Stavrakakis
        user = net_res['userid']
70 600a3d4d Christos Stavrakakis
        if user not in holdings:
71 600a3d4d Christos Stavrakakis
            holdings[user] = {}
72 600a3d4d Christos Stavrakakis
        holdings[user]["network.private"] = net_res["num"]
73 600a3d4d Christos Stavrakakis
74 600a3d4d Christos Stavrakakis
    return holdings
75 600a3d4d Christos Stavrakakis
76 600a3d4d Christos Stavrakakis
77 600a3d4d Christos Stavrakakis
def get_quotaholder_holdings(users=[]):
78 600a3d4d Christos Stavrakakis
    """Get holdings from Quotaholder.
79 600a3d4d Christos Stavrakakis

80 600a3d4d Christos Stavrakakis
    If the entity for the user does not exist in quotaholder, no holding
81 600a3d4d Christos Stavrakakis
    is returned.
82 600a3d4d Christos Stavrakakis
    """
83 94ad2d07 Christos Stavrakakis
    users = filter(lambda u: not u is None, users)
84 600a3d4d Christos Stavrakakis
    holdings = {}
85 600a3d4d Christos Stavrakakis
    with get_quota_holder() as qh:
86 94ad2d07 Christos Stavrakakis
        list_holdings = [(user, "1") for user in users]
87 94ad2d07 Christos Stavrakakis
        (qh_holdings, rejected) = qh.list_holdings(context={},
88 94ad2d07 Christos Stavrakakis
                                                   list_holdings=list_holdings)
89 94ad2d07 Christos Stavrakakis
        found_users = filter(lambda u: not u in rejected, users)
90 94ad2d07 Christos Stavrakakis
    for user, user_holdings in zip(found_users, qh_holdings):
91 94ad2d07 Christos Stavrakakis
        if not user_holdings:
92 94ad2d07 Christos Stavrakakis
            continue
93 94ad2d07 Christos Stavrakakis
        for h in user_holdings:
94 94ad2d07 Christos Stavrakakis
            assert(h[0] == user)
95 94ad2d07 Christos Stavrakakis
        user_holdings = filter(lambda x: x[1].startswith("cyclades."),
96 94ad2d07 Christos Stavrakakis
                               user_holdings)
97 94ad2d07 Christos Stavrakakis
        holdings[user] = dict(map(decode_holding, user_holdings))
98 600a3d4d Christos Stavrakakis
    return holdings
99 600a3d4d Christos Stavrakakis
100 600a3d4d Christos Stavrakakis
101 600a3d4d Christos Stavrakakis
def decode_holding(holding):
102 68b952f9 Christos Stavrakakis
    entity, resource, imported, exported, returned, released = holding
103 600a3d4d Christos Stavrakakis
    res = resource.replace("cyclades.", "")
104 600a3d4d Christos Stavrakakis
    return (res, imported - exported + returned - released)