import qa_config
import qa_utils
+import qa_error
-from qa_utils import AssertCommand
+from qa_utils import AssertCommand, AssertIn, AssertNotIn
_TEMP_OS_NAME = "TEMP-Ganeti-QA-OS"
AssertCommand(["rm", "-rf", dirname], node=node)
-def _TestOs(mode):
+def _TestOs(mode, rapi_cb):
"""Generic function for OS definition testing
"""
+ master = qa_config.GetMasterNode()
+
+ name = _TEMP_OS_NAME
dirname = _TEMP_OS_PATH
+ # Ensure OS is usable
+ cmd = ["gnt-os", "modify", "--hidden=no", "--blacklisted=no", name]
+ AssertCommand(cmd)
+
nodes = []
try:
for i, node in enumerate(qa_config.get("nodes")):
raise AssertionError("Unknown mode %s" % mode)
_SetupTempOs(node, dirname, valid)
- AssertCommand(["gnt-os", "diagnose"], fail=(mode != _ALL_VALID))
+ # TODO: Use Python 2.6's itertools.permutations
+ for (hidden, blacklisted) in [(False, False), (True, False),
+ (False, True), (True, True)]:
+ # Change OS' visibility
+ cmd = ["gnt-os", "modify", "--hidden", ["no", "yes"][int(hidden)],
+ "--blacklisted", ["no", "yes"][int(blacklisted)], name]
+ AssertCommand(cmd)
+
+ # Diagnose, checking exit status
+ AssertCommand(["gnt-os", "diagnose"], fail=(mode != _ALL_VALID))
+
+ # Diagnose again, ignoring exit status
+ output = qa_utils.GetCommandOutput(master["primary"],
+ "gnt-os diagnose || :")
+ for line in output.splitlines():
+ if line.startswith("OS: %s [global status:" % name):
+ break
+ else:
+ raise qa_error.Error("Didn't find OS '%s' in 'gnt-os diagnose'" % name)
+
+ # Check info for all
+ cmd = ["gnt-os", "info"]
+ output = qa_utils.GetCommandOutput(master["primary"],
+ utils.ShellQuoteArgs(cmd))
+ AssertIn("%s:" % name, output.splitlines())
+
+ # Check info for OS
+ cmd = ["gnt-os", "info", name]
+ output = qa_utils.GetCommandOutput(master["primary"],
+ utils.ShellQuoteArgs(cmd)).splitlines()
+ AssertIn("%s:" % name, output)
+ for (field, value) in [("valid", mode == _ALL_VALID),
+ ("hidden", hidden),
+ ("blacklisted", blacklisted)]:
+ AssertIn(" - %s: %s" % (field, value), output)
+
+ # Only valid OSes should be listed
+ cmd = ["gnt-os", "list", "--no-headers"]
+ output = qa_utils.GetCommandOutput(master["primary"],
+ utils.ShellQuoteArgs(cmd))
+ if mode == _ALL_VALID and not (hidden or blacklisted):
+ assert_fn = AssertIn
+ else:
+ assert_fn = AssertNotIn
+ assert_fn(name, output.splitlines())
+
+ # Check via RAPI
+ if rapi_cb:
+ assert_fn(name, rapi_cb())
finally:
for node in nodes:
_RemoveTempOs(node, dirname)
-def TestOsValid():
+def TestOsValid(rapi_cb):
"""Testing valid OS definition"""
- return _TestOs(_ALL_VALID)
+ return _TestOs(_ALL_VALID, rapi_cb)
-def TestOsInvalid():
+def TestOsInvalid(rapi_cb):
"""Testing invalid OS definition"""
- return _TestOs(_ALL_INVALID)
+ return _TestOs(_ALL_INVALID, rapi_cb)
-def TestOsPartiallyValid():
+def TestOsPartiallyValid(rapi_cb):
"""Testing partially valid OS definition"""
- return _TestOs(_PARTIALLY_VALID)
+ return _TestOs(_PARTIALLY_VALID, rapi_cb)
def TestOsModifyValid():