Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / backend_create.py @ 1a894bfe

History | View | Annotate | Download (4.6 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 1a894bfe Christos Stavrakakis
from synnefo.db.models import Backend
35 1a894bfe Christos Stavrakakis
from django.db.utils import IntegrityError
36 1a894bfe Christos Stavrakakis
from synnefo.logic.backend import get_physical_resources, \
37 1a894bfe Christos Stavrakakis
                                  update_resources, \
38 1a894bfe Christos Stavrakakis
                                  create_client
39 1a894bfe Christos Stavrakakis
from synnefo.util.rapi import GanetiApiError
40 1a894bfe Christos Stavrakakis
41 1a894bfe Christos Stavrakakis
42 1a894bfe Christos Stavrakakis
class Command(BaseCommand):
43 1a894bfe Christos Stavrakakis
    can_import_settings = True
44 1a894bfe Christos Stavrakakis
45 1a894bfe Christos Stavrakakis
    help = 'Create a new backend.'
46 1a894bfe Christos Stavrakakis
    output_transaction = True  # The management command runs inside
47 1a894bfe Christos Stavrakakis
                               # an SQL transaction
48 1a894bfe Christos Stavrakakis
    option_list = BaseCommand.option_list + (
49 1a894bfe Christos Stavrakakis
        make_option('--clustername', dest='clustername'),
50 1a894bfe Christos Stavrakakis
        make_option('--port', dest='port', default=5080),
51 1a894bfe Christos Stavrakakis
        make_option('--username', dest='username'),
52 1a894bfe Christos Stavrakakis
        make_option('--password', dest='password'),
53 1a894bfe Christos Stavrakakis
        make_option('--drained', action='store_true',
54 1a894bfe Christos Stavrakakis
                    dest='drained',default=False,
55 1a894bfe Christos Stavrakakis
                    help="Set as drained to exclude from allocations"),
56 1a894bfe Christos Stavrakakis
        make_option('--no-check', action='store_false',
57 1a894bfe Christos Stavrakakis
                    dest='check', default=True,
58 1a894bfe Christos Stavrakakis
                    help="Do not perform credentials check and resources update")
59 1a894bfe Christos Stavrakakis
        )
60 1a894bfe Christos Stavrakakis
61 1a894bfe Christos Stavrakakis
    def handle(self, **options):
62 1a894bfe Christos Stavrakakis
        clustername = options['clustername']
63 1a894bfe Christos Stavrakakis
        port= options['port']
64 1a894bfe Christos Stavrakakis
        username = options['username']
65 1a894bfe Christos Stavrakakis
        password = options['password']
66 1a894bfe Christos Stavrakakis
        drained = options['drained']
67 1a894bfe Christos Stavrakakis
68 1a894bfe Christos Stavrakakis
        if not (clustername and username and password):
69 1a894bfe Christos Stavrakakis
            raise CommandError("Clustername, username and password must be supplied")
70 1a894bfe Christos Stavrakakis
71 1a894bfe Christos Stavrakakis
        # Ensure correctness of credentials
72 1a894bfe Christos Stavrakakis
        if options['check']:
73 1a894bfe Christos Stavrakakis
            self.stdout.write('Checking connectivity and credentials.\n')
74 1a894bfe Christos Stavrakakis
            try:
75 1a894bfe Christos Stavrakakis
                client = create_client(clustername, port, username, password)
76 1a894bfe Christos Stavrakakis
                # This command will raise an exception if there is no write-access
77 1a894bfe Christos Stavrakakis
                client.ModifyCluster()
78 1a894bfe Christos Stavrakakis
            except GanetiApiError as e:
79 1a894bfe Christos Stavrakakis
                self.stdout.write('Check failed:\n%s\n' %e)
80 1a894bfe Christos Stavrakakis
                return
81 1a894bfe Christos Stavrakakis
            else:
82 1a894bfe Christos Stavrakakis
                self.stdout.write('Check passed.\n')
83 1a894bfe Christos Stavrakakis
84 1a894bfe Christos Stavrakakis
        # Create the new backend in database
85 1a894bfe Christos Stavrakakis
        try:
86 1a894bfe Christos Stavrakakis
            backend = Backend.objects.create(clustername=clustername,
87 1a894bfe Christos Stavrakakis
                                             port=port,
88 1a894bfe Christos Stavrakakis
                                             username=username,
89 1a894bfe Christos Stavrakakis
                                             password=password,
90 1a894bfe Christos Stavrakakis
                                             drained=drained)
91 1a894bfe Christos Stavrakakis
        except IntegrityError as e:
92 1a894bfe Christos Stavrakakis
            self.stdout.write("Cannot create backend: %s\n" % e)
93 1a894bfe Christos Stavrakakis
        else:
94 1a894bfe Christos Stavrakakis
            if options['check']:
95 1a894bfe Christos Stavrakakis
                self.stdout.write('\nRetriving backend resources:\n')
96 1a894bfe Christos Stavrakakis
                resources = get_physical_resources(backend)
97 1a894bfe Christos Stavrakakis
                attr = ['mfree', 'mtotal', 'dfree', 'dtotal', 'pinst_cnt', 'ctotal']
98 1a894bfe Christos Stavrakakis
                for a in attr:
99 1a894bfe Christos Stavrakakis
                    self.stdout.write(a + ' : ' + str(resources[a])+'\n')
100 1a894bfe Christos Stavrakakis
                update_resources(backend, resources)
101 1a894bfe Christos Stavrakakis
102 1a894bfe Christos Stavrakakis
            self.stdout.write('\nSuccessfully created backend with id %d\n' %
103 1a894bfe Christos Stavrakakis
                              backend.id)