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() |