Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / backend-add.py @ 7cfbbf32

History | View | Annotate | Download (6.5 kB)

1 1a894bfe Christos Stavrakakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 1a894bfe Christos Stavrakakis
#
3 1a894bfe Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
4 1a894bfe Christos Stavrakakis
# modification, are permitted provided that the following conditions
5 1a894bfe Christos Stavrakakis
# are met:
6 1a894bfe Christos Stavrakakis
#
7 1a894bfe Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
8 1a894bfe Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
9 1a894bfe Christos Stavrakakis
#
10 1a894bfe Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
11 1a894bfe Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
12 1a894bfe Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
13 1a894bfe Christos Stavrakakis
#
14 1a894bfe Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 1a894bfe Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 1a894bfe Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 1a894bfe Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 1a894bfe Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 1a894bfe Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 1a894bfe Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 1a894bfe Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 1a894bfe Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 1a894bfe Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 1a894bfe Christos Stavrakakis
# SUCH DAMAGE.
25 1a894bfe Christos Stavrakakis
#
26 1a894bfe Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
27 1a894bfe Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
28 1a894bfe Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
29 1a894bfe Christos Stavrakakis
#
30 1a894bfe Christos Stavrakakis
31 1a894bfe Christos Stavrakakis
from optparse import make_option
32 1a894bfe Christos Stavrakakis
from django.core.management.base import BaseCommand, CommandError
33 1a894bfe Christos Stavrakakis
34 e41977e2 Christos Stavrakakis
from synnefo.db.models import Backend, Network, BackendNetwork
35 1a894bfe Christos Stavrakakis
from django.db.utils import IntegrityError
36 b3d28af2 Christos Stavrakakis
from synnefo.logic.backend import (get_physical_resources,
37 b3d28af2 Christos Stavrakakis
                                   update_resources,
38 b3d28af2 Christos Stavrakakis
                                   create_client,
39 90b29b33 Christos Stavrakakis
                                   create_network_synced,
40 90b29b33 Christos Stavrakakis
                                   connect_network_synced)
41 1a894bfe Christos Stavrakakis
from synnefo.util.rapi import GanetiApiError
42 1a894bfe Christos Stavrakakis
43 1a894bfe Christos Stavrakakis
44 1a894bfe Christos Stavrakakis
class Command(BaseCommand):
45 1a894bfe Christos Stavrakakis
    can_import_settings = True
46 1a894bfe Christos Stavrakakis
47 1a894bfe Christos Stavrakakis
    help = 'Create a new backend.'
48 1a894bfe Christos Stavrakakis
    output_transaction = True  # The management command runs inside
49 1a894bfe Christos Stavrakakis
                               # an SQL transaction
50 1a894bfe Christos Stavrakakis
    option_list = BaseCommand.option_list + (
51 1a894bfe Christos Stavrakakis
        make_option('--clustername', dest='clustername'),
52 1a894bfe Christos Stavrakakis
        make_option('--port', dest='port', default=5080),
53 b3d28af2 Christos Stavrakakis
        make_option('--user', dest='username'),
54 b3d28af2 Christos Stavrakakis
        make_option('--pass', dest='password'),
55 1a894bfe Christos Stavrakakis
        make_option('--drained', action='store_true',
56 b3d28af2 Christos Stavrakakis
            dest='drained', default=False,
57 b3d28af2 Christos Stavrakakis
            help="Set as drained to exclude from allocations"),
58 1a894bfe Christos Stavrakakis
        make_option('--no-check', action='store_false',
59 b3d28af2 Christos Stavrakakis
            dest='check', default=True,
60 b3d28af2 Christos Stavrakakis
            help="Do not perform credentials check and resources update"),
61 b3d28af2 Christos Stavrakakis
        make_option('--no-init', action='store_false',
62 b3d28af2 Christos Stavrakakis
            dest='init', default=True,
63 b3d28af2 Christos Stavrakakis
            help="Do not perform initialization of the Backend Model")
64 1a894bfe Christos Stavrakakis
        )
65 1a894bfe Christos Stavrakakis
66 1a894bfe Christos Stavrakakis
    def handle(self, **options):
67 1a894bfe Christos Stavrakakis
        clustername = options['clustername']
68 b3d28af2 Christos Stavrakakis
        port = options['port']
69 e41977e2 Christos Stavrakakis
        username = options['username']
70 e41977e2 Christos Stavrakakis
        password = options['password']
71 1a894bfe Christos Stavrakakis
        drained = options['drained']
72 1a894bfe Christos Stavrakakis
73 1a894bfe Christos Stavrakakis
        if not (clustername and username and password):
74 b3d28af2 Christos Stavrakakis
            raise CommandError("Clustername, user and pass must be supplied")
75 1a894bfe Christos Stavrakakis
76 1a894bfe Christos Stavrakakis
        # Ensure correctness of credentials
77 1a894bfe Christos Stavrakakis
        if options['check']:
78 1a894bfe Christos Stavrakakis
            self.stdout.write('Checking connectivity and credentials.\n')
79 1a894bfe Christos Stavrakakis
            try:
80 1a894bfe Christos Stavrakakis
                client = create_client(clustername, port, username, password)
81 b3d28af2 Christos Stavrakakis
                # This command will raise an exception if there is no
82 b3d28af2 Christos Stavrakakis
                # write-access
83 1a894bfe Christos Stavrakakis
                client.ModifyCluster()
84 1a894bfe Christos Stavrakakis
            except GanetiApiError as e:
85 b3d28af2 Christos Stavrakakis
                self.stdout.write('Check failed:\n%s\n' % e)
86 1a894bfe Christos Stavrakakis
                return
87 1a894bfe Christos Stavrakakis
            else:
88 1a894bfe Christos Stavrakakis
                self.stdout.write('Check passed.\n')
89 1a894bfe Christos Stavrakakis
90 1a894bfe Christos Stavrakakis
        # Create the new backend in database
91 1a894bfe Christos Stavrakakis
        try:
92 1a894bfe Christos Stavrakakis
            backend = Backend.objects.create(clustername=clustername,
93 1a894bfe Christos Stavrakakis
                                             port=port,
94 1a894bfe Christos Stavrakakis
                                             username=username,
95 1a894bfe Christos Stavrakakis
                                             password=password,
96 1a894bfe Christos Stavrakakis
                                             drained=drained)
97 1a894bfe Christos Stavrakakis
        except IntegrityError as e:
98 b3d28af2 Christos Stavrakakis
            raise CommandError("Cannot create backend: %s\n" % e)
99 1a894bfe Christos Stavrakakis
100 b3d28af2 Christos Stavrakakis
        self.stdout.write('\nSuccessfully created backend with id %d\n' %
101 b3d28af2 Christos Stavrakakis
                          backend.id)
102 b3d28af2 Christos Stavrakakis
103 b3d28af2 Christos Stavrakakis
        if not options['check']:
104 b3d28af2 Christos Stavrakakis
            return
105 b3d28af2 Christos Stavrakakis
106 b3d28af2 Christos Stavrakakis
        self.stdout.write('\rRetrieving backend resources:\n')
107 b3d28af2 Christos Stavrakakis
        resources = get_physical_resources(backend)
108 b3d28af2 Christos Stavrakakis
        attr = ['mfree', 'mtotal', 'dfree', 'dtotal', 'pinst_cnt', 'ctotal']
109 b3d28af2 Christos Stavrakakis
        self.stdout.write('----------------------------\n')
110 b3d28af2 Christos Stavrakakis
        for a in attr:
111 b3d28af2 Christos Stavrakakis
            self.stdout.write(a.ljust(12) + ' : ' + str(resources[a]) + '\n')
112 b3d28af2 Christos Stavrakakis
        update_resources(backend, resources)
113 b3d28af2 Christos Stavrakakis
114 b3d28af2 Christos Stavrakakis
        if not options['init']:
115 b3d28af2 Christos Stavrakakis
            return
116 b3d28af2 Christos Stavrakakis
117 b3d28af2 Christos Stavrakakis
        networks = Network.objects.filter(deleted=False)
118 b3d28af2 Christos Stavrakakis
119 b3d28af2 Christos Stavrakakis
        self.stdout.write('\nCreating the follow networks:\n')
120 b3d28af2 Christos Stavrakakis
        fields = ('Name', 'Subnet', 'Gateway', 'Mac Prefix', 'Public')
121 b3d28af2 Christos Stavrakakis
        columns = (20, 16, 16, 16, 10)
122 b3d28af2 Christos Stavrakakis
        line = ' '.join(f.ljust(c) for f, c in zip(fields, columns))
123 b3d28af2 Christos Stavrakakis
        sep = '-' * len(line)
124 b3d28af2 Christos Stavrakakis
        self.stdout.write(sep + '\n')
125 b3d28af2 Christos Stavrakakis
        self.stdout.write(line + '\n')
126 b3d28af2 Christos Stavrakakis
        self.stdout.write(sep + '\n')
127 b3d28af2 Christos Stavrakakis
128 b3d28af2 Christos Stavrakakis
        for net in networks:
129 b3d28af2 Christos Stavrakakis
            fields = (net.backend_id, str(net.subnet), str(net.gateway),
130 b3d28af2 Christos Stavrakakis
                      str(net.mac_prefix), str(net.public))
131 b3d28af2 Christos Stavrakakis
            line = ' '.join(f.ljust(c) for f, c in zip(fields, columns))
132 b3d28af2 Christos Stavrakakis
            self.stdout.write(line + '\n')
133 b3d28af2 Christos Stavrakakis
        self.stdout.write(sep + '\n\n')
134 b3d28af2 Christos Stavrakakis
135 b3d28af2 Christos Stavrakakis
        for net in networks:
136 7cfbbf32 Christos Stavrakakis
            net.create_backend_network(backend)
137 b3d28af2 Christos Stavrakakis
            result = create_network_synced(net, backend)
138 b3d28af2 Christos Stavrakakis
            if result[0] != "success":
139 b3d28af2 Christos Stavrakakis
                self.stdout.write('\nError Creating Network %s: %s\n' %\
140 e41977e2 Christos Stavrakakis
                                  (net.backend_id, result[1]))
141 a9ba398e Christos Stavrakakis
            else:
142 a9ba398e Christos Stavrakakis
                self.stdout.write('Successfully created Network: %s\n' %
143 a9ba398e Christos Stavrakakis
                                 net.backend_id)
144 90b29b33 Christos Stavrakakis
            result = connect_network_synced(network=net, backend=backend)
145 90b29b33 Christos Stavrakakis
            if result[0] != "success":
146 90b29b33 Christos Stavrakakis
                self.stdout.write('\nError Connecting Network %s: %s\n' %\
147 90b29b33 Christos Stavrakakis
                                  (net.backend_id, result[1]))
148 a9ba398e Christos Stavrakakis
            else:
149 a9ba398e Christos Stavrakakis
                self.stdout.write('Successfully connected Network: %s\n' %
150 a9ba398e Christos Stavrakakis
                                 net.backend_id)