locking: Change locking order, move NAL after instances
[ganeti-local] / test / ganeti.hypervisor.hv_kvm_unittest.py
index 14ab345..230efff 100755 (executable)
@@ -32,6 +32,8 @@ from ganeti import constants
 from ganeti import compat
 from ganeti import objects
 from ganeti import errors
+from ganeti import utils
+from ganeti import pathutils
 
 from ganeti.hypervisor import hv_kvm
 
@@ -42,12 +44,22 @@ class QmpStub(threading.Thread):
   """Stub for a QMP endpoint for a KVM instance
 
   """
-  _QMP_BANNER_DATA = {"QMP": {"version": {
-                      "package": "",
-                      "qemu": {"micro": 50, "minor": 13, "major": 0},
-                      "capabilities": [],
-                      }}}
-  _EMPTY_RESPONSE = {"return": []}
+  _QMP_BANNER_DATA = {
+    "QMP": {
+      "version": {
+        "package": "",
+        "qemu": {
+          "micro": 50,
+          "minor": 13,
+          "major": 0,
+          },
+        "capabilities": [],
+        },
+      }
+    }
+  _EMPTY_RESPONSE = {
+    "return": [],
+    }
 
   def __init__(self, socket_filename, server_responses):
     """Creates a QMP stub
@@ -101,20 +113,27 @@ class QmpStub(threading.Thread):
     conn.close()
 
   def encode_string(self, message):
-    return (serializer.DumpJson(message, indent=False) +
+    return (serializer.DumpJson(message) +
             hv_kvm.QmpConnection._MESSAGE_END_TOKEN)
 
 
 class TestQmpMessage(testutils.GanetiTestCase):
   def testSerialization(self):
-    test_data = {"execute": "command", "arguments": ["a", "b", "c"]}
+    test_data = {
+      "execute": "command",
+      "arguments": ["a", "b", "c"],
+      }
     message = hv_kvm.QmpMessage(test_data)
 
     for k, v in test_data.items():
-      self.failUnless(message[k] == v)
+      self.assertEqual(message[k], v)
+
+    serialized = str(message)
+    self.assertEqual(len(serialized.splitlines()), 1,
+                     msg="Got multi-line message")
 
-    rebuilt_message = hv_kvm.QmpMessage.BuildFromJsonString(str(message))
-    self.failUnless(rebuilt_message == message)
+    rebuilt_message = hv_kvm.QmpMessage.BuildFromJsonString(serialized)
+    self.assertEqual(rebuilt_message, message)
 
 
 class TestQmp(testutils.GanetiTestCase):
@@ -158,7 +177,10 @@ class TestQmp(testutils.GanetiTestCase):
     # Format the script
     for request, expected_response in zip(requests, expected_responses):
       response = qmp_connection.Execute(request)
-      self.failUnless(response == hv_kvm.QmpMessage(expected_response))
+      msg = hv_kvm.QmpMessage(expected_response)
+      self.assertEqual(len(str(msg).splitlines()), 1,
+                       msg="Got multi-line message")
+      self.assertEqual(response, msg)
 
 
 class TestConsole(unittest.TestCase):
@@ -178,7 +200,7 @@ class TestConsole(unittest.TestCase):
     cons = self._Test(instance, hvparams)
     self.assertEqual(cons.kind, constants.CONS_SSH)
     self.assertEqual(cons.host, instance.primary_node)
-    self.assertEqual(cons.command[0], constants.KVM_CONSOLE_WRAPPER)
+    self.assertEqual(cons.command[0], pathutils.KVM_CONSOLE_WRAPPER)
     self.assertEqual(cons.command[1], constants.SOCAT_PATH)
 
   def testVnc(self):
@@ -223,5 +245,18 @@ class TestConsole(unittest.TestCase):
     self.assertEqual(cons.kind, constants.CONS_MESSAGE)
 
 
+class TestVersionChecking(testutils.GanetiTestCase):
+  def testParseVersion(self):
+    parse = hv_kvm.KVMHypervisor._ParseKVMVersion
+    help_10 = utils.ReadFile(self._TestDataFilename("kvm_1.0_help.txt"))
+    help_01590 = utils.ReadFile(self._TestDataFilename("kvm_0.15.90_help.txt"))
+    help_0125 = utils.ReadFile(self._TestDataFilename("kvm_0.12.5_help.txt"))
+    help_091 = utils.ReadFile(self._TestDataFilename("kvm_0.9.1_help.txt"))
+    self.assertEqual(parse(help_10), ("1.0", 1, 0, 0))
+    self.assertEqual(parse(help_01590), ("0.15.90", 0, 15, 90))
+    self.assertEqual(parse(help_0125), ("0.12.5", 0, 12, 5))
+    self.assertEqual(parse(help_091), ("0.9.1", 0, 9, 1))
+
+
 if __name__ == "__main__":
   testutils.GanetiTestProgram()