Statistics
| Branch: | Tag: | Revision:

root / test / py / cfgupgrade_unittest.py @ 7352d33b

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 1709435e Bernardo Dal Seno
def _RunUpgrade(path, dry_run, no_verify, ignore_hostname=True,
41 1709435e Bernardo Dal Seno
                downgrade=False):
42 aefbe369 Michael Hanselmann
  cmd = [sys.executable, "%s/tools/cfgupgrade" % testutils.GetSourceDir(),
43 7939f60c Michael Hanselmann
         "--debug", "--force", "--path=%s" % path, "--confdir=%s" % path]
44 011974df Michael Hanselmann
45 011974df Michael Hanselmann
  if ignore_hostname:
46 011974df Michael Hanselmann
    cmd.append("--ignore-hostname")
47 aefbe369 Michael Hanselmann
  if dry_run:
48 aefbe369 Michael Hanselmann
    cmd.append("--dry-run")
49 aefbe369 Michael Hanselmann
  if no_verify:
50 aefbe369 Michael Hanselmann
    cmd.append("--no-verify")
51 1709435e Bernardo Dal Seno
  if downgrade:
52 1709435e Bernardo Dal Seno
    cmd.append("--downgrade")
53 aefbe369 Michael Hanselmann
54 aefbe369 Michael Hanselmann
  result = utils.RunCmd(cmd, cwd=os.getcwd())
55 aefbe369 Michael Hanselmann
  if result.failed:
56 aefbe369 Michael Hanselmann
    raise Exception("cfgupgrade failed: %s, output %r" %
57 aefbe369 Michael Hanselmann
                    (result.fail_reason, result.output))
58 aefbe369 Michael Hanselmann
59 aefbe369 Michael Hanselmann
60 aefbe369 Michael Hanselmann
class TestCfgupgrade(unittest.TestCase):
61 aefbe369 Michael Hanselmann
  def setUp(self):
62 aefbe369 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
63 aefbe369 Michael Hanselmann
64 aefbe369 Michael Hanselmann
    self.config_path = utils.PathJoin(self.tmpdir, "config.data")
65 aefbe369 Michael Hanselmann
    self.noded_cert_path = utils.PathJoin(self.tmpdir, "server.pem")
66 aefbe369 Michael Hanselmann
    self.rapi_cert_path = utils.PathJoin(self.tmpdir, "rapi.pem")
67 fdd9ac5b Michael Hanselmann
    self.rapi_users_path = utils.PathJoin(self.tmpdir, "rapi", "users")
68 fdd9ac5b Michael Hanselmann
    self.rapi_users_path_pre24 = utils.PathJoin(self.tmpdir, "rapi_users")
69 aefbe369 Michael Hanselmann
    self.known_hosts_path = utils.PathJoin(self.tmpdir, "known_hosts")
70 aefbe369 Michael Hanselmann
    self.confd_hmac_path = utils.PathJoin(self.tmpdir, "hmac.key")
71 aefbe369 Michael Hanselmann
    self.cds_path = utils.PathJoin(self.tmpdir, "cluster-domain-secret")
72 011974df Michael Hanselmann
    self.ss_master_node_path = utils.PathJoin(self.tmpdir, "ssconf_master_node")
73 7939f60c Michael Hanselmann
    self.file_storage_paths = utils.PathJoin(self.tmpdir, "file-storage-paths")
74 aefbe369 Michael Hanselmann
75 aefbe369 Michael Hanselmann
  def tearDown(self):
76 aefbe369 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
77 aefbe369 Michael Hanselmann
78 aefbe369 Michael Hanselmann
  def _LoadConfig(self):
79 aefbe369 Michael Hanselmann
    return serializer.LoadJson(utils.ReadFile(self.config_path))
80 aefbe369 Michael Hanselmann
81 cd315ad9 Bernardo Dal Seno
  def _LoadTestDataConfig(self, filename):
82 cd315ad9 Bernardo Dal Seno
    return serializer.LoadJson(testutils.ReadTestData(filename))
83 cd315ad9 Bernardo Dal Seno
84 aefbe369 Michael Hanselmann
  def _CreateValidConfigDir(self):
85 aefbe369 Michael Hanselmann
    utils.WriteFile(self.noded_cert_path, data="")
86 aefbe369 Michael Hanselmann
    utils.WriteFile(self.known_hosts_path, data="")
87 011974df Michael Hanselmann
    utils.WriteFile(self.ss_master_node_path,
88 011974df Michael Hanselmann
                    data="node.has.another.name.example.net")
89 aefbe369 Michael Hanselmann
90 aefbe369 Michael Hanselmann
  def testNoConfigDir(self):
91 aefbe369 Michael Hanselmann
    self.assertFalse(utils.ListVisibleFiles(self.tmpdir))
92 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
93 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, True, True)
94 aefbe369 Michael Hanselmann
95 011974df Michael Hanselmann
  def testWrongHostname(self):
96 011974df Michael Hanselmann
    self._CreateValidConfigDir()
97 011974df Michael Hanselmann
98 011974df Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson({
99 011974df Michael Hanselmann
      "version": constants.CONFIG_VERSION,
100 011974df Michael Hanselmann
      "cluster": {},
101 a19d8cd5 Iustin Pop
      "instances": {},
102 6e8091f9 Dimitris Aragiorgis
      "nodegroups": {},
103 011974df Michael Hanselmann
      }))
104 011974df Michael Hanselmann
105 011974df Michael Hanselmann
    hostname = netutils.GetHostname().name
106 011974df Michael Hanselmann
    assert hostname != utils.ReadOneLineFile(self.ss_master_node_path)
107 011974df Michael Hanselmann
108 011974df Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True,
109 011974df Michael Hanselmann
                      ignore_hostname=False)
110 011974df Michael Hanselmann
111 011974df Michael Hanselmann
  def testCorrectHostname(self):
112 011974df Michael Hanselmann
    self._CreateValidConfigDir()
113 011974df Michael Hanselmann
114 011974df Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson({
115 011974df Michael Hanselmann
      "version": constants.CONFIG_VERSION,
116 011974df Michael Hanselmann
      "cluster": {},
117 a19d8cd5 Iustin Pop
      "instances": {},
118 6e8091f9 Dimitris Aragiorgis
      "nodegroups": {},
119 011974df Michael Hanselmann
      }))
120 011974df Michael Hanselmann
121 011974df Michael Hanselmann
    utils.WriteFile(self.ss_master_node_path,
122 011974df Michael Hanselmann
                    data="%s\n" % netutils.GetHostname().name)
123 011974df Michael Hanselmann
124 011974df Michael Hanselmann
    _RunUpgrade(self.tmpdir, False, True, ignore_hostname=False)
125 011974df Michael Hanselmann
126 aefbe369 Michael Hanselmann
  def testInconsistentConfig(self):
127 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
128 aefbe369 Michael Hanselmann
    # There should be no "config_version"
129 aefbe369 Michael Hanselmann
    cfg = {
130 aefbe369 Michael Hanselmann
      "version": 0,
131 aefbe369 Michael Hanselmann
      "cluster": {
132 aefbe369 Michael Hanselmann
        "config_version": 0,
133 aefbe369 Michael Hanselmann
        },
134 a19d8cd5 Iustin Pop
      "instances": {},
135 6e8091f9 Dimitris Aragiorgis
      "nodegroups": {},
136 aefbe369 Michael Hanselmann
      }
137 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
138 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
139 aefbe369 Michael Hanselmann
140 aefbe369 Michael Hanselmann
  def testInvalidConfig(self):
141 aefbe369 Michael Hanselmann
    self._CreateValidConfigDir()
142 aefbe369 Michael Hanselmann
    # Missing version from config
143 aefbe369 Michael Hanselmann
    utils.WriteFile(self.config_path, data=serializer.DumpJson({}))
144 aefbe369 Michael Hanselmann
    self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
145 aefbe369 Michael Hanselmann
146 cd315ad9 Bernardo Dal Seno
  def _TestUpgradeFromFile(self, filename, dry_run):
147 cd315ad9 Bernardo Dal Seno
    cfg = self._LoadTestDataConfig(filename)
148 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromData(cfg, dry_run)
149 cd315ad9 Bernardo Dal Seno
150 7939f60c Michael Hanselmann
  def _TestSimpleUpgrade(self, from_version, dry_run,
151 7939f60c Michael Hanselmann
                         file_storage_dir=None,
152 7939f60c Michael Hanselmann
                         shared_file_storage_dir=None):
153 7939f60c Michael Hanselmann
    cluster = {}
154 7939f60c Michael Hanselmann
155 7939f60c Michael Hanselmann
    if file_storage_dir:
156 7939f60c Michael Hanselmann
      cluster["file_storage_dir"] = file_storage_dir
157 7939f60c Michael Hanselmann
    if shared_file_storage_dir:
158 7939f60c Michael Hanselmann
      cluster["shared_file_storage_dir"] = shared_file_storage_dir
159 7939f60c Michael Hanselmann
160 aefbe369 Michael Hanselmann
    cfg = {
161 aefbe369 Michael Hanselmann
      "version": from_version,
162 7939f60c Michael Hanselmann
      "cluster": cluster,
163 a19d8cd5 Iustin Pop
      "instances": {},
164 6e8091f9 Dimitris Aragiorgis
      "nodegroups": {},
165 aefbe369 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 aefbe369 Michael Hanselmann
  def testUpgradeCurrent(self):
369 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
370 aefbe369 Michael Hanselmann
371 fa166f67 Bernardo Dal Seno
  def _RunDowngradeUpgrade(self):
372 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
373 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
374 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True)
375 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
376 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
377 1709435e Bernardo Dal Seno
378 fa166f67 Bernardo Dal Seno
  def testDowngrade(self):
379 1709435e Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
380 fa166f67 Bernardo Dal Seno
    self._RunDowngradeUpgrade()
381 fa166f67 Bernardo Dal Seno
382 cd315ad9 Bernardo Dal Seno
  def testDowngradeFullConfig(self):
383 cd315ad9 Bernardo Dal Seno
    """Test for upgrade + downgrade combination."""
384 cd315ad9 Bernardo Dal Seno
    # This test can work only with the previous version of a configuration!
385 cd315ad9 Bernardo Dal Seno
    # For 2.7, downgrading returns the original file only if group policies
386 cd315ad9 Bernardo Dal Seno
    # don't override instance specs, so we need to use an ad-hoc configuration.
387 cd315ad9 Bernardo Dal Seno
    oldconfname = "cluster_config_downgraded_2.7.json"
388 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile(oldconfname, False)
389 cd315ad9 Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
390 cd315ad9 Bernardo Dal Seno
    oldconf = self._LoadTestDataConfig(oldconfname)
391 cd315ad9 Bernardo Dal Seno
    newconf = self._LoadConfig()
392 cd315ad9 Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
393 cd315ad9 Bernardo Dal Seno
394 cd315ad9 Bernardo Dal Seno
  def testDowngradeFullConfigBackwardFrom_2_7(self):
395 cd315ad9 Bernardo Dal Seno
    """Test for upgrade + downgrade + upgrade combination."""
396 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.7.json", False)
397 cd315ad9 Bernardo Dal Seno
    self._RunDowngradeUpgrade()
398 cd315ad9 Bernardo Dal Seno
399 fa166f67 Bernardo Dal Seno
  def _RunDowngradeTwice(self):
400 fa166f67 Bernardo Dal Seno
    """Make sure that downgrade is idempotent."""
401 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
402 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
403 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, False, True, downgrade=True)
404 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
405 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf, newconf)
406 1709435e Bernardo Dal Seno
407 fa166f67 Bernardo Dal Seno
  def testDowngradeTwice(self):
408 fa166f67 Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
409 fa166f67 Bernardo Dal Seno
    self._RunDowngradeTwice()
410 fa166f67 Bernardo Dal Seno
411 cd315ad9 Bernardo Dal Seno
  def testDowngradeTwiceFullConfigFrom_2_7(self):
412 cd315ad9 Bernardo Dal Seno
    self._TestUpgradeFromFile("cluster_config_2.7.json", False)
413 cd315ad9 Bernardo Dal Seno
    self._RunDowngradeTwice()
414 cd315ad9 Bernardo Dal Seno
415 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_0(self):
416 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True)
417 aefbe369 Michael Hanselmann
418 aefbe369 Michael Hanselmann
  def testUpgradeDryRunFrom_2_1(self):
419 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True)
420 aefbe369 Michael Hanselmann
421 fdd9ac5b Michael Hanselmann
  def testUpgradeDryRunFrom_2_2(self):
422 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
423 fdd9ac5b Michael Hanselmann
424 fdd9ac5b Michael Hanselmann
  def testUpgradeDryRunFrom_2_3(self):
425 fdd9ac5b Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
426 fdd9ac5b Michael Hanselmann
427 a91f69c4 Michael Hanselmann
  def testUpgradeDryRunFrom_2_4(self):
428 a91f69c4 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), True)
429 a91f69c4 Michael Hanselmann
430 9f604ab8 Michael Hanselmann
  def testUpgradeDryRunFrom_2_5(self):
431 9f604ab8 Michael Hanselmann
    self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), True)
432 9f604ab8 Michael Hanselmann
433 93fd9bb1 Iustin Pop
  def testUpgradeDryRunFrom_2_6(self):
434 93fd9bb1 Iustin Pop
    self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True)
435 93fd9bb1 Iustin Pop
436 aefbe369 Michael Hanselmann
  def testUpgradeCurrentDryRun(self):
437 aefbe369 Michael Hanselmann
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, True)
438 aefbe369 Michael Hanselmann
439 1709435e Bernardo Dal Seno
  def testDowngradeDryRun(self):
440 1709435e Bernardo Dal Seno
    self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
441 1709435e Bernardo Dal Seno
    oldconf = self._LoadConfig()
442 1709435e Bernardo Dal Seno
    _RunUpgrade(self.tmpdir, True, True, downgrade=True)
443 1709435e Bernardo Dal Seno
    newconf = self._LoadConfig()
444 1709435e Bernardo Dal Seno
    self.assertEqual(oldconf["version"], newconf["version"])
445 aefbe369 Michael Hanselmann
446 aefbe369 Michael Hanselmann
if __name__ == "__main__":
447 aefbe369 Michael Hanselmann
  testutils.GanetiTestProgram()