Statistics
| Branch: | Tag: | Revision:

root / test / py / cfgupgrade_unittest.py @ d79a6502

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