Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / reconcile-servers.py @ a6e6fe48

History | View | Annotate | Download (5.6 kB)

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

32 9fea53cc Vangelis Koukis
Management command to reconcile the contents of the Synnefo DB with
33 3b40590c Vangelis Koukis
the state of the Ganeti backend. See docstring on top of
34 3b40590c Vangelis Koukis
logic/reconciliation.py for a description of reconciliation rules.
35 9fea53cc Vangelis Koukis

36 9fea53cc Vangelis Koukis
"""
37 9fea53cc Vangelis Koukis
import sys
38 75dc539e Christos Stavrakakis
import logging
39 75dc539e Christos Stavrakakis
import subprocess
40 76a429fb Georgios Gousios
from optparse import make_option
41 75dc539e Christos Stavrakakis
from django.core.management.base import BaseCommand
42 a6e6fe48 Christos Stavrakakis
from synnefo.management.common import get_resource
43 75dc539e Christos Stavrakakis
from synnefo.logic import reconciliation
44 d758784b Christos Stavrakakis
from snf_django.management.utils import parse_bool
45 8007ba7b Georgios Gousios
46 8007ba7b Georgios Gousios
47 76a429fb Georgios Gousios
class Command(BaseCommand):
48 9fea53cc Vangelis Koukis
    can_import_settings = True
49 9fea53cc Vangelis Koukis
50 9fea53cc Vangelis Koukis
    help = 'Reconcile contents of Synnefo DB with state of Ganeti backend'
51 9fea53cc Vangelis Koukis
    option_list = BaseCommand.option_list + (
52 75dc539e Christos Stavrakakis
        make_option('--backend-id', default=None, dest='backend-id',
53 75dc539e Christos Stavrakakis
                    help='Reconcilie VMs only for this backend'),
54 75dc539e Christos Stavrakakis
        make_option("--parallel",
55 75dc539e Christos Stavrakakis
                    dest="parallel",
56 75dc539e Christos Stavrakakis
                    default="True",
57 75dc539e Christos Stavrakakis
                    choices=["True", "False"],
58 75dc539e Christos Stavrakakis
                    metavar="True|False",
59 75dc539e Christos Stavrakakis
                    help="Perform server reconciliation for each backend"
60 75dc539e Christos Stavrakakis
                         " parallel."),
61 9fea53cc Vangelis Koukis
        make_option('--fix-stale', action='store_true', dest='fix_stale',
62 9fea53cc Vangelis Koukis
                    default=False, help='Fix (remove) stale DB entries in DB'),
63 9fea53cc Vangelis Koukis
        make_option('--fix-orphans', action='store_true', dest='fix_orphans',
64 9fea53cc Vangelis Koukis
                    default=False, help='Fix (remove) orphan Ganeti VMs'),
65 9fea53cc Vangelis Koukis
        make_option('--fix-unsynced', action='store_true', dest='fix_unsynced',
66 9fea53cc Vangelis Koukis
                    default=False, help='Fix server operstate in DB, set ' +
67 9fea53cc Vangelis Koukis
                                        'from Ganeti'),
68 cc92b70f Christos Stavrakakis
        make_option('--fix-unsynced-nics', action='store_true',
69 c59f7e0f Christos Stavrakakis
                    dest='fix_unsynced_nics', default=False,
70 c59f7e0f Christos Stavrakakis
                    help='Fix unsynced nics between DB and Ganeti'),
71 a67419d8 Christos Stavrakakis
        make_option('--fix-unsynced-flavors', action='store_true',
72 a67419d8 Christos Stavrakakis
                    dest='fix_unsynced_flavors', default=False,
73 a67419d8 Christos Stavrakakis
                    help='Fix unsynced flavors between DB and Ganeti'),
74 63f9eb8e Christos Stavrakakis
        make_option('--fix-pending-tasks', action='store_true',
75 63f9eb8e Christos Stavrakakis
                    dest='fix_pending_tasks', default=False,
76 63f9eb8e Christos Stavrakakis
                    help='Fix servers with stale pending tasks.'),
77 9fea53cc Vangelis Koukis
        make_option('--fix-all', action='store_true', dest='fix_all',
78 c414bc87 Christos Stavrakakis
                    default=False, help='Enable all --fix-* arguments'),
79 cc92b70f Christos Stavrakakis
    )
80 9fea53cc Vangelis Koukis
81 9fea53cc Vangelis Koukis
    def _process_args(self, options):
82 9fea53cc Vangelis Koukis
        keys_fix = [k for k in options.keys() if k.startswith('fix_')]
83 9fea53cc Vangelis Koukis
        if options['fix_all']:
84 9fea53cc Vangelis Koukis
            for kf in keys_fix:
85 9fea53cc Vangelis Koukis
                options[kf] = True
86 9fea53cc Vangelis Koukis
87 9fea53cc Vangelis Koukis
    def handle(self, **options):
88 c414bc87 Christos Stavrakakis
        backend_id = options['backend-id']
89 e77a29ab Christos Stavrakakis
        if backend_id:
90 a6e6fe48 Christos Stavrakakis
            backends = [get_resource("backend", backend_id)]
91 e77a29ab Christos Stavrakakis
        else:
92 75dc539e Christos Stavrakakis
            backends = reconciliation.get_online_backends()
93 75dc539e Christos Stavrakakis
94 75dc539e Christos Stavrakakis
        parallel = parse_bool(options["parallel"])
95 75dc539e Christos Stavrakakis
        if parallel and len(backends) > 1:
96 75dc539e Christos Stavrakakis
            cmd = sys.argv
97 75dc539e Christos Stavrakakis
            processes = []
98 75dc539e Christos Stavrakakis
            for backend in backends:
99 75dc539e Christos Stavrakakis
                p = subprocess.Popen(cmd + ["--backend-id=%s" % backend.id])
100 75dc539e Christos Stavrakakis
                processes.append(p)
101 75dc539e Christos Stavrakakis
            for p in processes:
102 75dc539e Christos Stavrakakis
                p.wait()
103 75dc539e Christos Stavrakakis
            return
104 75dc539e Christos Stavrakakis
105 75dc539e Christos Stavrakakis
        verbosity = int(options["verbosity"])
106 75dc539e Christos Stavrakakis
107 b88c1549 Christos Stavrakakis
        logger = logging.getLogger("reconcile-servers")
108 75dc539e Christos Stavrakakis
        logger.propagate = 0
109 75dc539e Christos Stavrakakis
110 75dc539e Christos Stavrakakis
        formatter = logging.Formatter("%(message)s")
111 75dc539e Christos Stavrakakis
        log_handler = logging.StreamHandler()
112 75dc539e Christos Stavrakakis
        log_handler.setFormatter(formatter)
113 75dc539e Christos Stavrakakis
        if verbosity == 2:
114 b88c1549 Christos Stavrakakis
            formatter =\
115 b88c1549 Christos Stavrakakis
                logging.Formatter("%(asctime)s [%(process)d]: %(message)s")
116 75dc539e Christos Stavrakakis
            log_handler.setFormatter(formatter)
117 75dc539e Christos Stavrakakis
            logger.setLevel(logging.DEBUG)
118 75dc539e Christos Stavrakakis
        elif verbosity == 1:
119 75dc539e Christos Stavrakakis
            logger.setLevel(logging.INFO)
120 75dc539e Christos Stavrakakis
        else:
121 75dc539e Christos Stavrakakis
            logger.setLevel(logging.WARNING)
122 9fea53cc Vangelis Koukis
123 75dc539e Christos Stavrakakis
        logger.addHandler(log_handler)
124 4161cb41 Christos Stavrakakis
125 75dc539e Christos Stavrakakis
        self._process_args(options)
126 4161cb41 Christos Stavrakakis
127 75dc539e Christos Stavrakakis
        for backend in backends:
128 75dc539e Christos Stavrakakis
            r = reconciliation.BackendReconciler(backend=backend,
129 75dc539e Christos Stavrakakis
                                                 logger=logger,
130 75dc539e Christos Stavrakakis
                                                 options=options)
131 75dc539e Christos Stavrakakis
            r.reconcile()