From aefbe36941d80068e99a119939975823a2eac141 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Mon, 28 Jun 2010 15:47:12 +0200 Subject: [PATCH] Add test script for cfgupgrade This should catch cases where we update the configuration version, but forget to adjust cfgupgrade accordingly. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Guido Trotter <ultrotter@google.com> --- Makefile.am | 1 + test/cfgupgrade_unittest.py | 145 ++++++++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100755 test/cfgupgrade_unittest.py diff --git a/Makefile.am b/Makefile.am index b8ad0b28c..4a61f5111 100644 --- a/Makefile.am +++ b/Makefile.am @@ -388,6 +388,7 @@ python_tests = \ test/ganeti.utils_unittest.py \ test/ganeti.utils_mlockall_unittest.py \ test/ganeti.workerpool_unittest.py \ + test/cfgupgrade_unittest.py \ test/docs_unittest.py \ test/tempfile_fork_unittest.py diff --git a/test/cfgupgrade_unittest.py b/test/cfgupgrade_unittest.py new file mode 100755 index 000000000..129be6f2c --- /dev/null +++ b/test/cfgupgrade_unittest.py @@ -0,0 +1,145 @@ +#!/usr/bin/python +# + +# Copyright (C) 2010 Google Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + + +"""Script for testing tools/cfgupgrade""" + +import os +import sys +import unittest +import shutil +import tempfile +import operator + +from ganeti import constants +from ganeti import utils +from ganeti import errors +from ganeti import serializer + +import testutils + + +def _RunUpgrade(path, dry_run, no_verify): + cmd = [sys.executable, "%s/tools/cfgupgrade" % testutils.GetSourceDir(), + "--debug", "--force", "--path=%s" % path] + if dry_run: + cmd.append("--dry-run") + if no_verify: + cmd.append("--no-verify") + + result = utils.RunCmd(cmd, cwd=os.getcwd()) + if result.failed: + raise Exception("cfgupgrade failed: %s, output %r" % + (result.fail_reason, result.output)) + + +class TestCfgupgrade(unittest.TestCase): + def setUp(self): + self.tmpdir = tempfile.mkdtemp() + + self.config_path = utils.PathJoin(self.tmpdir, "config.data") + self.noded_cert_path = utils.PathJoin(self.tmpdir, "server.pem") + self.rapi_cert_path = utils.PathJoin(self.tmpdir, "rapi.pem") + self.known_hosts_path = utils.PathJoin(self.tmpdir, "known_hosts") + self.confd_hmac_path = utils.PathJoin(self.tmpdir, "hmac.key") + self.cds_path = utils.PathJoin(self.tmpdir, "cluster-domain-secret") + + def tearDown(self): + shutil.rmtree(self.tmpdir) + + def _LoadConfig(self): + return serializer.LoadJson(utils.ReadFile(self.config_path)) + + def _CreateValidConfigDir(self): + utils.WriteFile(self.noded_cert_path, data="") + utils.WriteFile(self.known_hosts_path, data="") + + def testNoConfigDir(self): + self.assertFalse(utils.ListVisibleFiles(self.tmpdir)) + self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True) + self.assertRaises(Exception, _RunUpgrade, self.tmpdir, True, True) + + def testInconsistentConfig(self): + self._CreateValidConfigDir() + # There should be no "config_version" + cfg = { + "version": 0, + "cluster": { + "config_version": 0, + }, + } + utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg)) + self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True) + + def testInvalidConfig(self): + self._CreateValidConfigDir() + # Missing version from config + utils.WriteFile(self.config_path, data=serializer.DumpJson({})) + self.assertRaises(Exception, _RunUpgrade, self.tmpdir, False, True) + + def _TestSimpleUpgrade(self, from_version, dry_run): + cfg = { + "version": from_version, + "cluster": {}, + } + self._CreateValidConfigDir() + utils.WriteFile(self.config_path, data=serializer.DumpJson(cfg)) + + self.assertFalse(os.path.isfile(self.rapi_cert_path)) + self.assertFalse(os.path.isfile(self.confd_hmac_path)) + self.assertFalse(os.path.isfile(self.cds_path)) + + _RunUpgrade(self.tmpdir, dry_run, True) + + if dry_run: + expversion = from_version + checkfn = operator.not_ + else: + expversion = constants.CONFIG_VERSION + checkfn = operator.truth + + self.assert_(checkfn(os.path.isfile(self.rapi_cert_path))) + self.assert_(checkfn(os.path.isfile(self.confd_hmac_path))) + self.assert_(checkfn(os.path.isfile(self.cds_path))) + + newcfg = self._LoadConfig() + self.assertEqual(newcfg["version"], expversion) + + def testUpgradeFrom_2_0(self): + self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), False) + + def testUpgradeFrom_2_1(self): + self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), False) + + def testUpgradeCurrent(self): + self._TestSimpleUpgrade(constants.CONFIG_VERSION, False) + + def testUpgradeDryRunFrom_2_0(self): + self._TestSimpleUpgrade(constants.BuildVersion(2, 0, 0), True) + + def testUpgradeDryRunFrom_2_1(self): + self._TestSimpleUpgrade(constants.BuildVersion(2, 1, 0), True) + + def testUpgradeCurrentDryRun(self): + self._TestSimpleUpgrade(constants.CONFIG_VERSION, True) + + +if __name__ == "__main__": + testutils.GanetiTestProgram() -- GitLab