root / snf-cyclades-app / synnefo / quotas / management / commands / reconcile-resources-cyclades.py @ 62c86226
History | View | Annotate | Download (4.7 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 | 600a3d4d | Christos Stavrakakis | from django.core.management.base import BaseCommand |
35 | 600a3d4d | Christos Stavrakakis | from optparse import make_option |
36 | 600a3d4d | Christos Stavrakakis | |
37 | ccfbf77b | Christos Stavrakakis | |
38 | ccfbf77b | Christos Stavrakakis | from synnefo import quotas |
39 | 629acc65 | Giorgos Korfiatis | from synnefo.quotas.util import (get_db_holdings, get_quotaholder_holdings, |
40 | 629acc65 | Giorgos Korfiatis | transform_quotas) |
41 | ce6eb935 | Christos Stavrakakis | from synnefo.webproject.management.utils import pprint_table |
42 | ccfbf77b | Christos Stavrakakis | from synnefo.settings import CYCLADES_ASTAKOS_SERVICE_TOKEN as ASTAKOS_TOKEN |
43 | 600a3d4d | Christos Stavrakakis | |
44 | 600a3d4d | Christos Stavrakakis | |
45 | 600a3d4d | Christos Stavrakakis | class Command(BaseCommand): |
46 | 62c86226 | Christos Stavrakakis | help = """Reconcile resource usage of Astakos with Cyclades DB.
|
47 | f8955d79 | Georgios D. Tsoukalas |
|
48 | 62c86226 | Christos Stavrakakis | Detect unsynchronized usage between Astakos and Cyclades DB resources and
|
49 | ccfbf77b | Christos Stavrakakis | synchronize them if specified so.
|
50 | f8955d79 | Georgios D. Tsoukalas |
|
51 | f8955d79 | Georgios D. Tsoukalas | """
|
52 | 600a3d4d | Christos Stavrakakis | option_list = BaseCommand.option_list + ( |
53 | 600a3d4d | Christos Stavrakakis | make_option("--userid", dest="userid", |
54 | 600a3d4d | Christos Stavrakakis | default=None,
|
55 | ccfbf77b | Christos Stavrakakis | help="Reconcile resources only for this user"),
|
56 | ccfbf77b | Christos Stavrakakis | make_option("--fix", dest="fix", |
57 | ccfbf77b | Christos Stavrakakis | default=False,
|
58 | ccfbf77b | Christos Stavrakakis | action="store_true",
|
59 | ccfbf77b | Christos Stavrakakis | help="Synchronize Astakos quotas with Cyclades DB."),
|
60 | ccfbf77b | Christos Stavrakakis | make_option("--force",
|
61 | ccfbf77b | Christos Stavrakakis | default=False,
|
62 | ccfbf77b | Christos Stavrakakis | action="store_true",
|
63 | ccfbf77b | Christos Stavrakakis | help="Override Astakos quotas. Force Astakos to impose"
|
64 | ccfbf77b | Christos Stavrakakis | " the Cyclades quota, independently of their value.")
|
65 | 600a3d4d | Christos Stavrakakis | ) |
66 | 600a3d4d | Christos Stavrakakis | |
67 | 600a3d4d | Christos Stavrakakis | def handle(self, *args, **options): |
68 | 600a3d4d | Christos Stavrakakis | write = self.stdout.write
|
69 | 600a3d4d | Christos Stavrakakis | userid = options['userid']
|
70 | 600a3d4d | Christos Stavrakakis | |
71 | ccfbf77b | Christos Stavrakakis | # Get holdings from Cyclades DB
|
72 | ccfbf77b | Christos Stavrakakis | db_holdings = get_db_holdings(userid) |
73 | ccfbf77b | Christos Stavrakakis | # Get holdings from QuotaHolder
|
74 | 629acc65 | Giorgos Korfiatis | qh_holdings = get_quotaholder_holdings(userid) |
75 | 600a3d4d | Christos Stavrakakis | |
76 | ccfbf77b | Christos Stavrakakis | users = set(db_holdings.keys())
|
77 | ccfbf77b | Christos Stavrakakis | users.update(qh_holdings.keys()) |
78 | ccfbf77b | Christos Stavrakakis | # Remove 'None' user
|
79 | ccfbf77b | Christos Stavrakakis | users.discard(None)
|
80 | 600a3d4d | Christos Stavrakakis | |
81 | 600a3d4d | Christos Stavrakakis | unsynced = [] |
82 | 600a3d4d | Christos Stavrakakis | for user in users: |
83 | ccfbf77b | Christos Stavrakakis | db = db_holdings.get(user, {}) |
84 | ccfbf77b | Christos Stavrakakis | qh_all = qh_holdings.get(user, {}) |
85 | 629acc65 | Giorgos Korfiatis | # Assuming only one source
|
86 | ccfbf77b | Christos Stavrakakis | qh = qh_all.get(quotas.DEFAULT_SOURCE, {}) |
87 | 629acc65 | Giorgos Korfiatis | qh = transform_quotas(qh) |
88 | ccfbf77b | Christos Stavrakakis | for resource in quotas.RESOURCES: |
89 | ccfbf77b | Christos Stavrakakis | db_value = db.pop(resource, 0)
|
90 | ccfbf77b | Christos Stavrakakis | qh_value, _, qh_pending = qh.pop(resource, (0, 0)) |
91 | ccfbf77b | Christos Stavrakakis | if qh_pending:
|
92 | ccfbf77b | Christos Stavrakakis | write("Pending commission. User '%s', resource '%s'.\n" %
|
93 | ccfbf77b | Christos Stavrakakis | (user, resource)) |
94 | 629acc65 | Giorgos Korfiatis | continue
|
95 | ccfbf77b | Christos Stavrakakis | if db_value != qh_value:
|
96 | ccfbf77b | Christos Stavrakakis | data = (user, resource, db_value, qh_value) |
97 | 629acc65 | Giorgos Korfiatis | unsynced.append(data) |
98 | 629acc65 | Giorgos Korfiatis | |
99 | ccfbf77b | Christos Stavrakakis | headers = ("User", "Resource", "Database", "Quotaholder") |
100 | 600a3d4d | Christos Stavrakakis | if unsynced:
|
101 | 600a3d4d | Christos Stavrakakis | pprint_table(self.stderr, unsynced, headers)
|
102 | ccfbf77b | Christos Stavrakakis | if options["fix"]: |
103 | ccfbf77b | Christos Stavrakakis | qh = quotas.Quotaholder.get() |
104 | ccfbf77b | Christos Stavrakakis | request = {} |
105 | ccfbf77b | Christos Stavrakakis | request["force"] = options["force"] |
106 | ccfbf77b | Christos Stavrakakis | request["auto_accept"] = True |
107 | ccfbf77b | Christos Stavrakakis | request["provisions"] = map(create_provision, unsynced) |
108 | ccfbf77b | Christos Stavrakakis | qh.issue_commission(ASTAKOS_TOKEN, request) |
109 | ccfbf77b | Christos Stavrakakis | else:
|
110 | ccfbf77b | Christos Stavrakakis | write("Everything in sync.\n")
|
111 | ccfbf77b | Christos Stavrakakis | |
112 | ccfbf77b | Christos Stavrakakis | |
113 | ccfbf77b | Christos Stavrakakis | def create_provision(provision_info): |
114 | ccfbf77b | Christos Stavrakakis | user, resource, db_value, qh_value = provision_info |
115 | ccfbf77b | Christos Stavrakakis | return {"holder": user, |
116 | ccfbf77b | Christos Stavrakakis | "source": quotas.DEFAULT_SOURCE,
|
117 | ccfbf77b | Christos Stavrakakis | "resource": resource,
|
118 | ccfbf77b | Christos Stavrakakis | "quantity": db_value - qh_value} |