Statistics
| Branch: | Tag: | Revision:

root / test / py / cfgupgrade_unittest.py @ bcab7a50

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