Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / resource-modify.py @ a6d167c1

History | View | Annotate | Download (5.2 kB)

1 bf644f91 Giorgos Korfiatis
# Copyright 2013, 2014 GRNET S.A. All rights reserved.
2 720955ff Giorgos Korfiatis
#
3 720955ff Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 720955ff Giorgos Korfiatis
# without modification, are permitted provided that the following
5 720955ff Giorgos Korfiatis
# conditions are met:
6 720955ff Giorgos Korfiatis
#
7 720955ff Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 720955ff Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 720955ff Giorgos Korfiatis
#      disclaimer.
10 720955ff Giorgos Korfiatis
#
11 720955ff Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 720955ff Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 720955ff Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 720955ff Giorgos Korfiatis
#      provided with the distribution.
15 720955ff Giorgos Korfiatis
#
16 720955ff Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 720955ff Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 720955ff Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 720955ff Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 720955ff Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 720955ff Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 720955ff Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 720955ff Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 720955ff Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 720955ff Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 720955ff Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 720955ff Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 720955ff Giorgos Korfiatis
#
29 720955ff Giorgos Korfiatis
# The views and conclusions contained in the software and
30 720955ff Giorgos Korfiatis
# documentation are those of the authors and should not be
31 720955ff Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 720955ff Giorgos Korfiatis
# or implied, of GRNET S.A.
33 720955ff Giorgos Korfiatis
34 720955ff Giorgos Korfiatis
from optparse import make_option
35 a6d167c1 Giorgos Korfiatis
from snf_django.management.commands import SynnefoCommand, CommandError
36 720955ff Giorgos Korfiatis
37 d758784b Christos Stavrakakis
from snf_django.management import utils
38 720955ff Giorgos Korfiatis
from astakos.im.models import Resource
39 bf644f91 Giorgos Korfiatis
from astakos.im import register
40 bf644f91 Giorgos Korfiatis
from ._common import style_options, check_style, units
41 720955ff Giorgos Korfiatis
42 720955ff Giorgos Korfiatis
43 a6d167c1 Giorgos Korfiatis
class Command(SynnefoCommand):
44 720955ff Giorgos Korfiatis
    args = "<resource name>"
45 ba8c50e5 Giorgos Korfiatis
    help = "Modify a resource's quota defaults and boolean flags."
46 720955ff Giorgos Korfiatis
47 a6d167c1 Giorgos Korfiatis
    option_list = SynnefoCommand.option_list + (
48 bf644f91 Giorgos Korfiatis
        make_option('--base-default',
49 d61d6007 Giorgos Korfiatis
                    metavar='<limit>',
50 ba8c50e5 Giorgos Korfiatis
                    help="Specify default quota for base projects"),
51 ba8c50e5 Giorgos Korfiatis
        make_option('--project-default',
52 ba8c50e5 Giorgos Korfiatis
                    metavar='<limit>',
53 ba8c50e5 Giorgos Korfiatis
                    help="Specify default quota for non-base projects"),
54 44f510e1 Giorgos Korfiatis
        make_option('--unit-style',
55 44f510e1 Giorgos Korfiatis
                    default='mb',
56 44f510e1 Giorgos Korfiatis
                    help=("Specify display unit for resource values "
57 44f510e1 Giorgos Korfiatis
                          "(one of %s); defaults to mb") % style_options),
58 2dc27ac1 Giorgos Korfiatis
        make_option('--api-visible',
59 a0fcfb35 Giorgos Korfiatis
                    metavar='True|False',
60 2dc27ac1 Giorgos Korfiatis
                    help="Control visibility of this resource in the API"),
61 2dc27ac1 Giorgos Korfiatis
        make_option('--ui-visible',
62 2dc27ac1 Giorgos Korfiatis
                    metavar='True|False',
63 2dc27ac1 Giorgos Korfiatis
                    help="Control visibility of this resource in the UI"),
64 720955ff Giorgos Korfiatis
    )
65 720955ff Giorgos Korfiatis
66 720955ff Giorgos Korfiatis
    def handle(self, *args, **options):
67 3a527b3a Giorgos Korfiatis
        resource_name = args[0] if len(args) > 0 else None
68 bf644f91 Giorgos Korfiatis
        if resource_name is None:
69 bf644f91 Giorgos Korfiatis
            raise CommandError("Please provide a resource name.")
70 bf644f91 Giorgos Korfiatis
        resource = self.get_resource(resource_name)
71 3a527b3a Giorgos Korfiatis
72 3a527b3a Giorgos Korfiatis
        actions = {
73 bf644f91 Giorgos Korfiatis
            'base_default': self.change_base_default,
74 ba8c50e5 Giorgos Korfiatis
            'project_default': self.change_project_default,
75 2dc27ac1 Giorgos Korfiatis
            'api_visible': self.set_api_visible,
76 2dc27ac1 Giorgos Korfiatis
            'ui_visible': self.set_ui_visible,
77 3a527b3a Giorgos Korfiatis
        }
78 3a527b3a Giorgos Korfiatis
79 3a527b3a Giorgos Korfiatis
        opts = [(key, value)
80 3a527b3a Giorgos Korfiatis
                for (key, value) in options.items()
81 3a527b3a Giorgos Korfiatis
                if key in actions and value is not None]
82 3a527b3a Giorgos Korfiatis
83 44f510e1 Giorgos Korfiatis
        self.unit_style = options['unit_style']
84 44f510e1 Giorgos Korfiatis
        check_style(self.unit_style)
85 3a527b3a Giorgos Korfiatis
86 bf644f91 Giorgos Korfiatis
        for key, value in opts:
87 bf644f91 Giorgos Korfiatis
            action = actions[key]
88 bf644f91 Giorgos Korfiatis
            action(resource, value)
89 2dc27ac1 Giorgos Korfiatis
90 bf644f91 Giorgos Korfiatis
    def set_api_visible(self, resource, allow):
91 2dc27ac1 Giorgos Korfiatis
        try:
92 2dc27ac1 Giorgos Korfiatis
            allow = utils.parse_bool(allow)
93 2dc27ac1 Giorgos Korfiatis
        except ValueError:
94 2dc27ac1 Giorgos Korfiatis
            raise CommandError("Expecting a boolean value.")
95 2dc27ac1 Giorgos Korfiatis
        resource.api_visible = allow
96 2dc27ac1 Giorgos Korfiatis
        if not allow and resource.ui_visible:
97 d9a7f0bb Giorgos Korfiatis
            self.stderr.write("Also resetting 'ui_visible' for consistency.\n")
98 2dc27ac1 Giorgos Korfiatis
            resource.ui_visible = False
99 2dc27ac1 Giorgos Korfiatis
        resource.save()
100 2dc27ac1 Giorgos Korfiatis
101 bf644f91 Giorgos Korfiatis
    def set_ui_visible(self, resource, allow):
102 a0fcfb35 Giorgos Korfiatis
        try:
103 a0fcfb35 Giorgos Korfiatis
            allow = utils.parse_bool(allow)
104 a0fcfb35 Giorgos Korfiatis
        except ValueError:
105 a0fcfb35 Giorgos Korfiatis
            raise CommandError("Expecting a boolean value.")
106 2dc27ac1 Giorgos Korfiatis
        resource.ui_visible = allow
107 2dc27ac1 Giorgos Korfiatis
        if allow and not resource.api_visible:
108 d9a7f0bb Giorgos Korfiatis
            self.stderr.write("Also setting 'api_visible' for consistency.\n")
109 2dc27ac1 Giorgos Korfiatis
            resource.api_visible = True
110 a0fcfb35 Giorgos Korfiatis
        resource.save()
111 a0fcfb35 Giorgos Korfiatis
112 3a527b3a Giorgos Korfiatis
    def get_resource(self, resource_name):
113 3a527b3a Giorgos Korfiatis
        try:
114 c7e03d20 Giorgos Korfiatis
            return Resource.objects.select_for_update().get(name=resource_name)
115 3a527b3a Giorgos Korfiatis
        except Resource.DoesNotExist:
116 3a527b3a Giorgos Korfiatis
            raise CommandError("Resource %s does not exist."
117 3a527b3a Giorgos Korfiatis
                               % resource_name)
118 3a527b3a Giorgos Korfiatis
119 bf644f91 Giorgos Korfiatis
    def change_base_default(self, resource, limit):
120 bf644f91 Giorgos Korfiatis
        limit = self.parse_limit(limit)
121 bf644f91 Giorgos Korfiatis
        register.update_base_default(resource, limit)
122 f72ba65d Giorgos Korfiatis
123 ba8c50e5 Giorgos Korfiatis
    def change_project_default(self, resource, limit):
124 ba8c50e5 Giorgos Korfiatis
        limit = self.parse_limit(limit)
125 ba8c50e5 Giorgos Korfiatis
        register.update_project_default(resource, limit)
126 ba8c50e5 Giorgos Korfiatis
127 f72ba65d Giorgos Korfiatis
    def parse_limit(self, limit):
128 f72ba65d Giorgos Korfiatis
        try:
129 bf644f91 Giorgos Korfiatis
            return units.parse(limit)
130 f72ba65d Giorgos Korfiatis
        except units.ParseError:
131 bf644f91 Giorgos Korfiatis
            m = ("Quota limit should be an integer, "
132 bf644f91 Giorgos Korfiatis
                 "optionally followed by a unit, or 'inf'.")
133 f72ba65d Giorgos Korfiatis
            raise CommandError(m)