Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / management / commands / service-import.py @ b6426ead

History | View | Annotate | Download (4.7 kB)

1
# Copyright 2013 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
from optparse import make_option
35

    
36
from django.db import transaction
37
from django.core.management.base import CommandError
38
from django.utils import simplejson as json
39

    
40
from astakos.im.register import add_service, add_resource, RegisterException
41
from snf_django.management.commands import SynnefoCommand
42
from astakos.im.models import Component
43
from ._common import read_from_file
44

    
45

    
46
class Command(SynnefoCommand):
47
    help = "Register services"
48

    
49
    option_list = SynnefoCommand.option_list + (
50
        make_option('--json',
51
                    dest='json',
52
                    metavar='<json.file>',
53
                    help="Load service definitions from a json file"),
54
    )
55

    
56
    @transaction.commit_on_success
57
    def handle(self, *args, **options):
58

    
59
        json_file = options['json']
60
        if not json_file:
61
            m = "Expecting option --json."
62
            raise CommandError(m)
63

    
64
        else:
65
            data = read_from_file(json_file)
66
            m = ('Input should be a JSON dict mapping service names '
67
                 'to definitions.')
68
            try:
69
                data = json.loads(data)
70
            except json.JSONDecodeError:
71
                raise CommandError(m)
72
            if not isinstance(data, dict):
73
                raise CommandError(m)
74
        self.add_services(data)
75

    
76
    def add_services(self, data):
77
        write = self.stderr.write
78
        output = []
79
        for name, service_dict in data.iteritems():
80
            try:
81
                component_name = service_dict['component']
82
                service_type = service_dict['type']
83
                endpoints = service_dict['endpoints']
84
            except KeyError:
85
                raise CommandError('Malformed service definition.')
86

    
87
            try:
88
                component = Component.objects.get(name=component_name)
89
            except Component.DoesNotExist:
90
                m = "Component '%s' is not registered." % component_name
91
                raise CommandError(m)
92

    
93
            try:
94
                existed = add_service(component, name, service_type, endpoints,
95
                                      out=self.stderr)
96
            except RegisterException as e:
97
                raise CommandError(e.message)
98

    
99
            m = "%s service %s.\n" % ("Updated" if existed else "Added", name)
100
            output.append(m)
101

    
102
            resources = service_dict.get('resources', {}).values()
103
            for resource in resources:
104
                if not isinstance(resource, dict):
105
                    raise CommandError("Malformed resource dict.")
106

    
107
                service_origin = resource.get('service_origin')
108
                if name != service_origin:
109
                    raise CommandError("service_origin mismatch.")
110
                try:
111
                    r, exists = add_resource(resource)
112
                except RegisterException as e:
113
                    raise CommandError(e.message)
114
                if exists:
115
                    m = "Resource '%s' updated in database.\n" % (r.name)
116
                else:
117
                    m = ("Resource '%s' created in database with unlimited "
118
                         "quota.\n" % (r.name))
119
                output.append(m)
120

    
121
        for line in output:
122
            write(line)