Merge branch 'stable-2.8' into stable-2.9
[ganeti-local] / test / py / ganeti.hypervisor.hv_xen_unittest.py
index a5c65f1..0c88891 100755 (executable)
@@ -48,13 +48,15 @@ HVCLASS_TO_HVNAME = utils.InvertDict(hypervisor._HYPERVISOR_MAP)
 
 class TestConsole(unittest.TestCase):
   def test(self):
-    for cls in [hv_xen.XenPvmHypervisor, hv_xen.XenHvmHypervisor]:
+    hvparams = {constants.HV_XEN_CMD: constants.XEN_CMD_XL}
+    for cls in [hv_xen.XenPvmHypervisor(), hv_xen.XenHvmHypervisor()]:
       instance = objects.Instance(name="xen.example.com",
-                                  primary_node="node24828")
-      cons = cls.GetInstanceConsole(instance, {}, {})
+                                  primary_node="node24828-uuid")
+      node = objects.Node(name="node24828", uuid="node24828-uuid")
+      cons = cls.GetInstanceConsole(instance, node, hvparams, {})
       self.assertTrue(cons.Validate())
       self.assertEqual(cons.kind, constants.CONS_SSH)
-      self.assertEqual(cons.host, instance.primary_node)
+      self.assertEqual(cons.host, node.name)
       self.assertEqual(cons.command[-1], instance.name)
 
 
@@ -78,18 +80,13 @@ class TestCreateConfigCpus(unittest.TestCase):
 
 
 class TestGetCommand(testutils.GanetiTestCase):
-  def testDefault(self):
-    expected_cmd = "xm"
-    hv = hv_xen.XenHypervisor()
-    self.assertEqual(hv._GetCommand(), expected_cmd)
-
   def testCommandExplicit(self):
     """Test the case when the command is given as class parameter explicitly.
 
     """
     expected_cmd = "xl"
     hv = hv_xen.XenHypervisor(_cmd=constants.XEN_CMD_XL)
-    self.assertEqual(hv._GetCommand(), expected_cmd)
+    self.assertEqual(hv._GetCommand(None), expected_cmd)
 
   def testCommandInvalid(self):
     """Test the case an invalid command is given as class parameter explicitly.
@@ -102,12 +99,12 @@ class TestGetCommand(testutils.GanetiTestCase):
     expected_cmd = "xl"
     test_hvparams = {constants.HV_XEN_CMD: constants.XEN_CMD_XL}
     hv = hv_xen.XenHypervisor()
-    self.assertEqual(hv._GetCommand(hvparams=test_hvparams), expected_cmd)
+    self.assertEqual(hv._GetCommand(test_hvparams), expected_cmd)
 
   def testCommandHvparamsInvalid(self):
     test_hvparams = {}
     hv = hv_xen.XenHypervisor()
-    self.assertRaises(KeyError, hv._GetCommand, test_hvparams)
+    self.assertRaises(errors.HypervisorError, hv._GetCommand, test_hvparams)
 
   def testCommandHvparamsCmdInvalid(self):
     test_hvparams = {constants.HV_XEN_CMD: "invalidcommand"}
@@ -228,10 +225,9 @@ class TestParseNodeInfo(testutils.GanetiTestCase):
 
 class TestMergeInstanceInfo(testutils.GanetiTestCase):
   def testEmpty(self):
-    self.assertEqual(hv_xen._MergeInstanceInfo({}, lambda _: []), {})
+    self.assertEqual(hv_xen._MergeInstanceInfo({}, []), {})
 
   def _FakeXmList(self, include_node):
-    self.assertTrue(include_node)
     return [
       (hv_xen._DOM0_NAME, NotImplemented, 4096, 7, NotImplemented,
        NotImplemented),
@@ -240,20 +236,22 @@ class TestMergeInstanceInfo(testutils.GanetiTestCase):
       ]
 
   def testMissingNodeInfo(self):
-    result = hv_xen._MergeInstanceInfo({}, self._FakeXmList)
+    instance_list = self._FakeXmList(True)
+    result = hv_xen._MergeInstanceInfo({}, instance_list)
     self.assertEqual(result, {
       "memory_dom0": 4096,
-      "dom0_cpus": 7,
+      "cpu_dom0": 7,
       })
 
   def testWithNodeInfo(self):
     info = testutils.ReadTestData("xen-xm-info-4.0.1.txt")
-    result = hv_xen._GetNodeInfo(info, self._FakeXmList)
+    instance_list = self._FakeXmList(True)
+    result = hv_xen._GetNodeInfo(info, instance_list)
     self.assertEqual(result, {
       "cpu_nodes": 1,
       "cpu_sockets": 2,
       "cpu_total": 4,
-      "dom0_cpus": 7,
+      "cpu_dom0": 7,
       "hv_version": (4, 0),
       "memory_dom0": 4096,
       "memory_free": 8004,
@@ -271,7 +269,7 @@ class TestGetConfigFileDiskData(unittest.TestCase):
 
   def testManyDisks(self):
     for offset in [0, 1, 10]:
-      disks = [(objects.Disk(dev_type=constants.LD_LV), "/tmp/disk/%s" % idx)
+      disks = [(objects.Disk(dev_type=constants.DT_PLAIN), "/tmp/disk/%s" % idx)
                for idx in range(len(hv_xen._DISK_LETTERS) + offset)]
 
       if offset == 0:
@@ -290,9 +288,9 @@ class TestGetConfigFileDiskData(unittest.TestCase):
 
   def testTwoLvDisksWithMode(self):
     disks = [
-      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDWR),
+      (objects.Disk(dev_type=constants.DT_PLAIN, mode=constants.DISK_RDWR),
        "/tmp/diskFirst"),
-      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDONLY),
+      (objects.Disk(dev_type=constants.DT_PLAIN, mode=constants.DISK_RDONLY),
        "/tmp/diskLast"),
       ]
 
@@ -304,16 +302,16 @@ class TestGetConfigFileDiskData(unittest.TestCase):
 
   def testFileDisks(self):
     disks = [
-      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
+      (objects.Disk(dev_type=constants.DT_FILE, mode=constants.DISK_RDWR,
                     physical_id=[constants.FD_LOOP]),
        "/tmp/diskFirst"),
-      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDONLY,
+      (objects.Disk(dev_type=constants.DT_FILE, mode=constants.DISK_RDONLY,
                     physical_id=[constants.FD_BLKTAP]),
        "/tmp/diskTwo"),
-      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
+      (objects.Disk(dev_type=constants.DT_FILE, mode=constants.DISK_RDWR,
                     physical_id=[constants.FD_LOOP]),
        "/tmp/diskThree"),
-      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
+      (objects.Disk(dev_type=constants.DT_FILE, mode=constants.DISK_RDWR,
                     physical_id=[constants.FD_BLKTAP]),
        "/tmp/diskLast"),
       ]
@@ -328,7 +326,7 @@ class TestGetConfigFileDiskData(unittest.TestCase):
 
   def testInvalidFileDisk(self):
     disks = [
-      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
+      (objects.Disk(dev_type=constants.DT_FILE, mode=constants.DISK_RDWR,
                     physical_id=["#unknown#"]),
        "/tmp/diskinvalid"),
       ]
@@ -346,15 +344,14 @@ class TestXenHypervisorRunXen(unittest.TestCase):
     hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
                               _run_cmd_fn=NotImplemented,
                               _cmd=cmd)
-    self.assertRaises(errors.ProgrammerError, hv._RunXen, [])
+    self.assertRaises(errors.ProgrammerError, hv._RunXen, [], None)
 
-  def testCommandValid(self):
-    xen_cmd = "xm"
-    mock_run_cmd = mock.Mock()
+  def testCommandNoHvparams(self):
     hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
-                              _run_cmd_fn=mock_run_cmd)
-    hv._RunXen([self.XEN_SUB_CMD])
-    mock_run_cmd.assert_called_with([xen_cmd, self.XEN_SUB_CMD])
+                              _run_cmd_fn=NotImplemented)
+    hvparams = None
+    self.assertRaises(errors.HypervisorError, hv._RunXen, [self.XEN_SUB_CMD],
+                      hvparams)
 
   def testCommandFromHvparams(self):
     expected_xen_cmd = "xl"
@@ -371,13 +368,12 @@ class TestXenHypervisorGetInstanceList(unittest.TestCase):
   RESULT_OK = utils.RunResult(0, None, "", "", "", None, None)
   XEN_LIST = "list"
 
-  def testOk(self):
+  def testNoHvparams(self):
     expected_xen_cmd = "xm"
     mock_run_cmd = mock.Mock( return_value=self.RESULT_OK )
     hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
                               _run_cmd_fn=mock_run_cmd)
-    hv._GetInstanceList(True)
-    mock_run_cmd.assert_called_with([expected_xen_cmd, self.XEN_LIST])
+    self.assertRaises(errors.HypervisorError, hv._GetInstanceList, True, None)
 
   def testFromHvparams(self):
     expected_xen_cmd = "xl"
@@ -385,7 +381,7 @@ class TestXenHypervisorGetInstanceList(unittest.TestCase):
     mock_run_cmd = mock.Mock( return_value=self.RESULT_OK )
     hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
                               _run_cmd_fn=mock_run_cmd)
-    hv._GetInstanceList(True, hvparams=hvparams)
+    hv._GetInstanceList(True, hvparams)
     mock_run_cmd.assert_called_with([expected_xen_cmd, self.XEN_LIST])
 
 
@@ -394,13 +390,12 @@ class TestXenHypervisorListInstances(unittest.TestCase):
   RESULT_OK = utils.RunResult(0, None, "", "", "", None, None)
   XEN_LIST = "list"
 
-  def testDefaultXm(self):
+  def testNoHvparams(self):
     expected_xen_cmd = "xm"
     mock_run_cmd = mock.Mock( return_value=self.RESULT_OK )
     hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
                               _run_cmd_fn=mock_run_cmd)
-    hv.ListInstances()
-    mock_run_cmd.assert_called_with([expected_xen_cmd, self.XEN_LIST])
+    self.assertRaises(errors.HypervisorError, hv.ListInstances)
 
   def testHvparamsXl(self):
     expected_xen_cmd = "xl"
@@ -683,9 +678,9 @@ class _TestXenHypervisor(object):
       hvp[constants.HV_VNC_PASSWORD_FILE] = self.vncpw_path
 
     disks = [
-      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDWR),
+      (objects.Disk(dev_type=constants.DT_PLAIN, mode=constants.DISK_RDWR),
        utils.PathJoin(self.tmpdir, "disk0")),
-      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDONLY),
+      (objects.Disk(dev_type=constants.DT_PLAIN, mode=constants.DISK_RDONLY),
        utils.PathJoin(self.tmpdir, "disk1")),
       ]
 
@@ -732,10 +727,16 @@ class _TestXenHypervisor(object):
           self.assertTrue(("extra = '%s'" % extra) in lines)
 
   def _StopInstanceCommand(self, instance_name, force, fail, cmd):
-    if ((force and cmd[:2] == [self.CMD, "destroy"]) or
-        (not force and cmd[:2] == [self.CMD, "shutdown"])):
+    if (cmd == [self.CMD, "list"]):
+      output = "Name  ID  Mem  VCPUs  State  Time(s)\n" \
+        "Domain-0  0  1023  1  r-----  142691.0\n" \
+        "%s  417  128  1  r-----  3.2\n" % instance_name
+    elif cmd[:2] == [self.CMD, "destroy"]:
       self.assertEqual(cmd[2:], [instance_name])
       output = ""
+    elif not force and cmd[:3] == [self.CMD, "shutdown", "-w"]:
+      self.assertEqual(cmd[3:], [instance_name])
+      output = ""
     else:
       self.fail("Unhandled command: %s" % (cmd, ))
 
@@ -764,7 +765,8 @@ class _TestXenHypervisor(object):
           try:
             hv._StopInstance(name, force, None)
           except errors.HypervisorError, err:
-            self.assertTrue(str(err).startswith("Failed to stop instance"))
+            self.assertTrue(str(err).startswith("listing instances failed"),
+                            msg=str(err))
           else:
             self.fail("Exception was not raised")
           self.assertEqual(utils.ReadFile(cfgfile), cfgdata,