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