Statistics
| Branch: | Tag: | Revision:

root / tools / cfgupgrade @ a4af651e

History | View | Annotate | Download (3.5 kB)

1 0006af7d Michael Hanselmann
#!/usr/bin/python
2 0006af7d Michael Hanselmann
#
3 0006af7d Michael Hanselmann
4 f97c7901 Michael Hanselmann
# Copyright (C) 2007, 2008 Google Inc.
5 0006af7d Michael Hanselmann
#
6 0006af7d Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 0006af7d Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 0006af7d Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 0006af7d Michael Hanselmann
# (at your option) any later version.
10 0006af7d Michael Hanselmann
#
11 0006af7d Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 0006af7d Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 0006af7d Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 0006af7d Michael Hanselmann
# General Public License for more details.
15 0006af7d Michael Hanselmann
#
16 0006af7d Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 0006af7d Michael Hanselmann
# along with this program; if not, write to the Free Software
18 0006af7d Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 0006af7d Michael Hanselmann
# 02110-1301, USA.
20 0006af7d Michael Hanselmann
21 0006af7d Michael Hanselmann
22 0006af7d Michael Hanselmann
"""Tool to upgrade the configuration file.
23 0006af7d Michael Hanselmann
24 319856a9 Michael Hanselmann
This code handles only the types supported by simplejson. As an example, "set"
25 e0732b36 Michael Hanselmann
is a "list".
26 0006af7d Michael Hanselmann
27 0006af7d Michael Hanselmann
"""
28 0006af7d Michael Hanselmann
29 0006af7d Michael Hanselmann
30 0006af7d Michael Hanselmann
import os
31 0006af7d Michael Hanselmann
import os.path
32 0006af7d Michael Hanselmann
import sys
33 0006af7d Michael Hanselmann
import optparse
34 0006af7d Michael Hanselmann
import tempfile
35 319856a9 Michael Hanselmann
import simplejson
36 0006af7d Michael Hanselmann
37 319856a9 Michael Hanselmann
from ganeti import utils
38 f97c7901 Michael Hanselmann
from ganeti import cli
39 0006af7d Michael Hanselmann
40 0006af7d Michael Hanselmann
41 319856a9 Michael Hanselmann
options = None
42 319856a9 Michael Hanselmann
args = None
43 0006af7d Michael Hanselmann
44 0006af7d Michael Hanselmann
45 319856a9 Michael Hanselmann
class Error(Exception):
46 319856a9 Michael Hanselmann
  """Generic exception"""
47 319856a9 Michael Hanselmann
  pass
48 0006af7d Michael Hanselmann
49 0006af7d Michael Hanselmann
50 319856a9 Michael Hanselmann
def ReadConfig(path):
51 319856a9 Michael Hanselmann
  """Reads configuration file.
52 0006af7d Michael Hanselmann
53 0006af7d Michael Hanselmann
  """
54 319856a9 Michael Hanselmann
  f = open(path, 'r')
55 319856a9 Michael Hanselmann
  try:
56 e0732b36 Michael Hanselmann
    return simplejson.load(f)
57 319856a9 Michael Hanselmann
  finally:
58 319856a9 Michael Hanselmann
    f.close()
59 0006af7d Michael Hanselmann
60 0006af7d Michael Hanselmann
61 319856a9 Michael Hanselmann
def WriteConfig(path, data):
62 319856a9 Michael Hanselmann
  """Writes the configuration file.
63 319856a9 Michael Hanselmann
64 319856a9 Michael Hanselmann
  """
65 319856a9 Michael Hanselmann
  if not options.dry_run:
66 319856a9 Michael Hanselmann
    utils.CreateBackup(path)
67 0006af7d Michael Hanselmann
68 0006af7d Michael Hanselmann
  (fd, name) = tempfile.mkstemp(dir=os.path.dirname(path))
69 0006af7d Michael Hanselmann
  f = os.fdopen(fd, 'w')
70 0006af7d Michael Hanselmann
  try:
71 0006af7d Michael Hanselmann
    try:
72 319856a9 Michael Hanselmann
      simplejson.dump(data, f)
73 0006af7d Michael Hanselmann
      f.flush()
74 319856a9 Michael Hanselmann
      if options.dry_run:
75 60edf71e Michael Hanselmann
        os.unlink(name)
76 60edf71e Michael Hanselmann
      else:
77 60edf71e Michael Hanselmann
        os.rename(name, path)
78 0006af7d Michael Hanselmann
    except:
79 0006af7d Michael Hanselmann
      os.unlink(name)
80 0006af7d Michael Hanselmann
      raise
81 0006af7d Michael Hanselmann
  finally:
82 0006af7d Michael Hanselmann
    f.close()
83 0006af7d Michael Hanselmann
84 0006af7d Michael Hanselmann
85 0006af7d Michael Hanselmann
def UpdateFromVersion2To3(cfg):
86 0006af7d Michael Hanselmann
  """Updates the configuration from version 2 to 3.
87 0006af7d Michael Hanselmann
88 0006af7d Michael Hanselmann
  """
89 0006af7d Michael Hanselmann
  if cfg['cluster']['config_version'] != 2:
90 0006af7d Michael Hanselmann
    return
91 0006af7d Michael Hanselmann
92 0006af7d Michael Hanselmann
  # Add port pool
93 0006af7d Michael Hanselmann
  if 'tcpudp_port_pool' not in cfg['cluster']:
94 319856a9 Michael Hanselmann
    cfg['cluster']['tcpudp_port_pool'] = []
95 0006af7d Michael Hanselmann
96 0006af7d Michael Hanselmann
  # Add bridge settings
97 0006af7d Michael Hanselmann
  if 'default_bridge' not in cfg['cluster']:
98 0006af7d Michael Hanselmann
    cfg['cluster']['default_bridge'] = 'xen-br0'
99 0006af7d Michael Hanselmann
  for inst in cfg['instances'].values():
100 0006af7d Michael Hanselmann
    for nic in inst['nics']:
101 0006af7d Michael Hanselmann
      if 'bridge' not in nic:
102 0006af7d Michael Hanselmann
        nic['bridge'] = None
103 0006af7d Michael Hanselmann
104 0006af7d Michael Hanselmann
  cfg['cluster']['config_version'] = 3
105 0006af7d Michael Hanselmann
106 0006af7d Michael Hanselmann
107 0006af7d Michael Hanselmann
# Main program
108 0006af7d Michael Hanselmann
if __name__ == "__main__":
109 319856a9 Michael Hanselmann
  program = os.path.basename(sys.argv[0])
110 319856a9 Michael Hanselmann
111 0006af7d Michael Hanselmann
  # Option parsing
112 1c2d87fc Michael Hanselmann
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
113 60edf71e Michael Hanselmann
  parser.add_option('--dry-run', dest='dry_run',
114 60edf71e Michael Hanselmann
                    action="store_true",
115 f4bc1f2c Michael Hanselmann
                    help="Try to do the conversion, but don't write"
116 f4bc1f2c Michael Hanselmann
                         " output file")
117 f97c7901 Michael Hanselmann
  parser.add_option(cli.FORCE_OPT)
118 0006af7d Michael Hanselmann
  parser.add_option('--verbose', dest='verbose',
119 0006af7d Michael Hanselmann
                    action="store_true",
120 0006af7d Michael Hanselmann
                    help="Verbose output")
121 0006af7d Michael Hanselmann
  (options, args) = parser.parse_args()
122 0006af7d Michael Hanselmann
123 0006af7d Michael Hanselmann
  # Option checking
124 0006af7d Michael Hanselmann
  if args:
125 0006af7d Michael Hanselmann
    cfg_file = args[0]
126 0006af7d Michael Hanselmann
  else:
127 3ecf6786 Iustin Pop
    raise Error("Configuration file not specified")
128 0006af7d Michael Hanselmann
129 319856a9 Michael Hanselmann
  if not options.force:
130 f4bc1f2c Michael Hanselmann
    usertext = ("%s MUST run on the master node. Is this the master"
131 f4bc1f2c Michael Hanselmann
                " node?" % program)
132 f97c7901 Michael Hanselmann
    if not cli.AskUser(usertext):
133 319856a9 Michael Hanselmann
      sys.exit(1)
134 319856a9 Michael Hanselmann
135 0006af7d Michael Hanselmann
  config = ReadConfig(cfg_file)
136 0006af7d Michael Hanselmann
137 319856a9 Michael Hanselmann
  if options.verbose:
138 319856a9 Michael Hanselmann
    import pprint
139 319856a9 Michael Hanselmann
    print "Before upgrade:"
140 319856a9 Michael Hanselmann
    pprint.pprint(config)
141 319856a9 Michael Hanselmann
    print
142 319856a9 Michael Hanselmann
143 0006af7d Michael Hanselmann
  UpdateFromVersion2To3(config)
144 0006af7d Michael Hanselmann
145 0006af7d Michael Hanselmann
  if options.verbose:
146 319856a9 Michael Hanselmann
    print "After upgrade:"
147 0006af7d Michael Hanselmann
    pprint.pprint(config)
148 319856a9 Michael Hanselmann
    print
149 319856a9 Michael Hanselmann
150 319856a9 Michael Hanselmann
  WriteConfig(cfg_file, config)
151 319856a9 Michael Hanselmann
152 319856a9 Michael Hanselmann
  print "The configuration file has been updated successfully. Please run"
153 319856a9 Michael Hanselmann
  print "  gnt-cluster copyfile %s" % cfg_file
154 319856a9 Michael Hanselmann
  print "now."
155 0006af7d Michael Hanselmann
156 319856a9 Michael Hanselmann
# vim: set foldmethod=marker :