Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / quotas / management / commands / cyclades-usage-verify.py @ ce6eb935

History | View | Annotate | Download (3.8 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from django.core.management.base import BaseCommand
35
from optparse import make_option
36

    
37
from synnefo.quotas.util import get_db_holdings, get_quotaholder_holdings
38
from synnefo.webproject.management.utils import pprint_table
39

    
40

    
41
class Command(BaseCommand):
42
    help = """
43
    Verify that cyclades.* resource usage.
44

45
    Verify that usage calculated from Cyclades DB agrees with the usage
46
    recorded in the effective quota database (Quotaholder)
47

48
    """
49
    output_transaction = True
50
    option_list = BaseCommand.option_list + (
51
        make_option("--userid", dest="userid",
52
                    default=None,
53
                    help="Verify usage only for this user"),
54
    )
55

    
56
    def handle(self, *args, **options):
57
        write = self.stdout.write
58
        userid = options['userid']
59

    
60
        users = [userid] if userid else None
61
        # Get info from DB
62
        db_holdings = get_db_holdings(users)
63
        users = db_holdings.keys()
64
        qh_holdings = get_quotaholder_holdings(users)
65
        qh_users = qh_holdings.keys()
66

    
67
        if len(qh_users) < len(users):
68
            for u in set(users) - set(qh_users):
69
                write("Unknown entity: %s\n" % u)
70
                users = qh_users
71

    
72
        headers = ("User", "Resource", "Database", "Quotaholder")
73
        unsynced = []
74
        for user in users:
75
            db = db_holdings[user]
76
            qh = qh_holdings[user]
77
            if not self.verify_resources(user, db.keys(), qh.keys()):
78
                continue
79

    
80
            for res in db.keys():
81
                if db[res] != qh[res]:
82
                    unsynced.append((user, res, str(db[res]), str(qh[res])))
83

    
84
        if unsynced:
85
            pprint_table(self.stderr, unsynced, headers)
86

    
87
    def verify_resources(self, user, db_resources, qh_resources):
88
        write = self.stderr.write
89
        db_res = set(db_resources)
90
        qh_res = set(qh_resources)
91
        if qh_res == db_res:
92
            return True
93
        db_extra = db_res - qh_res
94
        if db_extra:
95
            for res in db_extra:
96
                write("Resource %s exists in DB for %s but not in QH\n"
97
                      % (res, user))
98
        qh_extra = qh_res - db_res
99
        if qh_extra:
100
            for res in qh_extra:
101
                write("Resource %s exists in QH for %s but not in DB\n"
102
                      % (res, user))
103
        return False