4 # Copyright (C) 2010, 2012 Google Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 """Script for testing tools/cfgupgrade"""
31 from ganeti import constants
32 from ganeti import utils
33 from ganeti import errors
34 from ganeti import serializer
35 from ganeti import netutils
40 def _RunUpgrade(path, dry_run, no_verify, ignore_hostname=True):
41 cmd = [sys.executable, "%s/tools/cfgupgrade" % testutils.GetSourceDir(),
42 "--debug", "--force", "--path=%s" % path]
45 cmd.append("--ignore-hostname")
47 cmd.append("--dry-run")
49 cmd.append("--no-verify")
51 result = utils.RunCmd(cmd, cwd=os.getcwd())
53 raise Exception("cfgupgrade failed: %s, output %r" %
54 (result.fail_reason, result.output))
57 class TestCfgupgrade(unittest.TestCase):
59 self.tmpdir = tempfile.mkdtemp()
61 self.config_path = utils.PathJoin(self.tmpdir, "config.data")
62 self.noded_cert_path = utils.PathJoin(self.tmpdir, "server.pem")
63 self.rapi_cert_path = utils.PathJoin(self.tmpdir, "rapi.pem")
64 self.rapi_users_path = utils.PathJoin(self.tmpdir, "rapi", "users")
65 self.rapi_users_path_pre24 = utils.PathJoin(self.tmpdir, "rapi_users")
66 self.known_hosts_path = utils.PathJoin(self.tmpdir, "known_hosts")
67 self.confd_hmac_path = utils.PathJoin(self.tmpdir, "hmac.key")
68 self.cds_path = utils.PathJoin(self.tmpdir, "cluster-domain-secret")
69 self.ss_master_node_path = utils.PathJoin(self.tmpdir, "ssconf_master_node")
72 shutil.rmtree(self.tmpdir)
74 def _LoadConfig(self):
75 return serializer.LoadJson(utils.ReadFile(self.config_path))
77 def _CreateValidConfigDir(self):
78 utils.WriteFile(self.noded_cert_path, data="")
79 utils.WriteFile(self.known_hosts_path, data="")
80 utils.WriteFile(self.ss_master_node_path,
81 data="node.has.another.name.example.net")
83 def testNoConfigDir(self):
84 self.assertFalse(utils.ListVisibleFiles(self.tmpdir))
85 self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
86 self.assertRaises(Exception, _RunUpgrade, self.tmpdir, True, True)
88 def testWrongHostname(self):
89 self._CreateValidConfigDir()
91 utils.WriteFile(self.config_path, data=serializer.DumpJson({
92 "version": constants.CONFIG_VERSION,
97 hostname = netutils.GetHostname().name
98 assert hostname != utils.ReadOneLineFile(self.ss_master_node_path)
100 self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True,
101 ignore_hostname=False)
103 def testCorrectHostname(self):
104 self._CreateValidConfigDir()
106 utils.WriteFile(self.config_path, data=serializer.DumpJson({
107 "version": constants.CONFIG_VERSION,
112 utils.WriteFile(self.ss_master_node_path,
113 data="%s\n" % netutils.GetHostname().name)
115 _RunUpgrade(self.tmpdir, False, True, ignore_hostname=False)
117 def testInconsistentConfig(self):
118 self._CreateValidConfigDir()
119 # There should be no "config_version"
127 utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
128 self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
130 def testInvalidConfig(self):
131 self._CreateValidConfigDir()
132 # Missing version from config
133 utils.WriteFile(self.config_path, data=serializer.DumpJson({}))
134 self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True)
136 def _TestSimpleUpgrade(self, from_version, dry_run):
138 "version": from_version,
142 self._CreateValidConfigDir()
143 utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg))
145 self.assertFalse(os.path.isfile(self.rapi_cert_path))
146 self.assertFalse(os.path.isfile(self.confd_hmac_path))
147 self.assertFalse(os.path.isfile(self.cds_path))
149 _RunUpgrade(self.tmpdir, dry_run, True)
152 expversion = from_version
153 checkfn = operator.not_
155 expversion = constants.CONFIG_VERSION
156 checkfn = operator.truth
158 self.assert_(checkfn(os.path.isfile(self.rapi_cert_path)))
159 self.assert_(checkfn(os.path.isfile(self.confd_hmac_path)))
160 self.assert_(checkfn(os.path.isfile(self.cds_path)))
162 newcfg = self._LoadConfig()
163 self.assertEqual(newcfg["version"], expversion)
165 def testRapiUsers(self):
166 self.assertFalse(os.path.exists(self.rapi_users_path))
167 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
168 self.assertFalse(os.path.exists(os.path.dirname(self.rapi_users_path)))
170 utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
171 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
173 self.assertTrue(os.path.isdir(os.path.dirname(self.rapi_users_path)))
174 self.assert_(os.path.islink(self.rapi_users_path_pre24))
175 self.assert_(os.path.isfile(self.rapi_users_path))
176 self.assertEqual(os.readlink(self.rapi_users_path_pre24),
177 self.rapi_users_path)
178 for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
179 self.assertEqual(utils.ReadFile(path), "some user\n")
181 def testRapiUsers24AndAbove(self):
182 self.assertFalse(os.path.exists(self.rapi_users_path))
183 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
185 os.mkdir(os.path.dirname(self.rapi_users_path))
186 utils.WriteFile(self.rapi_users_path, data="other user\n")
187 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
189 self.assert_(os.path.islink(self.rapi_users_path_pre24))
190 self.assert_(os.path.isfile(self.rapi_users_path))
191 self.assertEqual(os.readlink(self.rapi_users_path_pre24),
192 self.rapi_users_path)
193 for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
194 self.assertEqual(utils.ReadFile(path), "other user\n")
196 def testRapiUsersExistingSymlink(self):
197 self.assertFalse(os.path.exists(self.rapi_users_path))
198 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
200 os.mkdir(os.path.dirname(self.rapi_users_path))
201 os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
202 utils.WriteFile(self.rapi_users_path, data="hello world\n")
204 self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
206 self.assert_(os.path.isfile(self.rapi_users_path) and
207 not os.path.islink(self.rapi_users_path))
208 self.assert_(os.path.islink(self.rapi_users_path_pre24))
209 self.assertEqual(os.readlink(self.rapi_users_path_pre24),
210 self.rapi_users_path)
211 for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
212 self.assertEqual(utils.ReadFile(path), "hello world\n")
214 def testRapiUsersExistingTarget(self):
215 self.assertFalse(os.path.exists(self.rapi_users_path))
216 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
218 os.mkdir(os.path.dirname(self.rapi_users_path))
219 utils.WriteFile(self.rapi_users_path, data="other user\n")
220 utils.WriteFile(self.rapi_users_path_pre24, data="hello world\n")
222 self.assertRaises(Exception, self._TestSimpleUpgrade,
223 constants.BuildVersion(2, 2, 0), False)
225 for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
226 self.assert_(os.path.isfile(path) and not os.path.islink(path))
227 self.assertEqual(utils.ReadFile(self.rapi_users_path), "other user\n")
228 self.assertEqual(utils.ReadFile(self.rapi_users_path_pre24),
231 def testRapiUsersDryRun(self):
232 self.assertFalse(os.path.exists(self.rapi_users_path))
233 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
235 utils.WriteFile(self.rapi_users_path_pre24, data="some user\n")
236 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
238 self.assertFalse(os.path.isdir(os.path.dirname(self.rapi_users_path)))
239 self.assertTrue(os.path.isfile(self.rapi_users_path_pre24) and
240 not os.path.islink(self.rapi_users_path_pre24))
241 self.assertFalse(os.path.exists(self.rapi_users_path))
243 def testRapiUsers24AndAboveDryRun(self):
244 self.assertFalse(os.path.exists(self.rapi_users_path))
245 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
247 os.mkdir(os.path.dirname(self.rapi_users_path))
248 utils.WriteFile(self.rapi_users_path, data="other user\n")
249 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
251 self.assertTrue(os.path.isfile(self.rapi_users_path) and
252 not os.path.islink(self.rapi_users_path))
253 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
254 self.assertEqual(utils.ReadFile(self.rapi_users_path), "other user\n")
256 def testRapiUsersExistingSymlinkDryRun(self):
257 self.assertFalse(os.path.exists(self.rapi_users_path))
258 self.assertFalse(os.path.exists(self.rapi_users_path_pre24))
260 os.mkdir(os.path.dirname(self.rapi_users_path))
261 os.symlink(self.rapi_users_path, self.rapi_users_path_pre24)
262 utils.WriteFile(self.rapi_users_path, data="hello world\n")
264 self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
266 self.assertTrue(os.path.islink(self.rapi_users_path_pre24))
267 self.assertTrue(os.path.isfile(self.rapi_users_path) and
268 not os.path.islink(self.rapi_users_path))
269 self.assertEqual(os.readlink(self.rapi_users_path_pre24),
270 self.rapi_users_path)
271 for path in [self.rapi_users_path, self.rapi_users_path_pre24]:
272 self.assertEqual(utils.ReadFile(path), "hello world\n")
274 def testUpgradeFrom_2_0(self):
275 self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), False)
277 def testUpgradeFrom_2_1(self):
278 self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), False)
280 def testUpgradeFrom_2_2(self):
281 self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), False)
283 def testUpgradeFrom_2_3(self):
284 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), False)
286 def testUpgradeFrom_2_4(self):
287 self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), False)
289 def testUpgradeFrom_2_5(self):
290 self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), False)
292 def testUpgradeFrom_2_6(self):
293 self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), False)
295 def testUpgradeCurrent(self):
296 self._TestSimpleUpgrade(constants.CONFIG_VERSION, False)
298 def testUpgradeDryRunFrom_2_0(self):
299 self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True)
301 def testUpgradeDryRunFrom_2_1(self):
302 self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True)
304 def testUpgradeDryRunFrom_2_2(self):
305 self._TestSimpleUpgrade(constants.BuildVersion(2, 2, 0), True)
307 def testUpgradeDryRunFrom_2_3(self):
308 self._TestSimpleUpgrade(constants.BuildVersion(2, 3, 0), True)
310 def testUpgradeDryRunFrom_2_4(self):
311 self._TestSimpleUpgrade(constants.BuildVersion(2, 4, 0), True)
313 def testUpgradeDryRunFrom_2_5(self):
314 self._TestSimpleUpgrade(constants.BuildVersion(2, 5, 0), True)
316 def testUpgradeDryRunFrom_2_6(self):
317 self._TestSimpleUpgrade(constants.BuildVersion(2, 6, 0), True)
319 def testUpgradeCurrentDryRun(self):
320 self._TestSimpleUpgrade(constants.CONFIG_VERSION, True)
323 if __name__ == "__main__":
324 testutils.GanetiTestProgram()