Statistics
| Branch: | Tag: | Revision:

root / test / py / cfgupgrade_unittest.py @ 5030cff3

History | View | Annotate | Download (16.6 kB)

1 aefbe369 Michael Hanselmann
#!/usr/bin/python
2 aefbe369 Michael Hanselmann
#
3 aefbe369 Michael Hanselmann
4 1709435e Bernardo Dal Seno
# Copyright (C) 2010, 2012, 2013 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 011974df Michael Hanselmann
from ganeti import netutils
36 aefbe369 Michael Hanselmann
37 aefbe369 Michael Hanselmann
import testutils
38 aefbe369 Michael Hanselmann
39 aefbe369 Michael Hanselmann
40 b555101c Thomas Thrainer
def GetMinimalConfig():
41 b555101c Thomas Thrainer
  return {
42 b555101c Thomas Thrainer
    "version": constants.CONFIG_VERSION,
43 b555101c Thomas Thrainer
    "cluster": {
44 b555101c Thomas Thrainer
      "master_node": "node1-uuid"
45 b555101c Thomas Thrainer
    },
46 b555101c Thomas Thrainer
    "instances": {},
47 b555101c Thomas Thrainer
    "nodegroups": {},
48 b555101c Thomas Thrainer
    "nodes": {
49 b555101c Thomas Thrainer
      "node1-uuid": {
50 b555101c Thomas Thrainer
        "name": "node1",
51 b555101c Thomas Thrainer
        "uuid": "node1-uuid"
52 b555101c Thomas Thrainer
      }
53 b555101c Thomas Thrainer
    },
54 b555101c Thomas Thrainer
  }
55 b555101c Thomas Thrainer
56 b555101c Thomas Thrainer
57 1709435e Bernardo Dal Seno
def _RunUpgrade(path, dry_run, no_verify, ignore_hostname=True,
58 1709435e Bernardo Dal Seno
                downgrade=False):
59 aefbe369 Michael Hanselmann
  cmd = [sys.executable, "%s/tools/cfgupgrade" % testutils.GetSourceDir(),
60 7939f60c Michael Hanselmann
         "--debug", "--force", "--path=%s" % path, "--confdir=%s" % path]
61 011974df Michael Hanselmann
62 011974df Michael Hanselmann
  if ignore_hostname:
63 011974df Michael Hanselmann
    cmd.append("--ignore-hostname")
64 aefbe369 Michael Hanselmann
  if dry_run:
65 aefbe369 Michael Hanselmann
    cmd.append("--dry-run")
66 aefbe369 Michael Hanselmann
  if no_verify:
67 aefbe369 Michael Hanselmann
    cmd.append("--no-verify")
68 1709435e Bernardo Dal Seno
  if downgrade:
69 1709435e Bernardo Dal Seno
    cmd.append("--downgrade")
70 aefbe369 Michael Hanselmann
71 aefbe369 Michael Hanselmann
  result = utils.RunCmd(cmd, cwd=os.getcwd())
72 aefbe369 Michael Hanselmann
  if result.failed:
73 aefbe369 Michael Hanselmann
    raise Exception("cfgupgrade failed: %s, output %r" %
74 aefbe369 Michael Hanselmann
                    (result.fail_reason, result.output))
75 aefbe369 Michael Hanselmann
76 aefbe369 Michael Hanselmann
77 aefbe369 Michael Hanselmann
class TestCfgupgrade(unittest.TestCase):
78 aefbe369 Michael Hanselmann
  def setUp(self):
79 aefbe369 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
80 aefbe369 Michael Hanselmann
81 aefbe369 Michael Hanselmann
    self.config_path = utils.PathJoin(self.tmpdir, "config.data")
82 aefbe369 Michael Hanselmann
    self.noded_cert_path = utils.PathJoin(self.tmpdir, "server.pem")
83 aefbe369 Michael Hanselmann
    self.rapi_cert_path = utils.PathJoin(self.tmpdir, "rapi.pem")
84 fdd9ac5b Michael Hanselmann
    self.rapi_users_path = utils.PathJoin(self.tmpdir, "rapi", "users")
85 fdd9ac5b Michael Hanselmann
    self.rapi_users_path_pre24 = utils.PathJoin(self.tmpdir, "rapi_users")
86 aefbe369 Michael Hanselmann
    self.known_hosts_path = utils.PathJoin(self.tmpdir, "known_hosts")
87 aefbe369 Michael Hanselmann
    self.confd_hmac_path = utils.PathJoin(self.tmpdir, "hmac.key")
88 aefbe369 Michael Hanselmann
    self.cds_path = utils.PathJoin(self.tmpdir, "cluster-domain-secret")
89 011974df Michael Hanselmann
    self.ss_master_node_path = utils.PathJoin(self.tmpdir, "ssconf_master_node")
90 7939f60c Michael Hanselmann
    self.file_storage_paths = utils.PathJoin(self.tmpdir, "file-storage-paths")
91 aefbe369 Michael Hanselmann
92 aefbe369 Michael Hanselmann
  def tearDown(self):
93 aefbe369 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
94 aefbe369 Michael Hanselmann
95 aefbe369 Michael Hanselmann
  def _LoadConfig(self):
96 aefbe369 Michael Hanselmann
    return serializer.LoadJson(utils.ReadFile(self.config_path))
97 aefbe369 Michael Hanselmann
98 cd315ad9 Bernardo Dal Seno
  def _LoadTestDataConfig(self, filename):
99 cd315ad9 Bernardo Dal Seno
    return serializer.LoadJson(testutils.ReadTestData(filename))
100 cd315ad9 Bernardo Dal Seno
101 aefbe369 Michael Hanselmann
  def _CreateValidConfigDir(self):
102 aefbe369 Michael Hanselmann
    utils.WriteFile(self.noded_cert_path, data="")
103 aefbe369 Michael Hanselmann
    utils.WriteFile(self.known_hosts_path, data="")
104 011974df Michael Hanselmann
    utils.WriteFile(self.ss_master_node_path,
105 011974df Michael Hanselmann
                    data="node.has.another.name.example.net")
106 aefbe369 Michael Hanselmann
107 aefbe369 Michael Hanselmann
  def testNoConfigDir(self):
108 aefbe369 Michael Hanselmann
    self.assertFalse(utils.ListVisibleFiles(self.tmpdir))
109 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
110 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, True, True)
111 aefbe369 Michael Hanselmann
112 011974df Michael Hanselmann
  def testWrongHostname(self):
113 011974df Michael Hanselmann
    self._CreateValidConfigDir()
114 011974df Michael Hanselmann
115 b555101c Thomas Thrainer
    utils.WriteFile(self.config_path,
116 b555101c Thomas Thrainer
                    data=serializer.DumpJson(GetMinimalConfig()))
117 011974df Michael Hanselmann
118 011974df Michael Hanselmann
    hostname = netutils.GetHostname().name
119 011974df Michael Hanselmann
    assert hostname != utils.ReadOneLineFile(self.ss_master_node_path)
120 011974df Michael Hanselmann
121 011974df Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True,
122 011974df Michael Hanselmann
                      ignore_hostname=False)
123 011974df Michael Hanselmann
124 011974df Michael Hanselmann
  def testCorrectHostname(self):
125 011974df Michael Hanselmann
    self._CreateValidConfigDir()
126 011974df Michael Hanselmann
127 b555101c Thomas Thrainer
    utils.WriteFile(self.config_path,
128 b555101c Thomas Thrainer
                    data=serializer.DumpJson(GetMinimalConfig()))
129 011974df Michael Hanselmann
130 011974df Michael Hanselmann
    utils.WriteFile(self.ss_master_node_path,
131 011974df Michael Hanselmann
                    data="%s\n" % netutils.GetHostname().name)
132 011974df Michael Hanselmann
133 011974df Michael Hanselmann
    _RunUpgrade(self.tmpdir, False, True, ignore_hostname=False)
134 011974df Michael Hanselmann
135 aefbe369 Michael Hanselmann
  def testInconsistentConfig(self):
136 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
137 aefbe369 Michael Hanselmann
    # There should be no "config_version"
138 b555101c Thomas Thrainer
    cfg = GetMinimalConfig()
139 b555101c Thomas Thrainer
    cfg["version"] = 0
140 b555101c Thomas Thrainer
    cfg["cluster"]["config_version"] = 0
141 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
142 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
143 aefbe369 Michael Hanselmann
144 aefbe369 Michael Hanselmann
  def testInvalidConfig(self):
145 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
146 aefbe369 Michael Hanselmann
    # Missing version from config
147 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson({}))
148 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
149 aefbe369 Michael Hanselmann
150 cd315ad9 Bernardo Dal Seno
  def _TestUpgradeFromFile(self, filename, dry_run):
151 cd315ad9 Bernardo Dal Seno
    cfg = self._LoadTestDataConfig(filename)
152 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromData(cfg, dry_run)
153 cd315ad9 Bernardo Dal Seno
154 7939f60c Michael Hanselmann
  def _TestSimpleUpgrade(self, from_version, dry_run,
155 7939f60c Michael Hanselmann
                         file_storage_dir=None,
156 7939f60c Michael Hanselmann
                         shared_file_storage_dir=None):
157 b555101c Thomas Thrainer
    cfg = GetMinimalConfig()
158 b555101c Thomas Thrainer
    cfg["version"] = from_version
159 b555101c Thomas Thrainer
    cluster = cfg["cluster"]
160 7939f60c Michael Hanselmann
161 7939f60c Michael Hanselmann
    if file_storage_dir:
162 7939f60c Michael Hanselmann
      cluster["file_storage_dir"] = file_storage_dir
163 7939f60c Michael Hanselmann
    if shared_file_storage_dir:
164 7939f60c Michael Hanselmann
      cluster["shared_file_storage_dir"] = shared_file_storage_dir
165 7939f60c Michael Hanselmann
166 fa166f67 Bernardo Dal Seno
    self._TestUpgradeFromData(cfg, dry_run)
167 fa166f67 Bernardo Dal Seno
168 fa166f67 Bernardo Dal Seno
  def _TestUpgradeFromData(self, cfg, dry_run):
169 fa166f67 Bernardo Dal Seno
    assert "version" in cfg
170 fa166f67 Bernardo Dal Seno
    from_version = cfg["version"]
171 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
172 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
173 aefbe369 Michael Hanselmann
174 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.rapi_cert_path))
175 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.confd_hmac_path))
176 aefbe369 Michael Hanselmann
    self.assertFalse(os.path.isfile(self.cds_path))
177 aefbe369 Michael Hanselmann
178 aefbe369 Michael Hanselmann
    _RunUpgrade(self.tmpdir, dry_run, True)
179 aefbe369 Michael Hanselmann
180 aefbe369 Michael Hanselmann
    if dry_run:
181 aefbe369 Michael Hanselmann
      expversion = from_version
182 aefbe369 Michael Hanselmann
      checkfn = operator.not_
183 aefbe369 Michael Hanselmann
    else:
184 aefbe369 Michael Hanselmann
      expversion = constants.CONFIG_VERSION
185 aefbe369 Michael Hanselmann
      checkfn = operator.truth
186 aefbe369 Michael Hanselmann
187 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.rapi_cert_path)))
188 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.confd_hmac_path)))
189 aefbe369 Michael Hanselmann
    self.assert_(checkfn(os.path.isfile(self.cds_path)))
190 aefbe369 Michael Hanselmann
191 aefbe369 Michael Hanselmann
    newcfg = self._LoadConfig()
192 aefbe369 Michael Hanselmann
    self.assertEqual(newcfg["version"], expversion)
193 aefbe369 Michael Hanselmann
194 fdd9ac5b Michael Hanselmann
  def testRapiUsers(self):
195 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
196 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
197 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(os.path.dirname(self.rapi_users_path)))
198 fdd9ac5b Michael Hanselmann
199 fdd9ac5b Michael Hanselmann
    utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
200 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
201 fdd9ac5b Michael Hanselmann
202 87c80992 Michael Hanselmann
    self.assertTrue(os.path.isdir(os.path.dirname(self.rapi_users_path)))
203 fdd9ac5b Michael Hanselmann
    self.assert_(os.path.islink(self.rapi_users_path_pre24))
204 fdd9ac5b Michael Hanselmann
    self.assert_(os.path.isfile(self.rapi_users_path))
205 87c80992 Michael Hanselmann
    self.assertEqual(os.readlink(self.rapi_users_path_pre24),
206 87c80992 Michael Hanselmann
                     self.rapi_users_path)
207 fdd9ac5b Michael Hanselmann
    for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
208 fdd9ac5b Michael Hanselmann
      self.assertEqual(utils.ReadFile(path), "some user\n")
209 fdd9ac5b Michael Hanselmann
210 fdd9ac5b Michael Hanselmann
  def testRapiUsers24AndAbove(self):
211 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
212 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
213 fdd9ac5b Michael Hanselmann
214 fdd9ac5b Michael Hanselmann
    os.mkdir(os.path.dirname(self.rapi_users_path))
215 fdd9ac5b Michael Hanselmann
    utils.WriteFile(self.rapi_users_path, data="other user\n")
216 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
217 fdd9ac5b Michael Hanselmann
218 fdd9ac5b Michael Hanselmann
    self.assert_(os.path.islink(self.rapi_users_path_pre24))
219 fdd9ac5b Michael Hanselmann
    self.assert_(os.path.isfile(self.rapi_users_path))
220 87c80992 Michael Hanselmann
    self.assertEqual(os.readlink(self.rapi_users_path_pre24),
221 87c80992 Michael Hanselmann
                     self.rapi_users_path)
222 fdd9ac5b Michael Hanselmann
    for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
223 fdd9ac5b Michael Hanselmann
      self.assertEqual(utils.ReadFile(path), "other user\n")
224 fdd9ac5b Michael Hanselmann
225 fdd9ac5b Michael Hanselmann
  def testRapiUsersExistingSymlink(self):
226 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
227 fdd9ac5b Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
228 fdd9ac5b Michael Hanselmann
229 87c80992 Michael Hanselmann
    os.mkdir(os.path.dirname(self.rapi_users_path))
230 fdd9ac5b Michael Hanselmann
    os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
231 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path, data="hello world\n")
232 fdd9ac5b Michael Hanselmann
233 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
234 fdd9ac5b Michael Hanselmann
235 87c80992 Michael Hanselmann
    self.assert_(os.path.isfile(self.rapi_users_path) and
236 87c80992 Michael Hanselmann
                 not os.path.islink(self.rapi_users_path))
237 fdd9ac5b Michael Hanselmann
    self.assert_(os.path.islink(self.rapi_users_path_pre24))
238 87c80992 Michael Hanselmann
    self.assertEqual(os.readlink(self.rapi_users_path_pre24),
239 87c80992 Michael Hanselmann
                     self.rapi_users_path)
240 87c80992 Michael Hanselmann
    for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
241 87c80992 Michael Hanselmann
      self.assertEqual(utils.ReadFile(path), "hello world\n")
242 87c80992 Michael Hanselmann
243 87c80992 Michael Hanselmann
  def testRapiUsersExistingTarget(self):
244 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
245 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
246 87c80992 Michael Hanselmann
247 87c80992 Michael Hanselmann
    os.mkdir(os.path.dirname(self.rapi_users_path))
248 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path, data="other user\n")
249 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path_pre24, data="hello world\n")
250 87c80992 Michael Hanselmann
251 87c80992 Michael Hanselmann
    self.assertRaises(Exception, self._TestSimpleUpgrade,
252 87c80992 Michael Hanselmann
                      constants.BuildVersion(2, 2, 0), False)
253 87c80992 Michael Hanselmann
254 87c80992 Michael Hanselmann
    for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
255 87c80992 Michael Hanselmann
      self.assert_(os.path.isfile(path) and not os.path.islink(path))
256 87c80992 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.rapi_users_path), "other user\n")
257 87c80992 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.rapi_users_path_pre24),
258 87c80992 Michael Hanselmann
                     "hello world\n")
259 87c80992 Michael Hanselmann
260 87c80992 Michael Hanselmann
  def testRapiUsersDryRun(self):
261 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
262 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
263 87c80992 Michael Hanselmann
264 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
265 87c80992 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
266 87c80992 Michael Hanselmann
267 87c80992 Michael Hanselmann
    self.assertFalse(os.path.isdir(os.path.dirname(self.rapi_users_path)))
268 87c80992 Michael Hanselmann
    self.assertTrue(os.path.isfile(self.rapi_users_path_pre24) and
269 87c80992 Michael Hanselmann
                    not os.path.islink(self.rapi_users_path_pre24))
270 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
271 87c80992 Michael Hanselmann
272 87c80992 Michael Hanselmann
  def testRapiUsers24AndAboveDryRun(self):
273 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
274 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
275 87c80992 Michael Hanselmann
276 87c80992 Michael Hanselmann
    os.mkdir(os.path.dirname(self.rapi_users_path))
277 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path, data="other user\n")
278 87c80992 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
279 87c80992 Michael Hanselmann
280 87c80992 Michael Hanselmann
    self.assertTrue(os.path.isfile(self.rapi_users_path) and
281 87c80992 Michael Hanselmann
                    not os.path.islink(self.rapi_users_path))
282 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
283 87c80992 Michael Hanselmann
    self.assertEqual(utils.ReadFile(self.rapi_users_path), "other user\n")
284 87c80992 Michael Hanselmann
285 87c80992 Michael Hanselmann
  def testRapiUsersExistingSymlinkDryRun(self):
286 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path))
287 87c80992 Michael Hanselmann
    self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
288 87c80992 Michael Hanselmann
289 87c80992 Michael Hanselmann
    os.mkdir(os.path.dirname(self.rapi_users_path))
290 87c80992 Michael Hanselmann
    os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
291 87c80992 Michael Hanselmann
    utils.WriteFile(self.rapi_users_path, data="hello world\n")
292 87c80992 Michael Hanselmann
293 87c80992 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
294 87c80992 Michael Hanselmann
295 87c80992 Michael Hanselmann
    self.assertTrue(os.path.islink(self.rapi_users_path_pre24))
296 87c80992 Michael Hanselmann
    self.assertTrue(os.path.isfile(self.rapi_users_path) and
297 87c80992 Michael Hanselmann
                    not os.path.islink(self.rapi_users_path))
298 87c80992 Michael Hanselmann
    self.assertEqual(os.readlink(self.rapi_users_path_pre24),
299 87c80992 Michael Hanselmann
                     self.rapi_users_path)
300 fdd9ac5b Michael Hanselmann
    for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
301 fdd9ac5b Michael Hanselmann
      self.assertEqual(utils.ReadFile(path), "hello world\n")
302 fdd9ac5b Michael Hanselmann
303 7939f60c Michael Hanselmann
  def testFileStoragePathsDryRun(self):
304 7939f60c Michael Hanselmann
    self.assertFalse(os.path.exists(self.file_storage_paths))
305 7939f60c Michael Hanselmann
306 7939f60c Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True,
307 7939f60c Michael Hanselmann
                            file_storage_dir=self.tmpdir,
308 7939f60c Michael Hanselmann
                            shared_file_storage_dir="/tmp")
309 7939f60c Michael Hanselmann
310 7939f60c Michael Hanselmann
    self.assertFalse(os.path.exists(self.file_storage_paths))
311 7939f60c Michael Hanselmann
312 7939f60c Michael Hanselmann
  def testFileStoragePathsBoth(self):
313 7939f60c Michael Hanselmann
    self.assertFalse(os.path.exists(self.file_storage_paths))
314 7939f60c Michael Hanselmann
315 7939f60c Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), False,
316 7939f60c Michael Hanselmann
                            file_storage_dir=self.tmpdir,
317 7939f60c Michael Hanselmann
                            shared_file_storage_dir="/tmp")
318 7939f60c Michael Hanselmann
319 7939f60c Michael Hanselmann
    lines = utils.ReadFile(self.file_storage_paths).splitlines()
320 7939f60c Michael Hanselmann
    self.assertTrue(lines.pop(0).startswith("# "))
321 7939f60c Michael Hanselmann
    self.assertTrue(lines.pop(0).startswith("# cfgupgrade"))
322 7939f60c Michael Hanselmann
    self.assertEqual(lines.pop(0), self.tmpdir)
323 7939f60c Michael Hanselmann
    self.assertEqual(lines.pop(0), "/tmp")
324 7939f60c Michael Hanselmann
    self.assertFalse(lines)
325 7939f60c Michael Hanselmann
    self.assertEqual(os.stat(self.file_storage_paths).st_mode & 0777,
326 7939f60c Michael Hanselmann
                     0600, msg="Wrong permissions")
327 7939f60c Michael Hanselmann
328 7939f60c Michael Hanselmann
  def testFileStoragePathsSharedOnly(self):
329 7939f60c Michael Hanselmann
    self.assertFalse(os.path.exists(self.file_storage_paths))
330 7939f60c Michael Hanselmann
331 7939f60c Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), False,
332 7939f60c Michael Hanselmann
                            file_storage_dir=None,
333 7939f60c Michael Hanselmann
                            shared_file_storage_dir=self.tmpdir)
334 7939f60c Michael Hanselmann
335 7939f60c Michael Hanselmann
    lines = utils.ReadFile(self.file_storage_paths).splitlines()
336 7939f60c Michael Hanselmann
    self.assertTrue(lines.pop(0).startswith("# "))
337 7939f60c Michael Hanselmann
    self.assertTrue(lines.pop(0).startswith("# cfgupgrade"))
338 7939f60c Michael Hanselmann
    self.assertEqual(lines.pop(0), self.tmpdir)
339 7939f60c Michael Hanselmann
    self.assertFalse(lines)
340 7939f60c Michael Hanselmann
341 aefbe369 Michael Hanselmann
  def testUpgradeFrom_2_0(self):
342 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), False)
343 aefbe369 Michael Hanselmann
344 aefbe369 Michael Hanselmann
  def testUpgradeFrom_2_1(self):
345 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), False)
346 aefbe369 Michael Hanselmann
347 fdd9ac5b Michael Hanselmann
  def testUpgradeFrom_2_2(self):
348 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
349 fdd9ac5b Michael Hanselmann
350 fdd9ac5b Michael Hanselmann
  def testUpgradeFrom_2_3(self):
351 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
352 fdd9ac5b Michael Hanselmann
353 a91f69c4 Michael Hanselmann
  def testUpgradeFrom_2_4(self):
354 a91f69c4 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), False)
355 a91f69c4 Michael Hanselmann
356 9f604ab8 Michael Hanselmann
  def testUpgradeFrom_2_5(self):
357 9f604ab8 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), False)
358 9f604ab8 Michael Hanselmann
359 93fd9bb1 Iustin Pop
  def testUpgradeFrom_2_6(self):
360 93fd9bb1 Iustin Pop
    self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), False)
361 93fd9bb1 Iustin Pop
362 cd315ad9 Bernardo Dal Seno
  def testUpgradeFrom_2_7(self):
363 cd315ad9 Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.BuildVersion(2, 7, 0), False)
364 cd315ad9 Bernardo Dal Seno
365 cd315ad9 Bernardo Dal Seno
  def testUpgradeFullConfigFrom_2_7(self):
366 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.7.json", False)
367 cd315ad9 Bernardo Dal Seno
368 c294f84e Bernardo Dal Seno
  def testUpgradeFullConfigFrom_2_8(self):
369 c294f84e Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.8.json", False)
370 c294f84e Bernardo Dal Seno
371 aefbe369 Michael Hanselmann
  def testUpgradeCurrent(self):
372 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
373 aefbe369 Michael Hanselmann
374 fa166f67 Bernardo Dal Seno
  def _RunDowngradeUpgrade(self):
375 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
376 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
377 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True)
378 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
379 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
380 1709435e Bernardo Dal Seno
381 fa166f67 Bernardo Dal Seno
  def testDowngrade(self):
382 1709435e Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
383 fa166f67 Bernardo Dal Seno
    self._RunDowngradeUpgrade()
384 fa166f67 Bernardo Dal Seno
385 cd315ad9 Bernardo Dal Seno
  def testDowngradeFullConfig(self):
386 cd315ad9 Bernardo Dal Seno
    """Test for upgrade + downgrade combination."""
387 cd315ad9 Bernardo Dal Seno
    # This test can work only with the previous version of a configuration!
388 c294f84e Bernardo Dal Seno
    oldconfname = "cluster_config_2.8.json"
389 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile(oldconfname, False)
390 cd315ad9 Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
391 cd315ad9 Bernardo Dal Seno
    oldconf = self._LoadTestDataConfig(oldconfname)
392 cd315ad9 Bernardo Dal Seno
    newconf = self._LoadConfig()
393 cd315ad9 Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
394 cd315ad9 Bernardo Dal Seno
395 cd315ad9 Bernardo Dal Seno
  def testDowngradeFullConfigBackwardFrom_2_7(self):
396 cd315ad9 Bernardo Dal Seno
    """Test for upgrade + downgrade + upgrade combination."""
397 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.7.json", False)
398 cd315ad9 Bernardo Dal Seno
    self._RunDowngradeUpgrade()
399 cd315ad9 Bernardo Dal Seno
400 fa166f67 Bernardo Dal Seno
  def _RunDowngradeTwice(self):
401 fa166f67 Bernardo Dal Seno
    """Make sure that downgrade is idempotent."""
402 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
403 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
404 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
405 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
406 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
407 1709435e Bernardo Dal Seno
408 fa166f67 Bernardo Dal Seno
  def testDowngradeTwice(self):
409 fa166f67 Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
410 fa166f67 Bernardo Dal Seno
    self._RunDowngradeTwice()
411 fa166f67 Bernardo Dal Seno
412 cd315ad9 Bernardo Dal Seno
  def testDowngradeTwiceFullConfigFrom_2_7(self):
413 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.7.json", False)
414 cd315ad9 Bernardo Dal Seno
    self._RunDowngradeTwice()
415 cd315ad9 Bernardo Dal Seno
416 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_0(self):
417 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True)
418 aefbe369 Michael Hanselmann
419 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_1(self):
420 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True)
421 aefbe369 Michael Hanselmann
422 fdd9ac5b Michael Hanselmann
  def testUpgradeDryRunFrom_2_2(self):
423 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
424 fdd9ac5b Michael Hanselmann
425 fdd9ac5b Michael Hanselmann
  def testUpgradeDryRunFrom_2_3(self):
426 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
427 fdd9ac5b Michael Hanselmann
428 a91f69c4 Michael Hanselmann
  def testUpgradeDryRunFrom_2_4(self):
429 a91f69c4 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), True)
430 a91f69c4 Michael Hanselmann
431 9f604ab8 Michael Hanselmann
  def testUpgradeDryRunFrom_2_5(self):
432 9f604ab8 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), True)
433 9f604ab8 Michael Hanselmann
434 93fd9bb1 Iustin Pop
  def testUpgradeDryRunFrom_2_6(self):
435 93fd9bb1 Iustin Pop
    self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True)
436 93fd9bb1 Iustin Pop
437 aefbe369 Michael Hanselmann
  def testUpgradeCurrentDryRun(self):
438 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, True)
439 aefbe369 Michael Hanselmann
440 1709435e Bernardo Dal Seno
  def testDowngradeDryRun(self):
441 1709435e Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
442 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
443 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, True, True, downgrade=True)
444 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
445 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf["version"], newconf["version"])
446 aefbe369 Michael Hanselmann
447 aefbe369 Michael Hanselmann
if __name__ == "__main__":
448 aefbe369 Michael Hanselmann
  testutils.GanetiTestProgram()