Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.hypervisor.hv_xen_unittest.py @ 1dee2041

History | View | Annotate | Download (9 kB)

1 55cc0a44 Michael Hanselmann
#!/usr/bin/python
2 55cc0a44 Michael Hanselmann
#
3 55cc0a44 Michael Hanselmann
4 b255379d Michael Hanselmann
# Copyright (C) 2011, 2013 Google Inc.
5 55cc0a44 Michael Hanselmann
#
6 55cc0a44 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 55cc0a44 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 55cc0a44 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 55cc0a44 Michael Hanselmann
# (at your option) any later version.
10 55cc0a44 Michael Hanselmann
#
11 55cc0a44 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 55cc0a44 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 55cc0a44 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 55cc0a44 Michael Hanselmann
# General Public License for more details.
15 55cc0a44 Michael Hanselmann
#
16 55cc0a44 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 55cc0a44 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 55cc0a44 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 55cc0a44 Michael Hanselmann
# 02110-1301, USA.
20 55cc0a44 Michael Hanselmann
21 55cc0a44 Michael Hanselmann
22 55cc0a44 Michael Hanselmann
"""Script for testing ganeti.hypervisor.hv_lxc"""
23 55cc0a44 Michael Hanselmann
24 d0bb3f24 Michael Hanselmann
import string # pylint: disable=W0402
25 55cc0a44 Michael Hanselmann
import unittest
26 55cc0a44 Michael Hanselmann
27 55cc0a44 Michael Hanselmann
from ganeti import constants
28 55cc0a44 Michael Hanselmann
from ganeti import objects
29 55cc0a44 Michael Hanselmann
from ganeti import hypervisor
30 b255379d Michael Hanselmann
from ganeti import utils
31 b255379d Michael Hanselmann
from ganeti import errors
32 b255379d Michael Hanselmann
from ganeti import compat
33 55cc0a44 Michael Hanselmann
34 55cc0a44 Michael Hanselmann
from ganeti.hypervisor import hv_xen
35 55cc0a44 Michael Hanselmann
36 55cc0a44 Michael Hanselmann
import testutils
37 55cc0a44 Michael Hanselmann
38 55cc0a44 Michael Hanselmann
39 55cc0a44 Michael Hanselmann
class TestConsole(unittest.TestCase):
40 55cc0a44 Michael Hanselmann
  def test(self):
41 55cc0a44 Michael Hanselmann
    for cls in [hv_xen.XenPvmHypervisor, hv_xen.XenHvmHypervisor]:
42 55cc0a44 Michael Hanselmann
      instance = objects.Instance(name="xen.example.com",
43 55cc0a44 Michael Hanselmann
                                  primary_node="node24828")
44 55cc0a44 Michael Hanselmann
      cons = cls.GetInstanceConsole(instance, {}, {})
45 55cc0a44 Michael Hanselmann
      self.assertTrue(cons.Validate())
46 55cc0a44 Michael Hanselmann
      self.assertEqual(cons.kind, constants.CONS_SSH)
47 55cc0a44 Michael Hanselmann
      self.assertEqual(cons.host, instance.primary_node)
48 55cc0a44 Michael Hanselmann
      self.assertEqual(cons.command[-1], instance.name)
49 55cc0a44 Michael Hanselmann
50 55cc0a44 Michael Hanselmann
51 347fa0f1 Michael Hanselmann
class TestCreateConfigCpus(unittest.TestCase):
52 347fa0f1 Michael Hanselmann
  def testEmpty(self):
53 347fa0f1 Michael Hanselmann
    for cpu_mask in [None, ""]:
54 347fa0f1 Michael Hanselmann
      self.assertEqual(hv_xen._CreateConfigCpus(cpu_mask),
55 347fa0f1 Michael Hanselmann
                       "cpus = [  ]")
56 347fa0f1 Michael Hanselmann
57 347fa0f1 Michael Hanselmann
  def testAll(self):
58 347fa0f1 Michael Hanselmann
    self.assertEqual(hv_xen._CreateConfigCpus(constants.CPU_PINNING_ALL),
59 347fa0f1 Michael Hanselmann
                     None)
60 347fa0f1 Michael Hanselmann
61 347fa0f1 Michael Hanselmann
  def testOne(self):
62 347fa0f1 Michael Hanselmann
    self.assertEqual(hv_xen._CreateConfigCpus("9"), "cpu = \"9\"")
63 347fa0f1 Michael Hanselmann
64 347fa0f1 Michael Hanselmann
  def testMultiple(self):
65 347fa0f1 Michael Hanselmann
    self.assertEqual(hv_xen._CreateConfigCpus("0-2,4,5-5:3:all"),
66 347fa0f1 Michael Hanselmann
                     ("cpus = [ \"0,1,2,4,5\", \"3\", \"%s\" ]" %
67 347fa0f1 Michael Hanselmann
                      constants.CPU_PINNING_ALL_XEN))
68 347fa0f1 Michael Hanselmann
69 347fa0f1 Michael Hanselmann
70 b255379d Michael Hanselmann
class TestParseXmList(testutils.GanetiTestCase):
71 b255379d Michael Hanselmann
  def test(self):
72 b255379d Michael Hanselmann
    data = testutils.ReadTestData("xen-xm-list-4.0.1-dom0-only.txt")
73 b255379d Michael Hanselmann
74 b255379d Michael Hanselmann
    # Exclude node
75 b255379d Michael Hanselmann
    self.assertEqual(hv_xen._ParseXmList(data.splitlines(), False), [])
76 b255379d Michael Hanselmann
77 b255379d Michael Hanselmann
    # Include node
78 b255379d Michael Hanselmann
    result = hv_xen._ParseXmList(data.splitlines(), True)
79 b255379d Michael Hanselmann
    self.assertEqual(len(result), 1)
80 b255379d Michael Hanselmann
    self.assertEqual(len(result[0]), 6)
81 b255379d Michael Hanselmann
82 b255379d Michael Hanselmann
    # Name
83 b255379d Michael Hanselmann
    self.assertEqual(result[0][0], hv_xen._DOM0_NAME)
84 b255379d Michael Hanselmann
85 b255379d Michael Hanselmann
    # ID
86 b255379d Michael Hanselmann
    self.assertEqual(result[0][1], 0)
87 b255379d Michael Hanselmann
88 b255379d Michael Hanselmann
    # Memory
89 b255379d Michael Hanselmann
    self.assertEqual(result[0][2], 1023)
90 b255379d Michael Hanselmann
91 b255379d Michael Hanselmann
    # VCPUs
92 b255379d Michael Hanselmann
    self.assertEqual(result[0][3], 1)
93 b255379d Michael Hanselmann
94 b255379d Michael Hanselmann
    # State
95 b255379d Michael Hanselmann
    self.assertEqual(result[0][4], "r-----")
96 b255379d Michael Hanselmann
97 b255379d Michael Hanselmann
    # Time
98 b255379d Michael Hanselmann
    self.assertAlmostEqual(result[0][5], 121152.6)
99 b255379d Michael Hanselmann
100 b255379d Michael Hanselmann
  def testWrongLineFormat(self):
101 b255379d Michael Hanselmann
    tests = [
102 b255379d Michael Hanselmann
      ["three fields only"],
103 b255379d Michael Hanselmann
      ["name InvalidID 128 1 r----- 12345"],
104 b255379d Michael Hanselmann
      ]
105 b255379d Michael Hanselmann
106 b255379d Michael Hanselmann
    for lines in tests:
107 b255379d Michael Hanselmann
      try:
108 b255379d Michael Hanselmann
        hv_xen._ParseXmList(["Header would be here"] + lines, False)
109 b255379d Michael Hanselmann
      except errors.HypervisorError, err:
110 b255379d Michael Hanselmann
        self.assertTrue("Can't parse output of xm list" in str(err))
111 b255379d Michael Hanselmann
      else:
112 b255379d Michael Hanselmann
        self.fail("Exception was not raised")
113 b255379d Michael Hanselmann
114 b255379d Michael Hanselmann
115 b255379d Michael Hanselmann
class TestGetXmList(testutils.GanetiTestCase):
116 b255379d Michael Hanselmann
  def _Fail(self):
117 b255379d Michael Hanselmann
    return utils.RunResult(constants.EXIT_FAILURE, None,
118 b255379d Michael Hanselmann
                           "stdout", "stderr", None,
119 b255379d Michael Hanselmann
                           NotImplemented, NotImplemented)
120 b255379d Michael Hanselmann
121 b255379d Michael Hanselmann
  def testTimeout(self):
122 b255379d Michael Hanselmann
    fn = testutils.CallCounter(self._Fail)
123 b255379d Michael Hanselmann
    try:
124 b255379d Michael Hanselmann
      hv_xen._GetXmList(fn, False, _timeout=0.1)
125 b255379d Michael Hanselmann
    except errors.HypervisorError, err:
126 b255379d Michael Hanselmann
      self.assertTrue("timeout exceeded" in str(err))
127 b255379d Michael Hanselmann
    else:
128 b255379d Michael Hanselmann
      self.fail("Exception was not raised")
129 b255379d Michael Hanselmann
130 b255379d Michael Hanselmann
    self.assertTrue(fn.Count() < 10,
131 b255379d Michael Hanselmann
                    msg="'xm list' was called too many times")
132 b255379d Michael Hanselmann
133 b255379d Michael Hanselmann
  def _Success(self, stdout):
134 b255379d Michael Hanselmann
    return utils.RunResult(constants.EXIT_SUCCESS, None, stdout, "", None,
135 b255379d Michael Hanselmann
                           NotImplemented, NotImplemented)
136 b255379d Michael Hanselmann
137 b255379d Michael Hanselmann
  def testSuccess(self):
138 b255379d Michael Hanselmann
    data = testutils.ReadTestData("xen-xm-list-4.0.1-four-instances.txt")
139 b255379d Michael Hanselmann
140 b255379d Michael Hanselmann
    fn = testutils.CallCounter(compat.partial(self._Success, data))
141 b255379d Michael Hanselmann
142 b255379d Michael Hanselmann
    result = hv_xen._GetXmList(fn, True, _timeout=0.1)
143 b255379d Michael Hanselmann
144 b255379d Michael Hanselmann
    self.assertEqual(len(result), 4)
145 b255379d Michael Hanselmann
146 b255379d Michael Hanselmann
    self.assertEqual(map(compat.fst, result), [
147 b255379d Michael Hanselmann
      "Domain-0",
148 b255379d Michael Hanselmann
      "server01.example.com",
149 b255379d Michael Hanselmann
      "web3106215069.example.com",
150 b255379d Michael Hanselmann
      "testinstance.example.com",
151 b255379d Michael Hanselmann
      ])
152 b255379d Michael Hanselmann
153 b255379d Michael Hanselmann
    self.assertEqual(fn.Count(), 1)
154 b255379d Michael Hanselmann
155 b255379d Michael Hanselmann
156 06c9a520 Michael Hanselmann
class TestParseNodeInfo(testutils.GanetiTestCase):
157 06c9a520 Michael Hanselmann
  def testEmpty(self):
158 06c9a520 Michael Hanselmann
    self.assertEqual(hv_xen._ParseNodeInfo(""), {})
159 06c9a520 Michael Hanselmann
160 06c9a520 Michael Hanselmann
  def testUnknownInput(self):
161 06c9a520 Michael Hanselmann
    data = "\n".join([
162 06c9a520 Michael Hanselmann
      "foo bar",
163 06c9a520 Michael Hanselmann
      "something else goes",
164 06c9a520 Michael Hanselmann
      "here",
165 06c9a520 Michael Hanselmann
      ])
166 06c9a520 Michael Hanselmann
    self.assertEqual(hv_xen._ParseNodeInfo(data), {})
167 06c9a520 Michael Hanselmann
168 06c9a520 Michael Hanselmann
  def testBasicInfo(self):
169 06c9a520 Michael Hanselmann
    data = testutils.ReadTestData("xen-xm-info-4.0.1.txt")
170 06c9a520 Michael Hanselmann
    result = hv_xen._ParseNodeInfo(data)
171 06c9a520 Michael Hanselmann
    self.assertEqual(result, {
172 06c9a520 Michael Hanselmann
      "cpu_nodes": 1,
173 06c9a520 Michael Hanselmann
      "cpu_sockets": 2,
174 06c9a520 Michael Hanselmann
      "cpu_total": 4,
175 06c9a520 Michael Hanselmann
      "hv_version": (4, 0),
176 06c9a520 Michael Hanselmann
      "memory_free": 8004,
177 06c9a520 Michael Hanselmann
      "memory_total": 16378,
178 06c9a520 Michael Hanselmann
      })
179 06c9a520 Michael Hanselmann
180 06c9a520 Michael Hanselmann
181 06c9a520 Michael Hanselmann
class TestMergeInstanceInfo(testutils.GanetiTestCase):
182 06c9a520 Michael Hanselmann
  def testEmpty(self):
183 06c9a520 Michael Hanselmann
    self.assertEqual(hv_xen._MergeInstanceInfo({}, lambda _: []), {})
184 06c9a520 Michael Hanselmann
185 06c9a520 Michael Hanselmann
  def _FakeXmList(self, include_node):
186 06c9a520 Michael Hanselmann
    self.assertTrue(include_node)
187 06c9a520 Michael Hanselmann
    return [
188 06c9a520 Michael Hanselmann
      (hv_xen._DOM0_NAME, NotImplemented, 4096, 7, NotImplemented,
189 06c9a520 Michael Hanselmann
       NotImplemented),
190 06c9a520 Michael Hanselmann
      ("inst1.example.com", NotImplemented, 2048, 4, NotImplemented,
191 06c9a520 Michael Hanselmann
       NotImplemented),
192 06c9a520 Michael Hanselmann
      ]
193 06c9a520 Michael Hanselmann
194 06c9a520 Michael Hanselmann
  def testMissingNodeInfo(self):
195 06c9a520 Michael Hanselmann
    result = hv_xen._MergeInstanceInfo({}, self._FakeXmList)
196 06c9a520 Michael Hanselmann
    self.assertEqual(result, {
197 06c9a520 Michael Hanselmann
      "memory_dom0": 4096,
198 06c9a520 Michael Hanselmann
      "dom0_cpus": 7,
199 06c9a520 Michael Hanselmann
      })
200 06c9a520 Michael Hanselmann
201 06c9a520 Michael Hanselmann
  def testWithNodeInfo(self):
202 06c9a520 Michael Hanselmann
    info = testutils.ReadTestData("xen-xm-info-4.0.1.txt")
203 06c9a520 Michael Hanselmann
    result = hv_xen._GetNodeInfo(info, self._FakeXmList)
204 06c9a520 Michael Hanselmann
    self.assertEqual(result, {
205 06c9a520 Michael Hanselmann
      "cpu_nodes": 1,
206 06c9a520 Michael Hanselmann
      "cpu_sockets": 2,
207 06c9a520 Michael Hanselmann
      "cpu_total": 4,
208 06c9a520 Michael Hanselmann
      "dom0_cpus": 7,
209 06c9a520 Michael Hanselmann
      "hv_version": (4, 0),
210 06c9a520 Michael Hanselmann
      "memory_dom0": 4096,
211 06c9a520 Michael Hanselmann
      "memory_free": 8004,
212 06c9a520 Michael Hanselmann
      "memory_hv": 2230,
213 06c9a520 Michael Hanselmann
      "memory_total": 16378,
214 06c9a520 Michael Hanselmann
      })
215 06c9a520 Michael Hanselmann
216 06c9a520 Michael Hanselmann
217 d0bb3f24 Michael Hanselmann
class TestGetConfigFileDiskData(unittest.TestCase):
218 d0bb3f24 Michael Hanselmann
  def testLetterCount(self):
219 d0bb3f24 Michael Hanselmann
    self.assertEqual(len(hv_xen._DISK_LETTERS), 26)
220 d0bb3f24 Michael Hanselmann
221 d0bb3f24 Michael Hanselmann
  def testNoDisks(self):
222 d0bb3f24 Michael Hanselmann
    self.assertEqual(hv_xen._GetConfigFileDiskData([], "hd"), [])
223 d0bb3f24 Michael Hanselmann
224 d0bb3f24 Michael Hanselmann
  def testManyDisks(self):
225 d0bb3f24 Michael Hanselmann
    for offset in [0, 1, 10]:
226 d0bb3f24 Michael Hanselmann
      disks = [(objects.Disk(dev_type=constants.LD_LV), "/tmp/disk/%s" % idx)
227 d0bb3f24 Michael Hanselmann
               for idx in range(len(hv_xen._DISK_LETTERS) + offset)]
228 d0bb3f24 Michael Hanselmann
229 d0bb3f24 Michael Hanselmann
      if offset == 0:
230 d0bb3f24 Michael Hanselmann
        result = hv_xen._GetConfigFileDiskData(disks, "hd")
231 d0bb3f24 Michael Hanselmann
        self.assertEqual(result, [
232 d0bb3f24 Michael Hanselmann
          "'phy:/tmp/disk/%s,hd%s,r'" % (idx, string.ascii_lowercase[idx])
233 d0bb3f24 Michael Hanselmann
          for idx in range(len(hv_xen._DISK_LETTERS) + offset)
234 d0bb3f24 Michael Hanselmann
          ])
235 d0bb3f24 Michael Hanselmann
      else:
236 d0bb3f24 Michael Hanselmann
        try:
237 d0bb3f24 Michael Hanselmann
          hv_xen._GetConfigFileDiskData(disks, "hd")
238 d0bb3f24 Michael Hanselmann
        except errors.HypervisorError, err:
239 d0bb3f24 Michael Hanselmann
          self.assertEqual(str(err), "Too many disks")
240 d0bb3f24 Michael Hanselmann
        else:
241 d0bb3f24 Michael Hanselmann
          self.fail("Exception was not raised")
242 d0bb3f24 Michael Hanselmann
243 d0bb3f24 Michael Hanselmann
  def testTwoLvDisksWithMode(self):
244 d0bb3f24 Michael Hanselmann
    disks = [
245 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDWR),
246 d0bb3f24 Michael Hanselmann
       "/tmp/diskFirst"),
247 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_LV, mode=constants.DISK_RDONLY),
248 d0bb3f24 Michael Hanselmann
       "/tmp/diskLast"),
249 d0bb3f24 Michael Hanselmann
      ]
250 d0bb3f24 Michael Hanselmann
251 d0bb3f24 Michael Hanselmann
    result = hv_xen._GetConfigFileDiskData(disks, "hd")
252 d0bb3f24 Michael Hanselmann
    self.assertEqual(result, [
253 d0bb3f24 Michael Hanselmann
      "'phy:/tmp/diskFirst,hda,w'",
254 d0bb3f24 Michael Hanselmann
      "'phy:/tmp/diskLast,hdb,r'",
255 d0bb3f24 Michael Hanselmann
      ])
256 d0bb3f24 Michael Hanselmann
257 d0bb3f24 Michael Hanselmann
  def testFileDisks(self):
258 d0bb3f24 Michael Hanselmann
    disks = [
259 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
260 d0bb3f24 Michael Hanselmann
                    physical_id=[constants.FD_LOOP]),
261 d0bb3f24 Michael Hanselmann
       "/tmp/diskFirst"),
262 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDONLY,
263 d0bb3f24 Michael Hanselmann
                    physical_id=[constants.FD_BLKTAP]),
264 d0bb3f24 Michael Hanselmann
       "/tmp/diskTwo"),
265 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
266 d0bb3f24 Michael Hanselmann
                    physical_id=[constants.FD_LOOP]),
267 d0bb3f24 Michael Hanselmann
       "/tmp/diskThree"),
268 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
269 d0bb3f24 Michael Hanselmann
                    physical_id=[constants.FD_BLKTAP]),
270 d0bb3f24 Michael Hanselmann
       "/tmp/diskLast"),
271 d0bb3f24 Michael Hanselmann
      ]
272 d0bb3f24 Michael Hanselmann
273 d0bb3f24 Michael Hanselmann
    result = hv_xen._GetConfigFileDiskData(disks, "sd")
274 d0bb3f24 Michael Hanselmann
    self.assertEqual(result, [
275 d0bb3f24 Michael Hanselmann
      "'file:/tmp/diskFirst,sda,w'",
276 d0bb3f24 Michael Hanselmann
      "'tap:aio:/tmp/diskTwo,sdb,r'",
277 d0bb3f24 Michael Hanselmann
      "'file:/tmp/diskThree,sdc,w'",
278 d0bb3f24 Michael Hanselmann
      "'tap:aio:/tmp/diskLast,sdd,w'",
279 d0bb3f24 Michael Hanselmann
      ])
280 d0bb3f24 Michael Hanselmann
281 d0bb3f24 Michael Hanselmann
  def testInvalidFileDisk(self):
282 d0bb3f24 Michael Hanselmann
    disks = [
283 d0bb3f24 Michael Hanselmann
      (objects.Disk(dev_type=constants.LD_FILE, mode=constants.DISK_RDWR,
284 d0bb3f24 Michael Hanselmann
                    physical_id=["#unknown#"]),
285 d0bb3f24 Michael Hanselmann
       "/tmp/diskinvalid"),
286 d0bb3f24 Michael Hanselmann
      ]
287 d0bb3f24 Michael Hanselmann
288 d0bb3f24 Michael Hanselmann
    self.assertRaises(KeyError, hv_xen._GetConfigFileDiskData, disks, "sd")
289 d0bb3f24 Michael Hanselmann
290 d0bb3f24 Michael Hanselmann
291 1dee2041 Michael Hanselmann
class TestXenHypervisorUnknownCommand(unittest.TestCase):
292 1dee2041 Michael Hanselmann
  def test(self):
293 1dee2041 Michael Hanselmann
    cmd = "#unknown command#"
294 1dee2041 Michael Hanselmann
    self.assertFalse(cmd in constants.KNOWN_XEN_COMMANDS)
295 1dee2041 Michael Hanselmann
    hv = hv_xen.XenHypervisor(_cfgdir=NotImplemented,
296 1dee2041 Michael Hanselmann
                              _run_cmd_fn=NotImplemented,
297 1dee2041 Michael Hanselmann
                              _cmd=cmd)
298 1dee2041 Michael Hanselmann
    self.assertRaises(errors.ProgrammerError, hv._RunXen, [])
299 1dee2041 Michael Hanselmann
300 1dee2041 Michael Hanselmann
301 55cc0a44 Michael Hanselmann
if __name__ == "__main__":
302 55cc0a44 Michael Hanselmann
  testutils.GanetiTestProgram()