Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / backend-add.py @ 8c911970

History | View | Annotate | Download (6.2 kB)

1 12cb6933 Christos Stavrakakis
# Copyright 2011-2013 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 12cb6933 Christos Stavrakakis
import sys
31 1a894bfe Christos Stavrakakis
from optparse import make_option
32 8c911970 Christos Stavrakakis
from django.core.management.base import CommandError
33 8c911970 Christos Stavrakakis
from snf_django.management.commands import SynnefoCommand
34 1a894bfe Christos Stavrakakis
35 3524241a Christos Stavrakakis
from synnefo.db.models import Backend, Network
36 1a894bfe Christos Stavrakakis
from django.db.utils import IntegrityError
37 1da50fe3 Christos Stavrakakis
from synnefo.logic import backend as backend_mod
38 225cea18 Christos Stavrakakis
from synnefo.management.common import check_backend_credentials
39 d758784b Christos Stavrakakis
from snf_django.management.utils import pprint_table
40 1a894bfe Christos Stavrakakis
41 1a894bfe Christos Stavrakakis
42 4c9ac139 Christos Stavrakakis
HYPERVISORS = [h[0] for h in Backend.HYPERVISORS]
43 4c9ac139 Christos Stavrakakis
44 4c9ac139 Christos Stavrakakis
45 8c911970 Christos Stavrakakis
class Command(SynnefoCommand):
46 1a894bfe Christos Stavrakakis
    can_import_settings = True
47 1a894bfe Christos Stavrakakis
48 1a894bfe Christos Stavrakakis
    help = 'Create a new backend.'
49 8c911970 Christos Stavrakakis
    option_list = SynnefoCommand.option_list + (
50 1a894bfe Christos Stavrakakis
        make_option('--clustername', dest='clustername'),
51 1a894bfe Christos Stavrakakis
        make_option('--port', dest='port', default=5080),
52 b3d28af2 Christos Stavrakakis
        make_option('--user', dest='username'),
53 b3d28af2 Christos Stavrakakis
        make_option('--pass', dest='password'),
54 cc92b70f Christos Stavrakakis
        make_option(
55 12cb6933 Christos Stavrakakis
            '--no-check',
56 12cb6933 Christos Stavrakakis
            action='store_false',
57 12cb6933 Christos Stavrakakis
            dest='check',
58 12cb6933 Christos Stavrakakis
            default=True,
59 b3d28af2 Christos Stavrakakis
            help="Do not perform credentials check and resources update"),
60 12cb6933 Christos Stavrakakis
        make_option(
61 12cb6933 Christos Stavrakakis
            '--hypervisor',
62 4c9ac139 Christos Stavrakakis
            dest='hypervisor',
63 4c9ac139 Christos Stavrakakis
            default=None,
64 4c9ac139 Christos Stavrakakis
            choices=HYPERVISORS,
65 4c9ac139 Christos Stavrakakis
            metavar="|".join(HYPERVISORS),
66 4c9ac139 Christos Stavrakakis
            help="The hypervisor that the Ganeti backend uses"),
67 9115d567 Christos Stavrakakis
        make_option(
68 9115d567 Christos Stavrakakis
            '--no-init', action='store_false',
69 9115d567 Christos Stavrakakis
            dest='init', default=True,
70 9115d567 Christos Stavrakakis
            help="Do not perform initialization of the Backend Model")
71 cc92b70f Christos Stavrakakis
    )
72 1a894bfe Christos Stavrakakis
73 6cc65c86 Christos Stavrakakis
    def handle(self, *args, **options):
74 6cc65c86 Christos Stavrakakis
        if len(args) > 0:
75 6cc65c86 Christos Stavrakakis
            raise CommandError("Command takes no arguments")
76 6cc65c86 Christos Stavrakakis
77 1a894bfe Christos Stavrakakis
        clustername = options['clustername']
78 b3d28af2 Christos Stavrakakis
        port = options['port']
79 e41977e2 Christos Stavrakakis
        username = options['username']
80 e41977e2 Christos Stavrakakis
        password = options['password']
81 1a894bfe Christos Stavrakakis
82 1a894bfe Christos Stavrakakis
        if not (clustername and username and password):
83 b3d28af2 Christos Stavrakakis
            raise CommandError("Clustername, user and pass must be supplied")
84 1a894bfe Christos Stavrakakis
85 1a894bfe Christos Stavrakakis
        # Ensure correctness of credentials
86 1a894bfe Christos Stavrakakis
        if options['check']:
87 2333a2c4 Christos Stavrakakis
            check_backend_credentials(clustername, port, username, password)
88 f7759b2d Christos Stavrakakis
89 12cb6933 Christos Stavrakakis
        create_backend(clustername, port, username, password,
90 12cb6933 Christos Stavrakakis
                       hypervisor=options["hypervisor"],
91 12cb6933 Christos Stavrakakis
                       initialize=options["init"])
92 12cb6933 Christos Stavrakakis
93 12cb6933 Christos Stavrakakis
94 12cb6933 Christos Stavrakakis
def create_backend(clustername, port, username, password, hypervisor=None,
95 12cb6933 Christos Stavrakakis
                   initialize=True, stream=sys.stdout):
96 4c9ac139 Christos Stavrakakis
        kw = {"clustername": clustername,
97 4c9ac139 Christos Stavrakakis
              "port": port,
98 4c9ac139 Christos Stavrakakis
              "username": username,
99 4c9ac139 Christos Stavrakakis
              "password": password,
100 4c9ac139 Christos Stavrakakis
              "drained": True}
101 4c9ac139 Christos Stavrakakis
102 4c9ac139 Christos Stavrakakis
        if hypervisor:
103 4c9ac139 Christos Stavrakakis
            kw["hypervisor"] = hypervisor
104 12cb6933 Christos Stavrakakis
105 1a894bfe Christos Stavrakakis
        # Create the new backend in database
106 1a894bfe Christos Stavrakakis
        try:
107 4c9ac139 Christos Stavrakakis
            backend = Backend.objects.create(**kw)
108 1a894bfe Christos Stavrakakis
        except IntegrityError as e:
109 b3d28af2 Christos Stavrakakis
            raise CommandError("Cannot create backend: %s\n" % e)
110 1a894bfe Christos Stavrakakis
111 12cb6933 Christos Stavrakakis
        stream.write("Successfully created backend with id %d\n" % backend.id)
112 b3d28af2 Christos Stavrakakis
113 12cb6933 Christos Stavrakakis
        if not initialize:
114 b3d28af2 Christos Stavrakakis
            return
115 b3d28af2 Christos Stavrakakis
116 12cb6933 Christos Stavrakakis
        stream.write("Retrieving backend resources:\n")
117 1da50fe3 Christos Stavrakakis
        resources = backend_mod.get_physical_resources(backend)
118 b3d28af2 Christos Stavrakakis
        attr = ['mfree', 'mtotal', 'dfree', 'dtotal', 'pinst_cnt', 'ctotal']
119 88b8f176 Christos Stavrakakis
120 88b8f176 Christos Stavrakakis
        table = [[str(resources[x]) for x in attr]]
121 12cb6933 Christos Stavrakakis
        pprint_table(stream, table, attr)
122 88b8f176 Christos Stavrakakis
123 1da50fe3 Christos Stavrakakis
        backend_mod.update_backend_resources(backend, resources)
124 1da50fe3 Christos Stavrakakis
        backend_mod.update_backend_disk_templates(backend)
125 9115d567 Christos Stavrakakis
126 6b5cdb0f Christos Stavrakakis
        networks = Network.objects.filter(deleted=False, public=True)
127 9115d567 Christos Stavrakakis
        if not networks:
128 9115d567 Christos Stavrakakis
            return
129 9115d567 Christos Stavrakakis
130 6b5cdb0f Christos Stavrakakis
        stream.write("Creating the following public:\n")
131 6b5cdb0f Christos Stavrakakis
        headers = ("ID", "Name", 'IPv4 Subnet', "IPv6 Subnet", 'Mac Prefix')
132 9115d567 Christos Stavrakakis
        table = []
133 9115d567 Christos Stavrakakis
134 9115d567 Christos Stavrakakis
        for net in networks:
135 6b5cdb0f Christos Stavrakakis
            subnet4 = net.subnet4.cidr if net.subnet4 else None
136 6b5cdb0f Christos Stavrakakis
            subnet6 = net.subnet6.cidr if net.subnet6 else None
137 6b5cdb0f Christos Stavrakakis
            table.append((net.id, net.backend_id, subnet4,
138 6b5cdb0f Christos Stavrakakis
                          subnet6, str(net.mac_prefix)))
139 12cb6933 Christos Stavrakakis
        pprint_table(stream, table, headers)
140 9115d567 Christos Stavrakakis
141 9115d567 Christos Stavrakakis
        for net in networks:
142 9115d567 Christos Stavrakakis
            net.create_backend_network(backend)
143 1da50fe3 Christos Stavrakakis
            result = backend_mod.create_network_synced(net, backend)
144 9115d567 Christos Stavrakakis
            if result[0] != "success":
145 12cb6933 Christos Stavrakakis
                stream.write('\nError Creating Network %s: %s\n' %
146 12cb6933 Christos Stavrakakis
                             (net.backend_id, result[1]))
147 9115d567 Christos Stavrakakis
            else:
148 12cb6933 Christos Stavrakakis
                stream.write('Successfully created Network: %s\n' %
149 12cb6933 Christos Stavrakakis
                             net.backend_id)
150 1da50fe3 Christos Stavrakakis
            result = backend_mod.connect_network_synced(network=net,
151 1da50fe3 Christos Stavrakakis
                                                        backend=backend)
152 9115d567 Christos Stavrakakis
            if result[0] != "success":
153 12cb6933 Christos Stavrakakis
                stream.write('\nError Connecting Network %s: %s\n' %
154 12cb6933 Christos Stavrakakis
                             (net.backend_id, result[1]))
155 9115d567 Christos Stavrakakis
            else:
156 12cb6933 Christos Stavrakakis
                stream.write('Successfully connected Network: %s\n' %
157 12cb6933 Christos Stavrakakis
                             net.backend_id)