Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.7 kB)

1 b1ea24f3 Giorgos Korfiatis
# Copyright 2013 GRNET S.A. All rights reserved.
2 b1ea24f3 Giorgos Korfiatis
#
3 b1ea24f3 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 b1ea24f3 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 b1ea24f3 Giorgos Korfiatis
# conditions are met:
6 b1ea24f3 Giorgos Korfiatis
#
7 b1ea24f3 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 b1ea24f3 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 b1ea24f3 Giorgos Korfiatis
#      disclaimer.
10 b1ea24f3 Giorgos Korfiatis
#
11 b1ea24f3 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 b1ea24f3 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 b1ea24f3 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 b1ea24f3 Giorgos Korfiatis
#      provided with the distribution.
15 b1ea24f3 Giorgos Korfiatis
#
16 b1ea24f3 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 b1ea24f3 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 b1ea24f3 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 b1ea24f3 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 b1ea24f3 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 b1ea24f3 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 b1ea24f3 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 b1ea24f3 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 b1ea24f3 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 b1ea24f3 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 b1ea24f3 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 b1ea24f3 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 b1ea24f3 Giorgos Korfiatis
#
29 b1ea24f3 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 b1ea24f3 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 b1ea24f3 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 b1ea24f3 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 b1ea24f3 Giorgos Korfiatis
34 b1ea24f3 Giorgos Korfiatis
from optparse import make_option
35 b1ea24f3 Giorgos Korfiatis
36 b1ea24f3 Giorgos Korfiatis
from django.core.management.base import BaseCommand, CommandError
37 b1ea24f3 Giorgos Korfiatis
from django.db.utils import IntegrityError
38 b1ea24f3 Giorgos Korfiatis
from django.utils import simplejson as json
39 b1ea24f3 Giorgos Korfiatis
40 b830f774 Giorgos Korfiatis
from snf_django.lib.db.transaction import commit_on_success_strict
41 9747707e Giorgos Korfiatis
from astakos.im.resources import add_resource
42 3a527b3a Giorgos Korfiatis
from astakos.im.models import Service
43 b1ea24f3 Giorgos Korfiatis
44 b1ea24f3 Giorgos Korfiatis
45 b1ea24f3 Giorgos Korfiatis
class Command(BaseCommand):
46 781c7b4b Giorgos Korfiatis
    help = "Register service resources"
47 b1ea24f3 Giorgos Korfiatis
48 b1ea24f3 Giorgos Korfiatis
    option_list = BaseCommand.option_list + (
49 b1ea24f3 Giorgos Korfiatis
        make_option('--json',
50 b1ea24f3 Giorgos Korfiatis
                    dest='json',
51 b1ea24f3 Giorgos Korfiatis
                    metavar='<json.file>',
52 781c7b4b Giorgos Korfiatis
                    help="Load resource definitions from a json file"),
53 b1ea24f3 Giorgos Korfiatis
    )
54 b1ea24f3 Giorgos Korfiatis
55 b1ea24f3 Giorgos Korfiatis
    def handle(self, *args, **options):
56 b1ea24f3 Giorgos Korfiatis
57 b1ea24f3 Giorgos Korfiatis
        json_file = options['json']
58 781c7b4b Giorgos Korfiatis
        if not json_file:
59 781c7b4b Giorgos Korfiatis
            m = "Expecting option --json."
60 9747707e Giorgos Korfiatis
            raise CommandError(m)
61 9747707e Giorgos Korfiatis
62 781c7b4b Giorgos Korfiatis
        else:
63 b1ea24f3 Giorgos Korfiatis
            with open(json_file) as file_data:
64 3a527b3a Giorgos Korfiatis
                m = ('Input should be a JSON dict containing "service" '
65 3a527b3a Giorgos Korfiatis
                     'and "resource" keys.')
66 3a527b3a Giorgos Korfiatis
                try:
67 3a527b3a Giorgos Korfiatis
                    data = json.load(file_data)
68 3a527b3a Giorgos Korfiatis
                except json.JSONDecodeError:
69 9747707e Giorgos Korfiatis
                    raise CommandError(m)
70 3a527b3a Giorgos Korfiatis
                if not isinstance(data, dict):
71 3a527b3a Giorgos Korfiatis
                    raise CommandError(m)
72 3a527b3a Giorgos Korfiatis
                else:
73 3a527b3a Giorgos Korfiatis
                    try:
74 3a527b3a Giorgos Korfiatis
                        service = data['service']
75 3a527b3a Giorgos Korfiatis
                        resources = data['resources']
76 3a527b3a Giorgos Korfiatis
                    except KeyError:
77 3a527b3a Giorgos Korfiatis
                        raise CommandError(m)
78 9747707e Giorgos Korfiatis
79 3a527b3a Giorgos Korfiatis
        self.add_resources(service, resources)
80 9747707e Giorgos Korfiatis
81 9747707e Giorgos Korfiatis
82 9747707e Giorgos Korfiatis
    @commit_on_success_strict()
83 3a527b3a Giorgos Korfiatis
    def add_resources(self, service, resources):
84 3a527b3a Giorgos Korfiatis
85 3a527b3a Giorgos Korfiatis
        try:
86 3a527b3a Giorgos Korfiatis
            s = Service.objects.get(name=service)
87 3a527b3a Giorgos Korfiatis
        except Service.DoesNotExist:
88 3a527b3a Giorgos Korfiatis
            raise CommandError("Service '%s' is not registered." % (service))
89 3a527b3a Giorgos Korfiatis
90 9747707e Giorgos Korfiatis
        for resource in resources:
91 3a527b3a Giorgos Korfiatis
            if not isinstance(resource, dict):
92 3a527b3a Giorgos Korfiatis
                raise CommandError("Malformed resource dict.")
93 73c02f75 Giorgos Korfiatis
            r, exists = add_resource(s, resource)
94 73c02f75 Giorgos Korfiatis
            name = r.name
95 3a527b3a Giorgos Korfiatis
            if exists:
96 3a527b3a Giorgos Korfiatis
                m = "Resource '%s' updated in database.\n" % (name)
97 3a527b3a Giorgos Korfiatis
            else:
98 3a527b3a Giorgos Korfiatis
                m = ("Resource '%s' created in database with default "
99 3a527b3a Giorgos Korfiatis
                     "quota limit 0.\n" % (name))
100 3a527b3a Giorgos Korfiatis
            self.stdout.write(m)