Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.7 kB)

1 720955ff Giorgos Korfiatis
# Copyright 2013 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 720955ff Giorgos Korfiatis
from django.core.management.base import BaseCommand, CommandError
36 3a527b3a Giorgos Korfiatis
from django.utils import simplejson as json
37 720955ff Giorgos Korfiatis
38 720955ff Giorgos Korfiatis
from astakos.im.models import Resource
39 720955ff Giorgos Korfiatis
from astakos.im.resources import update_resource
40 720955ff Giorgos Korfiatis
41 720955ff Giorgos Korfiatis
42 720955ff Giorgos Korfiatis
class Command(BaseCommand):
43 720955ff Giorgos Korfiatis
    args = "<resource name>"
44 3a527b3a Giorgos Korfiatis
    help = ("Modify a resource (currently only change the default base quota)."
45 3a527b3a Giorgos Korfiatis
            "\nIf no resource is specified, all resources are considered.")
46 720955ff Giorgos Korfiatis
47 720955ff Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
48 720955ff Giorgos Korfiatis
        make_option('--limit',
49 720955ff Giorgos Korfiatis
                    dest='limit',
50 3a527b3a Giorgos Korfiatis
                    help="Specify default base quota"),
51 3a527b3a Giorgos Korfiatis
        make_option('--interactive',
52 3a527b3a Giorgos Korfiatis
                    action='store_true',
53 3a527b3a Giorgos Korfiatis
                    dest='interactive',
54 3a527b3a Giorgos Korfiatis
                    default=None,
55 3a527b3a Giorgos Korfiatis
                    help="Prompt user to change default base quotas"),
56 3a527b3a Giorgos Korfiatis
        make_option('--from-file',
57 3a527b3a Giorgos Korfiatis
                    dest='from_file',
58 3a527b3a Giorgos Korfiatis
                    metavar='<limits_file.json>',
59 3a527b3a Giorgos Korfiatis
                    help="Read default base quotas from a json file"),
60 720955ff Giorgos Korfiatis
    )
61 720955ff Giorgos Korfiatis
62 720955ff Giorgos Korfiatis
    def handle(self, *args, **options):
63 3a527b3a Giorgos Korfiatis
        resource_name = args[0] if len(args) > 0 else None
64 3a527b3a Giorgos Korfiatis
65 3a527b3a Giorgos Korfiatis
        actions = {
66 3a527b3a Giorgos Korfiatis
            'limit': self.change_limit,
67 3a527b3a Giorgos Korfiatis
            'interactive': self.change_interactive,
68 3a527b3a Giorgos Korfiatis
            'from_file': self.change_from_file,
69 3a527b3a Giorgos Korfiatis
        }
70 3a527b3a Giorgos Korfiatis
71 3a527b3a Giorgos Korfiatis
        opts = [(key, value)
72 3a527b3a Giorgos Korfiatis
                for (key, value) in options.items()
73 3a527b3a Giorgos Korfiatis
                if key in actions and value is not None]
74 3a527b3a Giorgos Korfiatis
75 3a527b3a Giorgos Korfiatis
        if len(opts) != 1:
76 3a527b3a Giorgos Korfiatis
            raise CommandError("Please provide exactly one option.")
77 3a527b3a Giorgos Korfiatis
78 3a527b3a Giorgos Korfiatis
        key, value = opts[0]
79 3a527b3a Giorgos Korfiatis
        action = actions[key]
80 3a527b3a Giorgos Korfiatis
        action(resource_name, value)
81 3a527b3a Giorgos Korfiatis
82 3a527b3a Giorgos Korfiatis
    def get_resource(self, resource_name):
83 3a527b3a Giorgos Korfiatis
        try:
84 3a527b3a Giorgos Korfiatis
            return Resource.objects.get_for_update(name=resource_name)
85 3a527b3a Giorgos Korfiatis
        except Resource.DoesNotExist:
86 3a527b3a Giorgos Korfiatis
            raise CommandError("Resource %s does not exist."
87 3a527b3a Giorgos Korfiatis
                               % resource_name)
88 3a527b3a Giorgos Korfiatis
89 3a527b3a Giorgos Korfiatis
    def change_limit(self, resource_name, limit):
90 3a527b3a Giorgos Korfiatis
        if resource_name is None:
91 720955ff Giorgos Korfiatis
            raise CommandError("Please provide a resource name.")
92 720955ff Giorgos Korfiatis
93 3a527b3a Giorgos Korfiatis
        resource = self.get_resource(resource_name)
94 3a527b3a Giorgos Korfiatis
        self.change_resource_limit(resource, limit)
95 720955ff Giorgos Korfiatis
96 3a527b3a Giorgos Korfiatis
    def change_from_file(self, resource_name, filename):
97 3a527b3a Giorgos Korfiatis
        with open(filename) as file_data:
98 3a527b3a Giorgos Korfiatis
            try:
99 3a527b3a Giorgos Korfiatis
                config = json.load(file_data)
100 3a527b3a Giorgos Korfiatis
            except json.JSONDecodeError:
101 3a527b3a Giorgos Korfiatis
                raise CommandError("Malformed JSON file.")
102 3a527b3a Giorgos Korfiatis
            if not isinstance(config, dict):
103 3a527b3a Giorgos Korfiatis
                raise CommandError("Malformed JSON file.")
104 3a527b3a Giorgos Korfiatis
            self.change_with_conf(resource_name, config)
105 720955ff Giorgos Korfiatis
106 3a527b3a Giorgos Korfiatis
    def change_with_conf(self, resource_name, config):
107 3a527b3a Giorgos Korfiatis
        if resource_name is None:
108 3a527b3a Giorgos Korfiatis
            resources = Resource.objects.all().select_for_update()
109 3a527b3a Giorgos Korfiatis
        else:
110 3a527b3a Giorgos Korfiatis
            resources = [self.get_resource(resource_name)]
111 3a527b3a Giorgos Korfiatis
112 3a527b3a Giorgos Korfiatis
        for resource in resources:
113 3a527b3a Giorgos Korfiatis
            limit = config.get(resource.name)
114 3a527b3a Giorgos Korfiatis
            if limit is not None:
115 3a527b3a Giorgos Korfiatis
                self.change_resource_limit(resource, limit)
116 3a527b3a Giorgos Korfiatis
117 3a527b3a Giorgos Korfiatis
    def change_interactive(self, resource_name, _placeholder):
118 3a527b3a Giorgos Korfiatis
        if resource_name is None:
119 3a527b3a Giorgos Korfiatis
            resources = Resource.objects.all().select_for_update()
120 3a527b3a Giorgos Korfiatis
        else:
121 3a527b3a Giorgos Korfiatis
            resources = [self.get_resource(resource_name)]
122 3a527b3a Giorgos Korfiatis
123 3a527b3a Giorgos Korfiatis
        for resource in resources:
124 3a527b3a Giorgos Korfiatis
            self.stdout.write("Resource '%s' (%s)\n" %
125 3a527b3a Giorgos Korfiatis
                              (resource.name, resource.desc))
126 3a527b3a Giorgos Korfiatis
            unit = (" in %s" % resource.unit) if resource.unit else ""
127 3a527b3a Giorgos Korfiatis
            self.stdout.write("Current limit%s: %s\n"
128 3a527b3a Giorgos Korfiatis
                              % (unit, resource.uplimit))
129 3a527b3a Giorgos Korfiatis
            while True:
130 3a527b3a Giorgos Korfiatis
                self.stdout.write("New limit%s (leave blank to keep current): "
131 3a527b3a Giorgos Korfiatis
                                  % (unit))
132 3a527b3a Giorgos Korfiatis
                response = raw_input()
133 3a527b3a Giorgos Korfiatis
                if response == "":
134 3a527b3a Giorgos Korfiatis
                    break
135 3a527b3a Giorgos Korfiatis
                else:
136 3a527b3a Giorgos Korfiatis
                    try:
137 3a527b3a Giorgos Korfiatis
                        value = int(response)
138 3a527b3a Giorgos Korfiatis
                    except ValueError:
139 3a527b3a Giorgos Korfiatis
                        continue
140 3a527b3a Giorgos Korfiatis
                    update_resource(resource, value)
141 3a527b3a Giorgos Korfiatis
                    break
142 3a527b3a Giorgos Korfiatis
143 3a527b3a Giorgos Korfiatis
    def change_resource_limit(self, resource, limit):
144 720955ff Giorgos Korfiatis
        try:
145 720955ff Giorgos Korfiatis
            limit = int(limit)
146 720955ff Giorgos Korfiatis
        except:
147 720955ff Giorgos Korfiatis
            raise CommandError("Limit should be an integer.")
148 3a527b3a Giorgos Korfiatis
        update_resource(resource, limit)