Statistics
| Branch: | Tag: | Revision:

root / test / cfgupgrade_unittest.py @ 6760e4ed

History | View | Annotate | Download (4.5 kB)

1 aefbe369 Michael Hanselmann
#!/usr/bin/python
2 aefbe369 Michael Hanselmann
#
3 aefbe369 Michael Hanselmann
4 aefbe369 Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 aefbe369 Michael Hanselmann
#
6 aefbe369 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 aefbe369 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 aefbe369 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 aefbe369 Michael Hanselmann
# (at your option) any later version.
10 aefbe369 Michael Hanselmann
#
11 aefbe369 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 aefbe369 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 aefbe369 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 aefbe369 Michael Hanselmann
# General Public License for more details.
15 aefbe369 Michael Hanselmann
#
16 aefbe369 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 aefbe369 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 aefbe369 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 aefbe369 Michael Hanselmann
# 02110-1301, USA.
20 aefbe369 Michael Hanselmann
21 aefbe369 Michael Hanselmann
22 aefbe369 Michael Hanselmann
"""Script for testing tools/cfgupgrade"""
23 aefbe369 Michael Hanselmann
24 aefbe369 Michael Hanselmann
import os
25 aefbe369 Michael Hanselmann
import sys
26 aefbe369 Michael Hanselmann
import unittest
27 aefbe369 Michael Hanselmann
import shutil
28 aefbe369 Michael Hanselmann
import tempfile
29 aefbe369 Michael Hanselmann
import operator
30 aefbe369 Michael Hanselmann
31 aefbe369 Michael Hanselmann
from ganeti import constants
32 aefbe369 Michael Hanselmann
from ganeti import utils
33 aefbe369 Michael Hanselmann
from ganeti import errors
34 aefbe369 Michael Hanselmann
from ganeti import serializer
35 aefbe369 Michael Hanselmann
36 aefbe369 Michael Hanselmann
import testutils
37 aefbe369 Michael Hanselmann
38 aefbe369 Michael Hanselmann
39 aefbe369 Michael Hanselmann
def _RunUpgrade(path, dry_run, no_verify):
40 aefbe369 Michael Hanselmann
  cmd = [sys.executable, "%s/tools/cfgupgrade" % testutils.GetSourceDir(),
41 aefbe369 Michael Hanselmann
         "--debug", "--force", "--path=%s" % path]
42 aefbe369 Michael Hanselmann
  if dry_run:
43 aefbe369 Michael Hanselmann
    cmd.append("--dry-run")
44 aefbe369 Michael Hanselmann
  if no_verify:
45 aefbe369 Michael Hanselmann
    cmd.append("--no-verify")
46 aefbe369 Michael Hanselmann
47 aefbe369 Michael Hanselmann
  result = utils.RunCmd(cmd, cwd=os.getcwd())
48 aefbe369 Michael Hanselmann
  if result.failed:
49 aefbe369 Michael Hanselmann
    raise Exception("cfgupgrade failed: %s, output %r" %
50 aefbe369 Michael Hanselmann
                    (result.fail_reason, result.output))
51 aefbe369 Michael Hanselmann
52 aefbe369 Michael Hanselmann
53 aefbe369 Michael Hanselmann
class TestCfgupgrade(unittest.TestCase):
54 aefbe369 Michael Hanselmann
  def setUp(self):
55 aefbe369 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
56 aefbe369 Michael Hanselmann
57 aefbe369 Michael Hanselmann
    self.config_path = utils.PathJoin(self.tmpdir, "config.data")
58 aefbe369 Michael Hanselmann
    self.noded_cert_path = utils.PathJoin(self.tmpdir, "server.pem")
59 aefbe369 Michael Hanselmann
    self.rapi_cert_path = utils.PathJoin(self.tmpdir, "rapi.pem")
60 aefbe369 Michael Hanselmann
    self.known_hosts_path = utils.PathJoin(self.tmpdir, "known_hosts")
61 aefbe369 Michael Hanselmann
    self.confd_hmac_path = utils.PathJoin(self.tmpdir, "hmac.key")
62 aefbe369 Michael Hanselmann
    self.cds_path = utils.PathJoin(self.tmpdir, "cluster-domain-secret")
63 aefbe369 Michael Hanselmann
64 aefbe369 Michael Hanselmann
  def tearDown(self):
65 aefbe369 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
66 aefbe369 Michael Hanselmann
67 aefbe369 Michael Hanselmann
  def _LoadConfig(self):
68 aefbe369 Michael Hanselmann
    return serializer.LoadJson(utils.ReadFile(self.config_path))
69 aefbe369 Michael Hanselmann
70 aefbe369 Michael Hanselmann
  def _CreateValidConfigDir(self):
71 aefbe369 Michael Hanselmann
    utils.WriteFile(self.noded_cert_path, data="")
72 aefbe369 Michael Hanselmann
    utils.WriteFile(self.known_hosts_path, data="")
73 aefbe369 Michael Hanselmann
74 aefbe369 Michael Hanselmann
  def testNoConfigDir(self):
75 aefbe369 Michael Hanselmann
    self.assertFalse(utils.ListVisibleFiles(self.tmpdir))
76 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
77 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, True, True)
78 aefbe369 Michael Hanselmann
79 aefbe369 Michael Hanselmann
  def testInconsistentConfig(self):
80 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
81 aefbe369 Michael Hanselmann
    # There should be no "config_version"
82 aefbe369 Michael Hanselmann
    cfg = {
83 aefbe369 Michael Hanselmann
      "version": 0,
84 aefbe369 Michael Hanselmann
      "cluster": {
85 aefbe369 Michael Hanselmann
        "config_version": 0,
86 aefbe369 Michael Hanselmann
        },
87 aefbe369 Michael Hanselmann
      }
88 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
89 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
90 aefbe369 Michael Hanselmann
91 aefbe369 Michael Hanselmann
  def testInvalidConfig(self):
92 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
93 aefbe369 Michael Hanselmann
    # Missing version from config
94 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson({}))
95 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
96 aefbe369 Michael Hanselmann
97 aefbe369 Michael Hanselmann
  def _TestSimpleUpgrade(self, from_version, dry_run):
98 aefbe369 Michael Hanselmann
    cfg = {
99 aefbe369 Michael Hanselmann
      "version": from_version,
100 aefbe369 Michael Hanselmann
      "cluster": {},
101 aefbe369 Michael Hanselmann
      }
102 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
103 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
104 aefbe369 Michael Hanselmann
105 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.rapi_cert_path))
106 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.confd_hmac_path))
107 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.cds_path))
108 aefbe369 Michael Hanselmann
109 aefbe369 Michael Hanselmann
    _RunUpgrade(self.tmpdir, dry_run, True)
110 aefbe369 Michael Hanselmann
111 aefbe369 Michael Hanselmann
    if dry_run:
112 aefbe369 Michael Hanselmann
      expversion = from_version
113 aefbe369 Michael Hanselmann
      checkfn = operator.not_
114 aefbe369 Michael Hanselmann
    else:
115 aefbe369 Michael Hanselmann
      expversion = constants.CONFIG_VERSION
116 aefbe369 Michael Hanselmann
      checkfn = operator.truth
117 aefbe369 Michael Hanselmann
118 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.rapi_cert_path)))
119 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.confd_hmac_path)))
120 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.cds_path)))
121 aefbe369 Michael Hanselmann
122 aefbe369 Michael Hanselmann
    newcfg = self._LoadConfig()
123 aefbe369 Michael Hanselmann
    self.assertEqual(newcfg["version"], expversion)
124 aefbe369 Michael Hanselmann
125 aefbe369 Michael Hanselmann
  def testUpgradeFrom_2_0(self):
126 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), False)
127 aefbe369 Michael Hanselmann
128 aefbe369 Michael Hanselmann
  def testUpgradeFrom_2_1(self):
129 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), False)
130 aefbe369 Michael Hanselmann
131 aefbe369 Michael Hanselmann
  def testUpgradeCurrent(self):
132 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
133 aefbe369 Michael Hanselmann
134 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_0(self):
135 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True)
136 aefbe369 Michael Hanselmann
137 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_1(self):
138 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True)
139 aefbe369 Michael Hanselmann
140 aefbe369 Michael Hanselmann
  def testUpgradeCurrentDryRun(self):
141 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, True)
142 aefbe369 Michael Hanselmann
143 aefbe369 Michael Hanselmann
144 aefbe369 Michael Hanselmann
if __name__ == "__main__":
145 aefbe369 Michael Hanselmann
  testutils.GanetiTestProgram()