From 8947cf2b1fb0c219f1549f5c736fa4bc4a0cf5e8 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Mon, 15 Oct 2007 12:16:17 +0000
Subject: [PATCH] =?UTF-8?q?Do=20QA=20tests=20on=20=E2=80=9Cgnt-os=E2=80=9C?=
 =?UTF-8?q?,=20including=20partially=20valid=20OSes.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Reviewed-by: iustinp
---
 qa/Makefile.am    |   3 +-
 qa/ganeti-qa.py   |   8 +++
 qa/qa-sample.yaml |   2 +
 qa/qa_os.py       | 137 ++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 149 insertions(+), 1 deletion(-)
 create mode 100644 qa/qa_os.py

diff --git a/qa/Makefile.am b/qa/Makefile.am
index bee5d32e5..f52131405 100644
--- a/qa/Makefile.am
+++ b/qa/Makefile.am
@@ -5,7 +5,8 @@ EXTRA_DIST = ganeti-qa.py qa-sample.yaml \
 	qa_env.py \
 	qa_error.py \
 	qa_instance.py \
-	qa_node.py
+	qa_node.py \
+	qa_os.py \
 	qa_other.py \
 	qa_utils.py
 CLEANFILES = *.py[co]
diff --git a/qa/ganeti-qa.py b/qa/ganeti-qa.py
index b7cd00974..64c0006b2 100755
--- a/qa/ganeti-qa.py
+++ b/qa/ganeti-qa.py
@@ -37,6 +37,7 @@ import qa_daemon
 import qa_env
 import qa_instance
 import qa_node
+import qa_os
 import qa_other
 
 
@@ -121,6 +122,13 @@ def main():
   if qa_config.TestEnabled('cluster-master-failover'):
     RunTest(qa_cluster.TestClusterMasterFailover)
 
+  if qa_config.TestEnabled('os'):
+    RunTest(qa_os.TestOsList)
+    RunTest(qa_os.TestOsDiagnose)
+    RunTest(qa_os.TestOsValid)
+    RunTest(qa_os.TestOsInvalid)
+    RunTest(qa_os.TestOsPartiallyValid)
+
   node = qa_config.AcquireNode()
   try:
     if qa_config.TestEnabled('instance-add-plain-disk'):
diff --git a/qa/qa-sample.yaml b/qa/qa-sample.yaml
index 9988b4916..be6779733 100644
--- a/qa/qa-sample.yaml
+++ b/qa/qa-sample.yaml
@@ -26,6 +26,8 @@ instances:
 tests:
   env: True
 
+  os: True
+
   cluster-verify: True
   cluster-info: True
   cluster-getmaster: True
diff --git a/qa/qa_os.py b/qa/qa_os.py
new file mode 100644
index 000000000..5383d07e5
--- /dev/null
+++ b/qa/qa_os.py
@@ -0,0 +1,137 @@
+# Copyright (C) 2007 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.
+
+
+"""OS related QA tests.
+
+"""
+
+import os
+import os.path
+
+from ganeti import utils
+from ganeti import constants
+
+import qa_config
+import qa_utils
+
+from qa_utils import AssertEqual, StartSSH
+
+
+_TEMP_OS_NAME = "TEMP-Ganeti-QA-OS"
+_TEMP_OS_PATH = os.path.join(constants.OS_SEARCH_PATH[0], _TEMP_OS_NAME)
+
+
+def TestOsList():
+  """gnt-os list"""
+  master = qa_config.GetMasterNode()
+
+  cmd = ['gnt-os', 'list']
+  AssertEqual(StartSSH(master['primary'],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+def TestOsDiagnose():
+  """gnt-os diagnose"""
+  master = qa_config.GetMasterNode()
+
+  cmd = ['gnt-os', 'diagnose']
+  AssertEqual(StartSSH(master['primary'],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+def _SetupTempOs(node, dir, valid):
+  """Creates a temporary OS definition on the given node.
+
+  """
+  sq = utils.ShellQuoteArgs
+  parts = [sq(["rm", "-rf", dir]),
+           sq(["mkdir", "-p", dir]),
+           sq(["cd", dir]),
+           sq(["ln", "-fs", "/bin/true", "export"]),
+           sq(["ln", "-fs", "/bin/true", "import"]),
+           sq(["ln", "-fs", "/bin/true", "rename"])]
+
+  if valid:
+    parts.append(sq(["ln", "-fs", "/bin/true", "create"]))
+
+  parts.append(sq(["echo", str(constants.OS_API_VERSION)]) +
+               " >ganeti_api_version")
+
+  cmd = ' && '.join(parts)
+
+  qa_utils.PrintInfo("Setting up %s with %s OS definition" %
+                     (node["primary"], ["an invalid", "a valid"][int(valid)]))
+
+  AssertEqual(StartSSH(node['primary'], cmd).wait(), 0)
+
+
+def _RemoveTempOs(node, dir):
+  """Removes a temporary OS definition.
+
+  """
+  cmd = ['rm', '-rf', dir]
+  AssertEqual(StartSSH(node['primary'],
+                       utils.ShellQuoteArgs(cmd)).wait(), 0)
+
+
+def _TestOs(mode):
+  """Generic function for OS definition testing
+
+  """
+  master = qa_config.GetMasterNode()
+  dir = _TEMP_OS_PATH
+
+  nodes = []
+  try:
+    i = 0
+    for node in qa_config.get('nodes'):
+      nodes.append(node)
+      if mode == 0:
+        valid = False
+      elif mode == 1:
+        valid = True
+      else:
+        valid = bool(i % 2)
+      _SetupTempOs(node, dir, valid)
+      i += 1
+
+    cmd = ['gnt-os', 'diagnose']
+    result = StartSSH(master['primary'],
+                      utils.ShellQuoteArgs(cmd)).wait()
+    if mode == 1:
+      AssertEqual(result, 0)
+    else:
+      AssertEqual(result, 1)
+  finally:
+    for node in nodes:
+      _RemoveTempOs(node, dir)
+
+
+def TestOsValid():
+  """Testing valid OS definition"""
+  return _TestOs(1)
+
+
+def TestOsInvalid():
+  """Testing invalid OS definition"""
+  return _TestOs(0)
+
+
+def TestOsPartiallyValid():
+  """Testing partially valid OS definition"""
+  return _TestOs(2)
-- 
GitLab