Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.objects_unittest.py @ 9fa567b3

History | View | Annotate | Download (11.7 kB)

1 4c14965f Guido Trotter
#!/usr/bin/python
2 4c14965f Guido Trotter
#
3 4c14965f Guido Trotter
4 870dc44c Iustin Pop
# Copyright (C) 2006, 2007, 2008, 2010 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 095e71aa René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/cluster-oob"
82 095e71aa René Nussbaumer
        }
83 095e71aa René Nussbaumer
84 095e71aa René Nussbaumer
    self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
85 095e71aa René Nussbaumer
                                   ndparams=ndparams)
86 7b64b9ea René Nussbaumer
    self.fake_cl.UpgradeConfig()
87 7b64b9ea René Nussbaumer
88 d63479b5 Iustin Pop
  def testGetHVDefaults(self):
89 d63479b5 Iustin Pop
    cl = self.fake_cl
90 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
91 d63479b5 Iustin Pop
                         cl.hvparams[constants.HT_FAKE])
92 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(None), {})
93 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
94 d63479b5 Iustin Pop
                                          os_name="lenny-image"),
95 d63479b5 Iustin Pop
                         cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
96 d63479b5 Iustin Pop
97 d63479b5 Iustin Pop
98 7b64b9ea René Nussbaumer
  def testFillHvFullMerge(self):
99 7b64b9ea René Nussbaumer
    inst_hvparams = {
100 7b64b9ea René Nussbaumer
      "blah": "blubb",
101 7b64b9ea René Nussbaumer
      }
102 7b64b9ea René Nussbaumer
103 7b64b9ea René Nussbaumer
    fake_dict = {
104 7b64b9ea René Nussbaumer
      "foo": "baz",
105 7b64b9ea René Nussbaumer
      "bar": "foo",
106 7b64b9ea René Nussbaumer
      "foobar": "foobar",
107 7b64b9ea René Nussbaumer
      "blah": "blubb",
108 7b64b9ea René Nussbaumer
      "blubb": "blah",
109 7b64b9ea René Nussbaumer
      }
110 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
111 7b64b9ea René Nussbaumer
                                 os="lenny-image",
112 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
113 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
114 7b64b9ea René Nussbaumer
    self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
115 7b64b9ea René Nussbaumer
116 7b64b9ea René Nussbaumer
  def testFillHvGlobalParams(self):
117 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
118 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
119 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
120 7b64b9ea René Nussbaumer
                                 hvparams={})
121 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
122 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
123 7b64b9ea René Nussbaumer
124 7b64b9ea René Nussbaumer
  def testFillHvInstParams(self):
125 7b64b9ea René Nussbaumer
    inst_hvparams = {
126 7b64b9ea René Nussbaumer
      "blah": "blubb",
127 7b64b9ea René Nussbaumer
      }
128 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
129 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
130 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
131 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
132 7b64b9ea René Nussbaumer
    self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
133 7b64b9ea René Nussbaumer
134 7b64b9ea René Nussbaumer
  def testFillHvEmptyParams(self):
135 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
136 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
137 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
138 7b64b9ea René Nussbaumer
                                 hvparams={})
139 7b64b9ea René Nussbaumer
    self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
140 7b64b9ea René Nussbaumer
141 7b64b9ea René Nussbaumer
  def testFillHvPartialParams(self):
142 7b64b9ea René Nussbaumer
    os = "lenny-image"
143 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
144 7b64b9ea René Nussbaumer
                                 os=os,
145 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
146 7b64b9ea René Nussbaumer
                                 hvparams={})
147 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
148 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
149 7b64b9ea René Nussbaumer
150 095e71aa René Nussbaumer
  def testFillNdParamsCluster(self):
151 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
152 095e71aa René Nussbaumer
                             ndparams={},
153 095e71aa René Nussbaumer
                             group="testgroup")
154 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
155 095e71aa René Nussbaumer
                                   ndparams={})
156 095e71aa René Nussbaumer
    self.assertEqual(self.fake_cl.ndparams,
157 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
158 095e71aa René Nussbaumer
159 095e71aa René Nussbaumer
  def testFillNdParamsNodeGroup(self):
160 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
161 095e71aa René Nussbaumer
                             ndparams={},
162 095e71aa René Nussbaumer
                             group="testgroup")
163 095e71aa René Nussbaumer
    group_ndparams = {
164 095e71aa René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/group-oob"
165 095e71aa René Nussbaumer
        }
166 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
167 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
168 095e71aa René Nussbaumer
    self.assertEqual(group_ndparams,
169 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
170 095e71aa René Nussbaumer
171 095e71aa René Nussbaumer
  def testFillNdParamsNode(self):
172 095e71aa René Nussbaumer
    node_ndparams = {
173 095e71aa René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/node-oob"
174 095e71aa René Nussbaumer
        }
175 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
176 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
177 095e71aa René Nussbaumer
                             group="testgroup")
178 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
179 095e71aa René Nussbaumer
                                   ndparams={})
180 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
181 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
182 095e71aa René Nussbaumer
183 095e71aa René Nussbaumer
  def testFillNdParamsAll(self):
184 095e71aa René Nussbaumer
    node_ndparams = {
185 095e71aa René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/node-oob"
186 095e71aa René Nussbaumer
        }
187 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
188 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
189 095e71aa René Nussbaumer
                             group="testgroup")
190 095e71aa René Nussbaumer
    group_ndparams = {
191 095e71aa René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/group-oob"
192 095e71aa René Nussbaumer
        }
193 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
194 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
195 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
196 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
197 095e71aa René Nussbaumer
198 0fbedb7a Michael Hanselmann
  def testPrimaryHypervisor(self):
199 0fbedb7a Michael Hanselmann
    assert self.fake_cl.enabled_hypervisors is None
200 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
201 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
202 0fbedb7a Michael Hanselmann
203 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
204 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
205 0fbedb7a Michael Hanselmann
206 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
207 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
208 0fbedb7a Michael Hanselmann
209 7b64b9ea René Nussbaumer
210 870dc44c Iustin Pop
class TestOS(unittest.TestCase):
211 870dc44c Iustin Pop
  ALL_DATA = [
212 870dc44c Iustin Pop
    "debootstrap",
213 870dc44c Iustin Pop
    "debootstrap+default",
214 870dc44c Iustin Pop
    "debootstrap++default",
215 870dc44c Iustin Pop
    ]
216 870dc44c Iustin Pop
217 870dc44c Iustin Pop
  def testSplitNameVariant(self):
218 870dc44c Iustin Pop
    for name in self.ALL_DATA:
219 870dc44c Iustin Pop
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
220 870dc44c Iustin Pop
221 870dc44c Iustin Pop
  def testVariant(self):
222 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
223 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
224 870dc44c Iustin Pop
225 870dc44c Iustin Pop
226 6a050007 Michael Hanselmann
class TestInstance(unittest.TestCase):
227 6a050007 Michael Hanselmann
  def _GenericCheck(self, inst):
228 6a050007 Michael Hanselmann
    for i in [inst.all_nodes, inst.secondary_nodes]:
229 6a050007 Michael Hanselmann
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
230 6a050007 Michael Hanselmann
                      msg="Data type doesn't guarantee order")
231 6a050007 Michael Hanselmann
232 6a050007 Michael Hanselmann
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
233 6a050007 Michael Hanselmann
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
234 6a050007 Michael Hanselmann
                     msg="Primary node not first node in list")
235 6a050007 Michael Hanselmann
236 6a050007 Michael Hanselmann
  def testNodesNoDisks(self):
237 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinst.example.com",
238 6a050007 Michael Hanselmann
      primary_node="pnode.example.com",
239 6a050007 Michael Hanselmann
      disks=[
240 6a050007 Michael Hanselmann
        ])
241 6a050007 Michael Hanselmann
242 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
243 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
244 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
245 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
246 6a050007 Michael Hanselmann
      inst.primary_node: [],
247 6a050007 Michael Hanselmann
      })
248 6a050007 Michael Hanselmann
249 6a050007 Michael Hanselmann
  def testNodesPlainDisks(self):
250 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstplain.example.com",
251 6a050007 Michael Hanselmann
      primary_node="node3.example.com",
252 6a050007 Michael Hanselmann
      disks=[
253 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=128,
254 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk25494")),
255 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=512,
256 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk29071")),
257 6a050007 Michael Hanselmann
        ])
258 6a050007 Michael Hanselmann
259 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
260 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
261 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
262 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
263 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
264 6a050007 Michael Hanselmann
      })
265 6a050007 Michael Hanselmann
266 6a050007 Michael Hanselmann
  def testNodesDrbdDisks(self):
267 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstdrbd.example.com",
268 6a050007 Michael Hanselmann
      primary_node="node10.example.com",
269 6a050007 Michael Hanselmann
      disks=[
270 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_DRBD8, size=786432,
271 6a050007 Michael Hanselmann
          logical_id=("node10.example.com", "node15.example.com",
272 6a050007 Michael Hanselmann
                      12300, 0, 0, "secret"),
273 6a050007 Michael Hanselmann
          children=[
274 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=786432,
275 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "disk0")),
276 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=128,
277 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "meta0"))
278 6a050007 Michael Hanselmann
          ],
279 6a050007 Michael Hanselmann
          iv_name="disk/0")
280 6a050007 Michael Hanselmann
        ])
281 6a050007 Michael Hanselmann
282 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
283 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
284 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes),
285 6a050007 Michael Hanselmann
                     set([inst.primary_node, "node15.example.com"]))
286 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
287 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
288 6a050007 Michael Hanselmann
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
289 6a050007 Michael Hanselmann
      })
290 6a050007 Michael Hanselmann
291 6a050007 Michael Hanselmann
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
292 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
293 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
294 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
295 6a050007 Michael Hanselmann
296 6a050007 Michael Hanselmann
297 5f06ce5e Michael Hanselmann
class TestNode(unittest.TestCase):
298 5f06ce5e Michael Hanselmann
  def testEmpty(self):
299 5f06ce5e Michael Hanselmann
    self.assertEqual(objects.Node().ToDict(), {})
300 5f06ce5e Michael Hanselmann
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
301 5f06ce5e Michael Hanselmann
302 5f06ce5e Michael Hanselmann
  def testHvState(self):
303 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node18157.example.com", hv_state={
304 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
305 5f06ce5e Michael Hanselmann
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
306 5f06ce5e Michael Hanselmann
      })
307 5f06ce5e Michael Hanselmann
308 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
309 5f06ce5e Michael Hanselmann
310 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
311 5f06ce5e Michael Hanselmann
    del node
312 5f06ce5e Michael Hanselmann
313 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node18157.example.com")
314 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.hv_state), frozenset([
315 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM,
316 5f06ce5e Michael Hanselmann
      constants.HT_KVM,
317 5f06ce5e Michael Hanselmann
      ]))
318 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
319 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
320 5f06ce5e Michael Hanselmann
321 5f06ce5e Michael Hanselmann
  def testDiskState(self):
322 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node32087.example.com", disk_state={
323 5f06ce5e Michael Hanselmann
      constants.LD_LV: {
324 5f06ce5e Michael Hanselmann
        "lv32352": objects.NodeDiskState(total=128),
325 5f06ce5e Michael Hanselmann
        "lv2082": objects.NodeDiskState(total=512),
326 5f06ce5e Michael Hanselmann
        },
327 5f06ce5e Michael Hanselmann
      })
328 5f06ce5e Michael Hanselmann
329 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
330 5f06ce5e Michael Hanselmann
331 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
332 5f06ce5e Michael Hanselmann
    del node
333 5f06ce5e Michael Hanselmann
334 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node32087.example.com")
335 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state), frozenset([
336 5f06ce5e Michael Hanselmann
      constants.LD_LV,
337 5f06ce5e Michael Hanselmann
      ]))
338 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state[constants.LD_LV]), frozenset([
339 5f06ce5e Michael Hanselmann
      "lv32352",
340 5f06ce5e Michael Hanselmann
      "lv2082",
341 5f06ce5e Michael Hanselmann
      ]))
342 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv2082"].total, 512)
343 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv32352"].total, 128)
344 5f06ce5e Michael Hanselmann
345 5f06ce5e Michael Hanselmann
346 4c14965f Guido Trotter
if __name__ == '__main__':
347 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()