4 # Copyright (C) 2006, 2007, 2008, 2010 Google Inc.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
22 """Script for unittesting the objects module"""
27 from ganeti import constants
28 from ganeti import objects
29 from ganeti import errors
34 class SimpleObject(objects.ConfigObject):
35 __slots__ = ['a', 'b']
38 class TestDictState(unittest.TestCase):
39 """Simple dict tansformation tests"""
41 def testSimpleObjectToDict(self):
42 o1 = SimpleObject(a='1')
43 self.assertEquals(o1.ToDict(), {'a': '1'})
44 self.assertEquals(o1.__getstate__(), {'a': '1'})
45 self.assertEquals(o1.__getstate__(), o1.ToDict())
48 self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5})
49 o2 = SimpleObject.FromDict(o1.ToDict())
50 self.assertEquals(o1.ToDict(), {'a': 2, 'b': 5})
53 class TestClusterObject(unittest.TestCase):
54 """Tests done on a L{objects.Cluster}"""
72 constants.HT_XEN_PVM: {
73 "root_path": "/dev/sda5",
81 constants.ND_OOB_PROGRAM: "/bin/cluster-oob"
84 self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
86 self.fake_cl.UpgradeConfig()
88 def testGetHVDefaults(self):
90 self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
91 cl.hvparams[constants.HT_FAKE])
92 self.failUnlessEqual(cl.GetHVDefaults(None), {})
93 self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
94 os_name="lenny-image"),
95 cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
98 def testFillHvFullMerge(self):
110 fake_inst = objects.Instance(name="foobar",
112 hypervisor=constants.HT_FAKE,
113 hvparams=inst_hvparams)
114 self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
116 def testFillHvGlobalParams(self):
117 fake_inst = objects.Instance(name="foobar",
119 hypervisor=constants.HT_FAKE,
121 self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
122 self.fake_cl.FillHV(fake_inst))
124 def testFillHvInstParams(self):
128 fake_inst = objects.Instance(name="foobar",
130 hypervisor=constants.HT_XEN_PVM,
131 hvparams=inst_hvparams)
132 self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
134 def testFillHvEmptyParams(self):
135 fake_inst = objects.Instance(name="foobar",
137 hypervisor=constants.HT_XEN_PVM,
139 self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
141 def testFillHvPartialParams(self):
143 fake_inst = objects.Instance(name="foobar",
145 hypervisor=constants.HT_XEN_PVM,
147 self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
148 self.fake_cl.FillHV(fake_inst))
150 def testFillNdParamsCluster(self):
151 fake_node = objects.Node(name="test",
154 fake_group = objects.NodeGroup(name="testgroup",
156 self.assertEqual(self.fake_cl.ndparams,
157 self.fake_cl.FillND(fake_node, fake_group))
159 def testFillNdParamsNodeGroup(self):
160 fake_node = objects.Node(name="test",
164 constants.ND_OOB_PROGRAM: "/bin/group-oob"
166 fake_group = objects.NodeGroup(name="testgroup",
167 ndparams=group_ndparams)
168 self.assertEqual(group_ndparams,
169 self.fake_cl.FillND(fake_node, fake_group))
171 def testFillNdParamsNode(self):
173 constants.ND_OOB_PROGRAM: "/bin/node-oob"
175 fake_node = objects.Node(name="test",
176 ndparams=node_ndparams,
178 fake_group = objects.NodeGroup(name="testgroup",
180 self.assertEqual(node_ndparams,
181 self.fake_cl.FillND(fake_node, fake_group))
183 def testFillNdParamsAll(self):
185 constants.ND_OOB_PROGRAM: "/bin/node-oob"
187 fake_node = objects.Node(name="test",
188 ndparams=node_ndparams,
191 constants.ND_OOB_PROGRAM: "/bin/group-oob"
193 fake_group = objects.NodeGroup(name="testgroup",
194 ndparams=group_ndparams)
195 self.assertEqual(node_ndparams,
196 self.fake_cl.FillND(fake_node, fake_group))
198 def testPrimaryHypervisor(self):
199 assert self.fake_cl.enabled_hypervisors is None
200 self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
201 self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
203 self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
204 self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
206 self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
207 self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
210 class TestOS(unittest.TestCase):
213 "debootstrap+default",
214 "debootstrap++default",
217 def testSplitNameVariant(self):
218 for name in self.ALL_DATA:
219 self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
221 def testVariant(self):
222 self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
223 self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
226 class TestInstance(unittest.TestCase):
227 def _GenericCheck(self, inst):
228 for i in [inst.all_nodes, inst.secondary_nodes]:
229 self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
230 msg="Data type doesn't guarantee order")
232 self.assertTrue(inst.primary_node not in inst.secondary_nodes)
233 self.assertEqual(inst.all_nodes[0], inst.primary_node,
234 msg="Primary node not first node in list")
236 def testNodesNoDisks(self):
237 inst = objects.Instance(name="fakeinst.example.com",
238 primary_node="pnode.example.com",
242 self._GenericCheck(inst)
243 self.assertEqual(len(inst.secondary_nodes), 0)
244 self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
245 self.assertEqual(inst.MapLVsByNode(), {
246 inst.primary_node: [],
249 def testNodesPlainDisks(self):
250 inst = objects.Instance(name="fakeinstplain.example.com",
251 primary_node="node3.example.com",
253 objects.Disk(dev_type=constants.LD_LV, size=128,
254 logical_id=("myxenvg", "disk25494")),
255 objects.Disk(dev_type=constants.LD_LV, size=512,
256 logical_id=("myxenvg", "disk29071")),
259 self._GenericCheck(inst)
260 self.assertEqual(len(inst.secondary_nodes), 0)
261 self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
262 self.assertEqual(inst.MapLVsByNode(), {
263 inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
266 def testNodesDrbdDisks(self):
267 inst = objects.Instance(name="fakeinstdrbd.example.com",
268 primary_node="node10.example.com",
270 objects.Disk(dev_type=constants.LD_DRBD8, size=786432,
271 logical_id=("node10.example.com", "node15.example.com",
272 12300, 0, 0, "secret"),
274 objects.Disk(dev_type=constants.LD_LV, size=786432,
275 logical_id=("myxenvg", "disk0")),
276 objects.Disk(dev_type=constants.LD_LV, size=128,
277 logical_id=("myxenvg", "meta0"))
282 self._GenericCheck(inst)
283 self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
284 self.assertEqual(set(inst.all_nodes),
285 set([inst.primary_node, "node15.example.com"]))
286 self.assertEqual(inst.MapLVsByNode(), {
287 inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
288 "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
291 self.assertEqual(inst.FindDisk(0), inst.disks[0])
292 self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
293 self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
294 self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
297 class TestNode(unittest.TestCase):
299 self.assertEqual(objects.Node().ToDict(), {})
300 self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
302 def testHvState(self):
303 node = objects.Node(name="node18157.example.com", hv_state={
304 constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
305 constants.HT_KVM: objects.NodeHvState(cpu_node=1),
308 node2 = objects.Node.FromDict(node.ToDict())
310 # Make sure nothing can reference it anymore
313 self.assertEqual(node2.name, "node18157.example.com")
314 self.assertEqual(frozenset(node2.hv_state), frozenset([
315 constants.HT_XEN_HVM,
318 self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
319 self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
321 def testDiskState(self):
322 node = objects.Node(name="node32087.example.com", disk_state={
324 "lv32352": objects.NodeDiskState(total=128),
325 "lv2082": objects.NodeDiskState(total=512),
329 node2 = objects.Node.FromDict(node.ToDict())
331 # Make sure nothing can reference it anymore
334 self.assertEqual(node2.name, "node32087.example.com")
335 self.assertEqual(frozenset(node2.disk_state), frozenset([
338 self.assertEqual(frozenset(node2.disk_state[constants.LD_LV]), frozenset([
342 self.assertEqual(node2.disk_state[constants.LD_LV]["lv2082"].total, 512)
343 self.assertEqual(node2.disk_state[constants.LD_LV]["lv32352"].total, 128)
346 if __name__ == '__main__':
347 testutils.GanetiTestProgram()