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) |