Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / project-control.py @ 42f0a495

History | View | Annotate | Download (5.8 kB)

1 f557d10a Giorgos Korfiatis
# Copyright 2012, 2013 GRNET S.A. All rights reserved.
2 7eadc230 Giorgos Korfiatis
#
3 7eadc230 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 7eadc230 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 7eadc230 Giorgos Korfiatis
# conditions are met:
6 7eadc230 Giorgos Korfiatis
#
7 7eadc230 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 7eadc230 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 7eadc230 Giorgos Korfiatis
#      disclaimer.
10 7eadc230 Giorgos Korfiatis
#
11 7eadc230 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 7eadc230 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 7eadc230 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 7eadc230 Giorgos Korfiatis
#      provided with the distribution.
15 7eadc230 Giorgos Korfiatis
#
16 7eadc230 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7eadc230 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7eadc230 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7eadc230 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7eadc230 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7eadc230 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7eadc230 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7eadc230 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7eadc230 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7eadc230 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7eadc230 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7eadc230 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 7eadc230 Giorgos Korfiatis
#
29 7eadc230 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 7eadc230 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 7eadc230 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 7eadc230 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 7eadc230 Giorgos Korfiatis
34 7eadc230 Giorgos Korfiatis
from optparse import make_option
35 7eadc230 Giorgos Korfiatis
36 f557d10a Giorgos Korfiatis
from django.core.management.base import BaseCommand, CommandError
37 f557d10a Giorgos Korfiatis
from astakos.im.functions import (terminate, suspend, resume, check_expiration,
38 f557d10a Giorgos Korfiatis
                                  approve_application, deny_application)
39 39b2cb50 Giorgos Korfiatis
from synnefo.lib.db.transaction import commit_on_success_strict
40 7eadc230 Giorgos Korfiatis
41 f557d10a Giorgos Korfiatis
42 7eadc230 Giorgos Korfiatis
class Command(BaseCommand):
43 f557d10a Giorgos Korfiatis
    help = "Manage projects and applications"
44 7eadc230 Giorgos Korfiatis
45 7eadc230 Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
46 f557d10a Giorgos Korfiatis
        make_option('--approve',
47 f557d10a Giorgos Korfiatis
                    dest='approve',
48 f557d10a Giorgos Korfiatis
                    metavar='<application id>',
49 f557d10a Giorgos Korfiatis
                    help="Approve a project application"),
50 f557d10a Giorgos Korfiatis
        make_option('--deny',
51 f557d10a Giorgos Korfiatis
                    dest='deny',
52 f557d10a Giorgos Korfiatis
                    metavar='<application id>',
53 f557d10a Giorgos Korfiatis
                    help="Deny a project application"),
54 f557d10a Giorgos Korfiatis
        make_option('--terminate',
55 f557d10a Giorgos Korfiatis
                    dest='terminate',
56 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
57 f557d10a Giorgos Korfiatis
                    help="Terminate a project"),
58 f557d10a Giorgos Korfiatis
        make_option('--suspend',
59 f557d10a Giorgos Korfiatis
                    dest='suspend',
60 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
61 f557d10a Giorgos Korfiatis
                    help="Suspend a project"),
62 f557d10a Giorgos Korfiatis
        make_option('--unsuspend',
63 f557d10a Giorgos Korfiatis
                    dest='resume',
64 f557d10a Giorgos Korfiatis
                    metavar='<project id>',
65 f557d10a Giorgos Korfiatis
                    help="Resume a suspended project"),
66 c69462a4 Giorgos Korfiatis
        make_option('--check-expired',
67 7eadc230 Giorgos Korfiatis
                    action='store_true',
68 f557d10a Giorgos Korfiatis
                    dest='check_expired',
69 7eadc230 Giorgos Korfiatis
                    default=False,
70 7eadc230 Giorgos Korfiatis
                    help="Check projects for expiration"),
71 f557d10a Giorgos Korfiatis
        make_option('--terminate-expired',
72 7eadc230 Giorgos Korfiatis
                    action='store_true',
73 f557d10a Giorgos Korfiatis
                    dest='terminate_expired',
74 7eadc230 Giorgos Korfiatis
                    default=False,
75 f557d10a Giorgos Korfiatis
                    help="Terminate all expired projects"),
76 2b745492 Giorgos Korfiatis
        make_option('--message', '-m',
77 2b745492 Giorgos Korfiatis
                    dest='message',
78 2b745492 Giorgos Korfiatis
                    metavar='<msg>',
79 2b745492 Giorgos Korfiatis
                    help=("Specify reason of action, "
80 2b745492 Giorgos Korfiatis
                          "e.g. when denying a project")),
81 7eadc230 Giorgos Korfiatis
    )
82 7eadc230 Giorgos Korfiatis
83 f557d10a Giorgos Korfiatis
    def handle(self, *args, **options):
84 f557d10a Giorgos Korfiatis
85 2b745492 Giorgos Korfiatis
        message = options['message']
86 2b745492 Giorgos Korfiatis
87 f557d10a Giorgos Korfiatis
        pid = options['terminate']
88 f557d10a Giorgos Korfiatis
        if pid is not None:
89 f557d10a Giorgos Korfiatis
            self.run_command(terminate, pid)
90 f557d10a Giorgos Korfiatis
            return
91 f557d10a Giorgos Korfiatis
92 f557d10a Giorgos Korfiatis
        pid = options['resume']
93 f557d10a Giorgos Korfiatis
        if pid is not None:
94 f557d10a Giorgos Korfiatis
            self.run_command(resume, pid)
95 f557d10a Giorgos Korfiatis
            return
96 f557d10a Giorgos Korfiatis
97 f557d10a Giorgos Korfiatis
        pid = options['suspend']
98 f557d10a Giorgos Korfiatis
        if pid is not None:
99 f557d10a Giorgos Korfiatis
            self.run_command(suspend, pid)
100 f557d10a Giorgos Korfiatis
            return
101 f557d10a Giorgos Korfiatis
102 f557d10a Giorgos Korfiatis
        appid = options['approve']
103 f557d10a Giorgos Korfiatis
        if appid is not None:
104 f557d10a Giorgos Korfiatis
            self.run_command(approve_application, appid)
105 f557d10a Giorgos Korfiatis
            return
106 f557d10a Giorgos Korfiatis
107 f557d10a Giorgos Korfiatis
        appid = options['deny']
108 f557d10a Giorgos Korfiatis
        if appid is not None:
109 2b745492 Giorgos Korfiatis
            self.run_command(deny_application, appid, message)
110 f557d10a Giorgos Korfiatis
            return
111 f557d10a Giorgos Korfiatis
112 f557d10a Giorgos Korfiatis
        if options['check_expired']:
113 f557d10a Giorgos Korfiatis
            self.expire(execute=False)
114 f557d10a Giorgos Korfiatis
            return
115 f557d10a Giorgos Korfiatis
116 f557d10a Giorgos Korfiatis
        if options['terminate_expired']:
117 f557d10a Giorgos Korfiatis
            self.expire(execute=True)
118 f557d10a Giorgos Korfiatis
119 2c7c0756 Giorgos Korfiatis
    def run_command(self, func, *args):
120 39b2cb50 Giorgos Korfiatis
        @commit_on_success_strict()
121 39b2cb50 Giorgos Korfiatis
        def inner():
122 2c7c0756 Giorgos Korfiatis
            try:
123 2c7c0756 Giorgos Korfiatis
                func(*args)
124 2c7c0756 Giorgos Korfiatis
            except BaseException as e:
125 2c7c0756 Giorgos Korfiatis
                raise CommandError(e)
126 39b2cb50 Giorgos Korfiatis
        inner()
127 7eadc230 Giorgos Korfiatis
128 7eadc230 Giorgos Korfiatis
    def print_expired(self, projects, execute):
129 7eadc230 Giorgos Korfiatis
        length = len(projects)
130 7eadc230 Giorgos Korfiatis
        if length == 0:
131 7eadc230 Giorgos Korfiatis
            s = 'No expired projects.\n'
132 7eadc230 Giorgos Korfiatis
        elif length == 1:
133 7eadc230 Giorgos Korfiatis
            s = '1 expired project:\n'
134 7eadc230 Giorgos Korfiatis
        else:
135 f557d10a Giorgos Korfiatis
            s = '%d expired projects:\n' % (length,)
136 7eadc230 Giorgos Korfiatis
        self.stdout.write(s)
137 7eadc230 Giorgos Korfiatis
138 7eadc230 Giorgos Korfiatis
        if length > 0:
139 7eadc230 Giorgos Korfiatis
            labels = ('Project', 'Name', 'Status', 'Expiration date')
140 7eadc230 Giorgos Korfiatis
            columns = (10, 30, 14, 30)
141 7eadc230 Giorgos Korfiatis
142 7eadc230 Giorgos Korfiatis
            line = ' '.join(l.rjust(w) for l, w in zip(labels, columns))
143 7eadc230 Giorgos Korfiatis
            self.stdout.write(line + '\n')
144 7eadc230 Giorgos Korfiatis
            sep = '-' * len(line)
145 7eadc230 Giorgos Korfiatis
            self.stdout.write(sep + '\n')
146 7eadc230 Giorgos Korfiatis
147 7eadc230 Giorgos Korfiatis
            for project in projects:
148 7eadc230 Giorgos Korfiatis
                line = ' '.join(f.rjust(w) for f, w in zip(project, columns))
149 06d7c286 Sofia Papagiannaki
                self.stdout.write(line + '\n')
150 7eadc230 Giorgos Korfiatis
151 7eadc230 Giorgos Korfiatis
            if execute:
152 f557d10a Giorgos Korfiatis
                self.stdout.write('%d projects have been terminated.\n' % (
153 f557d10a Giorgos Korfiatis
                    length,))
154 7eadc230 Giorgos Korfiatis
155 39b2cb50 Giorgos Korfiatis
    @commit_on_success_strict()
156 8cf9b2dd Giorgos Korfiatis
    def expire(self, execute=False, ctx=None):
157 7eadc230 Giorgos Korfiatis
        try:
158 8cf9b2dd Giorgos Korfiatis
            projects = check_expiration(execute=execute)
159 8cf9b2dd Giorgos Korfiatis
            self.print_expired(projects, execute)
160 7eadc230 Giorgos Korfiatis
        except BaseException as e:
161 8cf9b2dd Giorgos Korfiatis
            if ctx:
162 8cf9b2dd Giorgos Korfiatis
                ctx.mark_rollback()
163 7eadc230 Giorgos Korfiatis
            raise CommandError(e)