Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.objects_unittest.py @ 93fd9bb1

History | View | Annotate | Download (11.9 kB)

1 4c14965f Guido Trotter
#!/usr/bin/python
2 4c14965f Guido Trotter
#
3 4c14965f Guido Trotter
4 432e8e2f Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2010, 2012 Google Inc.
5 4c14965f Guido Trotter
#
6 4c14965f Guido Trotter
# This program is free software; you can redistribute it and/or modify
7 4c14965f Guido Trotter
# it under the terms of the GNU General Public License as published by
8 4c14965f Guido Trotter
# the Free Software Foundation; either version 2 of the License, or
9 4c14965f Guido Trotter
# (at your option) any later version.
10 4c14965f Guido Trotter
#
11 4c14965f Guido Trotter
# This program is distributed in the hope that it will be useful, but
12 4c14965f Guido Trotter
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 4c14965f Guido Trotter
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 4c14965f Guido Trotter
# General Public License for more details.
15 4c14965f Guido Trotter
#
16 4c14965f Guido Trotter
# You should have received a copy of the GNU General Public License
17 4c14965f Guido Trotter
# along with this program; if not, write to the Free Software
18 4c14965f Guido Trotter
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 fd7b69c0 Michael Hanselmann
# 02110-1301, USA.
20 4c14965f Guido Trotter
21 4c14965f Guido Trotter
22 4c14965f Guido Trotter
"""Script for unittesting the objects module"""
23 4c14965f Guido Trotter
24 4c14965f Guido Trotter
25 4c14965f Guido Trotter
import unittest
26 4c14965f Guido Trotter
27 7b64b9ea René Nussbaumer
from ganeti import constants
28 4c14965f Guido Trotter
from ganeti import objects
29 6a050007 Michael Hanselmann
from ganeti import errors
30 4c14965f Guido Trotter
31 25231ec5 Michael Hanselmann
import testutils
32 25231ec5 Michael Hanselmann
33 25231ec5 Michael Hanselmann
34 4c14965f Guido Trotter
class SimpleObject(objects.ConfigObject):
35 4c14965f Guido Trotter
  __slots__ = ['a', 'b']
36 4c14965f Guido Trotter
37 25231ec5 Michael Hanselmann
38 4c14965f Guido Trotter
class TestDictState(unittest.TestCase):
39 4c14965f Guido Trotter
  """Simple dict tansformation tests"""
40 4c14965f Guido Trotter
41 4c14965f Guido Trotter
  def testSimpleObjectToDict(self):
42 4c14965f Guido Trotter
    o1 = SimpleObject(a='1')
43 4c14965f Guido Trotter
    self.assertEquals(o1.ToDict(), {'a': '1'})
44 4c14965f Guido Trotter
    self.assertEquals(o1.__getstate__(), {'a': '1'})
45 4c14965f Guido Trotter
    self.assertEquals(o1.__getstate__(), o1.ToDict())
46 4c14965f Guido Trotter
    o1.a = 2
47 4c14965f Guido Trotter
    o1.b = 5
48 4c14965f Guido Trotter
    self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5})
49 4c14965f Guido Trotter
    o2 = SimpleObject.FromDict(o1.ToDict())
50 4c14965f Guido Trotter
    self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5})
51 4c14965f Guido Trotter
52 4c14965f Guido Trotter
53 7b64b9ea René Nussbaumer
class TestClusterObject(unittest.TestCase):
54 7b64b9ea René Nussbaumer
  """Tests done on a L{objects.Cluster}"""
55 7b64b9ea René Nussbaumer
56 7b64b9ea René Nussbaumer
  def setUp(self):
57 7b64b9ea René Nussbaumer
    hvparams = {
58 7b64b9ea René Nussbaumer
      constants.HT_FAKE: {
59 7b64b9ea René Nussbaumer
        "foo": "bar",
60 7b64b9ea René Nussbaumer
        "bar": "foo",
61 7b64b9ea René Nussbaumer
        "foobar": "barfoo",
62 7b64b9ea René Nussbaumer
        },
63 7b64b9ea René Nussbaumer
      }
64 7b64b9ea René Nussbaumer
    os_hvp = {
65 7b64b9ea René Nussbaumer
      "lenny-image": {
66 7b64b9ea René Nussbaumer
        constants.HT_FAKE: {
67 7b64b9ea René Nussbaumer
          "foo": "baz",
68 7b64b9ea René Nussbaumer
          "foobar": "foobar",
69 7b64b9ea René Nussbaumer
          "blah": "blibb",
70 7b64b9ea René Nussbaumer
          "blubb": "blah",
71 7b64b9ea René Nussbaumer
          },
72 7b64b9ea René Nussbaumer
        constants.HT_XEN_PVM: {
73 7b64b9ea René Nussbaumer
          "root_path": "/dev/sda5",
74 7b64b9ea René Nussbaumer
          "foo": "foobar",
75 7b64b9ea René Nussbaumer
          },
76 7b64b9ea René Nussbaumer
        },
77 7b64b9ea René Nussbaumer
      "ubuntu-hardy": {
78 7b64b9ea René Nussbaumer
        },
79 7b64b9ea René Nussbaumer
      }
80 095e71aa René Nussbaumer
    ndparams = {
81 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/cluster-oob",
82 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 1
83 095e71aa René Nussbaumer
        }
84 095e71aa René Nussbaumer
85 095e71aa René Nussbaumer
    self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
86 095e71aa René Nussbaumer
                                   ndparams=ndparams)
87 7b64b9ea René Nussbaumer
    self.fake_cl.UpgradeConfig()
88 7b64b9ea René Nussbaumer
89 d63479b5 Iustin Pop
  def testGetHVDefaults(self):
90 d63479b5 Iustin Pop
    cl = self.fake_cl
91 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
92 d63479b5 Iustin Pop
                         cl.hvparams[constants.HT_FAKE])
93 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(None), {})
94 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
95 d63479b5 Iustin Pop
                                          os_name="lenny-image"),
96 d63479b5 Iustin Pop
                         cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
97 d63479b5 Iustin Pop
98 d63479b5 Iustin Pop
99 7b64b9ea René Nussbaumer
  def testFillHvFullMerge(self):
100 7b64b9ea René Nussbaumer
    inst_hvparams = {
101 7b64b9ea René Nussbaumer
      "blah": "blubb",
102 7b64b9ea René Nussbaumer
      }
103 7b64b9ea René Nussbaumer
104 7b64b9ea René Nussbaumer
    fake_dict = {
105 7b64b9ea René Nussbaumer
      "foo": "baz",
106 7b64b9ea René Nussbaumer
      "bar": "foo",
107 7b64b9ea René Nussbaumer
      "foobar": "foobar",
108 7b64b9ea René Nussbaumer
      "blah": "blubb",
109 7b64b9ea René Nussbaumer
      "blubb": "blah",
110 7b64b9ea René Nussbaumer
      }
111 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
112 7b64b9ea René Nussbaumer
                                 os="lenny-image",
113 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
114 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
115 7b64b9ea René Nussbaumer
    self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
116 7b64b9ea René Nussbaumer
117 7b64b9ea René Nussbaumer
  def testFillHvGlobalParams(self):
118 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
119 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
120 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
121 7b64b9ea René Nussbaumer
                                 hvparams={})
122 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
123 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
124 7b64b9ea René Nussbaumer
125 7b64b9ea René Nussbaumer
  def testFillHvInstParams(self):
126 7b64b9ea René Nussbaumer
    inst_hvparams = {
127 7b64b9ea René Nussbaumer
      "blah": "blubb",
128 7b64b9ea René Nussbaumer
      }
129 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
130 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
131 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
132 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
133 7b64b9ea René Nussbaumer
    self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
134 7b64b9ea René Nussbaumer
135 7b64b9ea René Nussbaumer
  def testFillHvEmptyParams(self):
136 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
137 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
138 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
139 7b64b9ea René Nussbaumer
                                 hvparams={})
140 7b64b9ea René Nussbaumer
    self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
141 7b64b9ea René Nussbaumer
142 7b64b9ea René Nussbaumer
  def testFillHvPartialParams(self):
143 7b64b9ea René Nussbaumer
    os = "lenny-image"
144 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
145 7b64b9ea René Nussbaumer
                                 os=os,
146 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
147 7b64b9ea René Nussbaumer
                                 hvparams={})
148 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
149 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
150 7b64b9ea René Nussbaumer
151 095e71aa René Nussbaumer
  def testFillNdParamsCluster(self):
152 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
153 095e71aa René Nussbaumer
                             ndparams={},
154 095e71aa René Nussbaumer
                             group="testgroup")
155 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
156 095e71aa René Nussbaumer
                                   ndparams={})
157 095e71aa René Nussbaumer
    self.assertEqual(self.fake_cl.ndparams,
158 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
159 095e71aa René Nussbaumer
160 095e71aa René Nussbaumer
  def testFillNdParamsNodeGroup(self):
161 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
162 095e71aa René Nussbaumer
                             ndparams={},
163 095e71aa René Nussbaumer
                             group="testgroup")
164 095e71aa René Nussbaumer
    group_ndparams = {
165 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
166 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 10,
167 095e71aa René Nussbaumer
        }
168 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
169 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
170 095e71aa René Nussbaumer
    self.assertEqual(group_ndparams,
171 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
172 095e71aa René Nussbaumer
173 095e71aa René Nussbaumer
  def testFillNdParamsNode(self):
174 095e71aa René Nussbaumer
    node_ndparams = {
175 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
176 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 2,
177 095e71aa René Nussbaumer
        }
178 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
179 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
180 095e71aa René Nussbaumer
                             group="testgroup")
181 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
182 095e71aa René Nussbaumer
                                   ndparams={})
183 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
184 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
185 095e71aa René Nussbaumer
186 095e71aa René Nussbaumer
  def testFillNdParamsAll(self):
187 095e71aa René Nussbaumer
    node_ndparams = {
188 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
189 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 5,
190 095e71aa René Nussbaumer
        }
191 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
192 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
193 095e71aa René Nussbaumer
                             group="testgroup")
194 095e71aa René Nussbaumer
    group_ndparams = {
195 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
196 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 4,
197 095e71aa René Nussbaumer
        }
198 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
199 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
200 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
201 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
202 095e71aa René Nussbaumer
203 0fbedb7a Michael Hanselmann
  def testPrimaryHypervisor(self):
204 0fbedb7a Michael Hanselmann
    assert self.fake_cl.enabled_hypervisors is None
205 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
206 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
207 0fbedb7a Michael Hanselmann
208 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
209 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
210 0fbedb7a Michael Hanselmann
211 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
212 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
213 0fbedb7a Michael Hanselmann
214 7b64b9ea René Nussbaumer
215 870dc44c Iustin Pop
class TestOS(unittest.TestCase):
216 870dc44c Iustin Pop
  ALL_DATA = [
217 870dc44c Iustin Pop
    "debootstrap",
218 870dc44c Iustin Pop
    "debootstrap+default",
219 870dc44c Iustin Pop
    "debootstrap++default",
220 870dc44c Iustin Pop
    ]
221 870dc44c Iustin Pop
222 870dc44c Iustin Pop
  def testSplitNameVariant(self):
223 870dc44c Iustin Pop
    for name in self.ALL_DATA:
224 870dc44c Iustin Pop
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
225 870dc44c Iustin Pop
226 870dc44c Iustin Pop
  def testVariant(self):
227 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
228 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
229 870dc44c Iustin Pop
230 870dc44c Iustin Pop
231 6a050007 Michael Hanselmann
class TestInstance(unittest.TestCase):
232 6a050007 Michael Hanselmann
  def _GenericCheck(self, inst):
233 6a050007 Michael Hanselmann
    for i in [inst.all_nodes, inst.secondary_nodes]:
234 6a050007 Michael Hanselmann
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
235 6a050007 Michael Hanselmann
                      msg="Data type doesn't guarantee order")
236 6a050007 Michael Hanselmann
237 6a050007 Michael Hanselmann
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
238 6a050007 Michael Hanselmann
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
239 6a050007 Michael Hanselmann
                     msg="Primary node not first node in list")
240 6a050007 Michael Hanselmann
241 6a050007 Michael Hanselmann
  def testNodesNoDisks(self):
242 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinst.example.com",
243 6a050007 Michael Hanselmann
      primary_node="pnode.example.com",
244 6a050007 Michael Hanselmann
      disks=[
245 6a050007 Michael Hanselmann
        ])
246 6a050007 Michael Hanselmann
247 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
248 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
249 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
250 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
251 6a050007 Michael Hanselmann
      inst.primary_node: [],
252 6a050007 Michael Hanselmann
      })
253 6a050007 Michael Hanselmann
254 6a050007 Michael Hanselmann
  def testNodesPlainDisks(self):
255 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstplain.example.com",
256 6a050007 Michael Hanselmann
      primary_node="node3.example.com",
257 6a050007 Michael Hanselmann
      disks=[
258 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=128,
259 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk25494")),
260 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=512,
261 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk29071")),
262 6a050007 Michael Hanselmann
        ])
263 6a050007 Michael Hanselmann
264 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
265 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
266 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
267 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
268 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
269 6a050007 Michael Hanselmann
      })
270 6a050007 Michael Hanselmann
271 6a050007 Michael Hanselmann
  def testNodesDrbdDisks(self):
272 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstdrbd.example.com",
273 6a050007 Michael Hanselmann
      primary_node="node10.example.com",
274 6a050007 Michael Hanselmann
      disks=[
275 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_DRBD8, size=786432,
276 6a050007 Michael Hanselmann
          logical_id=("node10.example.com", "node15.example.com",
277 6a050007 Michael Hanselmann
                      12300, 0, 0, "secret"),
278 6a050007 Michael Hanselmann
          children=[
279 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=786432,
280 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "disk0")),
281 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=128,
282 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "meta0"))
283 6a050007 Michael Hanselmann
          ],
284 6a050007 Michael Hanselmann
          iv_name="disk/0")
285 6a050007 Michael Hanselmann
        ])
286 6a050007 Michael Hanselmann
287 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
288 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
289 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes),
290 6a050007 Michael Hanselmann
                     set([inst.primary_node, "node15.example.com"]))
291 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
292 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
293 6a050007 Michael Hanselmann
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
294 6a050007 Michael Hanselmann
      })
295 6a050007 Michael Hanselmann
296 6a050007 Michael Hanselmann
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
297 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
298 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
299 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
300 6a050007 Michael Hanselmann
301 6a050007 Michael Hanselmann
302 5f06ce5e Michael Hanselmann
class TestNode(unittest.TestCase):
303 5f06ce5e Michael Hanselmann
  def testEmpty(self):
304 5f06ce5e Michael Hanselmann
    self.assertEqual(objects.Node().ToDict(), {})
305 5f06ce5e Michael Hanselmann
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
306 5f06ce5e Michael Hanselmann
307 5f06ce5e Michael Hanselmann
  def testHvState(self):
308 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node18157.example.com", hv_state={
309 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
310 5f06ce5e Michael Hanselmann
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
311 5f06ce5e Michael Hanselmann
      })
312 5f06ce5e Michael Hanselmann
313 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
314 5f06ce5e Michael Hanselmann
315 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
316 5f06ce5e Michael Hanselmann
    del node
317 5f06ce5e Michael Hanselmann
318 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node18157.example.com")
319 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.hv_state), frozenset([
320 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM,
321 5f06ce5e Michael Hanselmann
      constants.HT_KVM,
322 5f06ce5e Michael Hanselmann
      ]))
323 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
324 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
325 5f06ce5e Michael Hanselmann
326 5f06ce5e Michael Hanselmann
  def testDiskState(self):
327 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node32087.example.com", disk_state={
328 5f06ce5e Michael Hanselmann
      constants.LD_LV: {
329 5f06ce5e Michael Hanselmann
        "lv32352": objects.NodeDiskState(total=128),
330 5f06ce5e Michael Hanselmann
        "lv2082": objects.NodeDiskState(total=512),
331 5f06ce5e Michael Hanselmann
        },
332 5f06ce5e Michael Hanselmann
      })
333 5f06ce5e Michael Hanselmann
334 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
335 5f06ce5e Michael Hanselmann
336 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
337 5f06ce5e Michael Hanselmann
    del node
338 5f06ce5e Michael Hanselmann
339 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node32087.example.com")
340 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state), frozenset([
341 5f06ce5e Michael Hanselmann
      constants.LD_LV,
342 5f06ce5e Michael Hanselmann
      ]))
343 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state[constants.LD_LV]), frozenset([
344 5f06ce5e Michael Hanselmann
      "lv32352",
345 5f06ce5e Michael Hanselmann
      "lv2082",
346 5f06ce5e Michael Hanselmann
      ]))
347 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv2082"].total, 512)
348 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv32352"].total, 128)
349 5f06ce5e Michael Hanselmann
350 5f06ce5e Michael Hanselmann
351 4c14965f Guido Trotter
if __name__ == '__main__':
352 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()