Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.objects_unittest.py @ 595149d5

History | View | Annotate | Download (13 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2006, 2007, 2008, 2010, 2012 Google Inc.
5
#
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.
10
#
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.
15
#
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
19
# 02110-1301, USA.
20

    
21

    
22
"""Script for unittesting the objects module"""
23

    
24

    
25
import unittest
26

    
27
from ganeti import constants
28
from ganeti import objects
29
from ganeti import errors
30

    
31
import testutils
32

    
33

    
34
class SimpleObject(objects.ConfigObject):
35
  __slots__ = ["a", "b"]
36

    
37

    
38
class TestDictState(unittest.TestCase):
39
  """Simple dict tansformation tests"""
40

    
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())
46
    o1.a = 2
47
    o1.b = 5
48
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
49
    o2 = SimpleObject.FromDict(o1.ToDict())
50
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
51

    
52

    
53
class TestClusterObject(unittest.TestCase):
54
  """Tests done on a L{objects.Cluster}"""
55

    
56
  def setUp(self):
57
    hvparams = {
58
      constants.HT_FAKE: {
59
        "foo": "bar",
60
        "bar": "foo",
61
        "foobar": "barfoo",
62
        },
63
      }
64
    os_hvp = {
65
      "lenny-image": {
66
        constants.HT_FAKE: {
67
          "foo": "baz",
68
          "foobar": "foobar",
69
          "blah": "blibb",
70
          "blubb": "blah",
71
          },
72
        constants.HT_XEN_PVM: {
73
          "root_path": "/dev/sda5",
74
          "foo": "foobar",
75
          },
76
        },
77
      "ubuntu-hardy": {
78
        },
79
      }
80
    ndparams = {
81
        constants.ND_OOB_PROGRAM: "/bin/cluster-oob",
82
        constants.ND_SPINDLE_COUNT: 1,
83
        constants.ND_EXCLUSIVE_STORAGE: False,
84
        }
85

    
86
    self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
87
                                   ndparams=ndparams)
88
    self.fake_cl.UpgradeConfig()
89

    
90
  def testGetHVDefaults(self):
91
    cl = self.fake_cl
92
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
93
                         cl.hvparams[constants.HT_FAKE])
94
    self.failUnlessEqual(cl.GetHVDefaults(None), {})
95
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
96
                                          os_name="lenny-image"),
97
                         cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
98

    
99

    
100
  def testFillHvFullMerge(self):
101
    inst_hvparams = {
102
      "blah": "blubb",
103
      }
104

    
105
    fake_dict = {
106
      "foo": "baz",
107
      "bar": "foo",
108
      "foobar": "foobar",
109
      "blah": "blubb",
110
      "blubb": "blah",
111
      }
112
    fake_inst = objects.Instance(name="foobar",
113
                                 os="lenny-image",
114
                                 hypervisor=constants.HT_FAKE,
115
                                 hvparams=inst_hvparams)
116
    self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
117

    
118
  def testFillHvGlobalParams(self):
119
    fake_inst = objects.Instance(name="foobar",
120
                                 os="ubuntu-hardy",
121
                                 hypervisor=constants.HT_FAKE,
122
                                 hvparams={})
123
    self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
124
                     self.fake_cl.FillHV(fake_inst))
125

    
126
  def testFillHvInstParams(self):
127
    inst_hvparams = {
128
      "blah": "blubb",
129
      }
130
    fake_inst = objects.Instance(name="foobar",
131
                                 os="ubuntu-hardy",
132
                                 hypervisor=constants.HT_XEN_PVM,
133
                                 hvparams=inst_hvparams)
134
    self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
135

    
136
  def testFillHvEmptyParams(self):
137
    fake_inst = objects.Instance(name="foobar",
138
                                 os="ubuntu-hardy",
139
                                 hypervisor=constants.HT_XEN_PVM,
140
                                 hvparams={})
141
    self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
142

    
143
  def testFillHvPartialParams(self):
144
    os = "lenny-image"
145
    fake_inst = objects.Instance(name="foobar",
146
                                 os=os,
147
                                 hypervisor=constants.HT_XEN_PVM,
148
                                 hvparams={})
149
    self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
150
                     self.fake_cl.FillHV(fake_inst))
151

    
152
  def testFillNdParamsCluster(self):
153
    fake_node = objects.Node(name="test",
154
                             ndparams={},
155
                             group="testgroup")
156
    fake_group = objects.NodeGroup(name="testgroup",
157
                                   ndparams={})
158
    self.assertEqual(self.fake_cl.ndparams,
159
                     self.fake_cl.FillND(fake_node, fake_group))
160

    
161
  def testFillNdParamsNodeGroup(self):
162
    fake_node = objects.Node(name="test",
163
                             ndparams={},
164
                             group="testgroup")
165
    group_ndparams = {
166
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
167
        constants.ND_SPINDLE_COUNT: 10,
168
        constants.ND_EXCLUSIVE_STORAGE: True,
169
        }
170
    fake_group = objects.NodeGroup(name="testgroup",
171
                                   ndparams=group_ndparams)
172
    self.assertEqual(group_ndparams,
173
                     self.fake_cl.FillND(fake_node, fake_group))
174

    
175
  def testFillNdParamsNode(self):
176
    node_ndparams = {
177
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
178
        constants.ND_SPINDLE_COUNT: 2,
179
        constants.ND_EXCLUSIVE_STORAGE: True,
180
        }
181
    fake_node = objects.Node(name="test",
182
                             ndparams=node_ndparams,
183
                             group="testgroup")
184
    fake_group = objects.NodeGroup(name="testgroup",
185
                                   ndparams={})
186
    self.assertEqual(node_ndparams,
187
                     self.fake_cl.FillND(fake_node, fake_group))
188

    
189
  def testFillNdParamsAll(self):
190
    node_ndparams = {
191
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
192
        constants.ND_SPINDLE_COUNT: 5,
193
        constants.ND_EXCLUSIVE_STORAGE: True,
194
        }
195
    fake_node = objects.Node(name="test",
196
                             ndparams=node_ndparams,
197
                             group="testgroup")
198
    group_ndparams = {
199
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
200
        constants.ND_SPINDLE_COUNT: 4,
201
        }
202
    fake_group = objects.NodeGroup(name="testgroup",
203
                                   ndparams=group_ndparams)
204
    self.assertEqual(node_ndparams,
205
                     self.fake_cl.FillND(fake_node, fake_group))
206

    
207
  def testPrimaryHypervisor(self):
208
    assert self.fake_cl.enabled_hypervisors is None
209
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
210
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
211

    
212
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
213
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
214

    
215
    self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
216
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
217

    
218

    
219
class TestClusterObjectTcpUdpPortPool(unittest.TestCase):
220
  def testNewCluster(self):
221
    self.assertTrue(objects.Cluster().tcpudp_port_pool is None)
222

    
223
  def testSerializingEmpty(self):
224
    self.assertEqual(objects.Cluster().ToDict(), {
225
      "tcpudp_port_pool": [],
226
      })
227

    
228
  def testSerializing(self):
229
    cluster = objects.Cluster.FromDict({})
230
    self.assertEqual(cluster.tcpudp_port_pool, set())
231

    
232
    cluster.tcpudp_port_pool.add(3546)
233
    cluster.tcpudp_port_pool.add(62511)
234

    
235
    data = cluster.ToDict()
236
    self.assertEqual(data.keys(), ["tcpudp_port_pool"])
237
    self.assertEqual(sorted(data["tcpudp_port_pool"]), sorted([3546, 62511]))
238

    
239
  def testDeserializingEmpty(self):
240
    cluster = objects.Cluster.FromDict({})
241
    self.assertEqual(cluster.tcpudp_port_pool, set())
242

    
243
  def testDeserialize(self):
244
    cluster = objects.Cluster.FromDict({
245
      "tcpudp_port_pool": [26214, 10039, 267],
246
      })
247
    self.assertEqual(cluster.tcpudp_port_pool, set([26214, 10039, 267]))
248

    
249

    
250
class TestOS(unittest.TestCase):
251
  ALL_DATA = [
252
    "debootstrap",
253
    "debootstrap+default",
254
    "debootstrap++default",
255
    ]
256

    
257
  def testSplitNameVariant(self):
258
    for name in self.ALL_DATA:
259
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
260

    
261
  def testVariant(self):
262
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
263
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
264

    
265

    
266
class TestInstance(unittest.TestCase):
267
  def _GenericCheck(self, inst):
268
    for i in [inst.all_nodes, inst.secondary_nodes]:
269
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
270
                      msg="Data type doesn't guarantee order")
271

    
272
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
273
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
274
                     msg="Primary node not first node in list")
275

    
276
  def testNodesNoDisks(self):
277
    inst = objects.Instance(name="fakeinst.example.com",
278
      primary_node="pnode.example.com",
279
      disks=[
280
        ])
281

    
282
    self._GenericCheck(inst)
283
    self.assertEqual(len(inst.secondary_nodes), 0)
284
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
285
    self.assertEqual(inst.MapLVsByNode(), {
286
      inst.primary_node: [],
287
      })
288

    
289
  def testNodesPlainDisks(self):
290
    inst = objects.Instance(name="fakeinstplain.example.com",
291
      primary_node="node3.example.com",
292
      disks=[
293
        objects.Disk(dev_type=constants.LD_LV, size=128,
294
                     logical_id=("myxenvg", "disk25494")),
295
        objects.Disk(dev_type=constants.LD_LV, size=512,
296
                     logical_id=("myxenvg", "disk29071")),
297
        ])
298

    
299
    self._GenericCheck(inst)
300
    self.assertEqual(len(inst.secondary_nodes), 0)
301
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
302
    self.assertEqual(inst.MapLVsByNode(), {
303
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
304
      })
305

    
306
  def testNodesDrbdDisks(self):
307
    inst = objects.Instance(name="fakeinstdrbd.example.com",
308
      primary_node="node10.example.com",
309
      disks=[
310
        objects.Disk(dev_type=constants.LD_DRBD8, size=786432,
311
          logical_id=("node10.example.com", "node15.example.com",
312
                      12300, 0, 0, "secret"),
313
          children=[
314
            objects.Disk(dev_type=constants.LD_LV, size=786432,
315
                         logical_id=("myxenvg", "disk0")),
316
            objects.Disk(dev_type=constants.LD_LV, size=128,
317
                         logical_id=("myxenvg", "meta0"))
318
          ],
319
          iv_name="disk/0")
320
        ])
321

    
322
    self._GenericCheck(inst)
323
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
324
    self.assertEqual(set(inst.all_nodes),
325
                     set([inst.primary_node, "node15.example.com"]))
326
    self.assertEqual(inst.MapLVsByNode(), {
327
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
328
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
329
      })
330

    
331
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
332
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
333
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
334
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
335

    
336

    
337
class TestNode(unittest.TestCase):
338
  def testEmpty(self):
339
    self.assertEqual(objects.Node().ToDict(), {})
340
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
341

    
342
  def testHvState(self):
343
    node = objects.Node(name="node18157.example.com", hv_state={
344
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
345
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
346
      })
347

    
348
    node2 = objects.Node.FromDict(node.ToDict())
349

    
350
    # Make sure nothing can reference it anymore
351
    del node
352

    
353
    self.assertEqual(node2.name, "node18157.example.com")
354
    self.assertEqual(frozenset(node2.hv_state), frozenset([
355
      constants.HT_XEN_HVM,
356
      constants.HT_KVM,
357
      ]))
358
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
359
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
360

    
361
  def testDiskState(self):
362
    node = objects.Node(name="node32087.example.com", disk_state={
363
      constants.LD_LV: {
364
        "lv32352": objects.NodeDiskState(total=128),
365
        "lv2082": objects.NodeDiskState(total=512),
366
        },
367
      })
368

    
369
    node2 = objects.Node.FromDict(node.ToDict())
370

    
371
    # Make sure nothing can reference it anymore
372
    del node
373

    
374
    self.assertEqual(node2.name, "node32087.example.com")
375
    self.assertEqual(frozenset(node2.disk_state), frozenset([
376
      constants.LD_LV,
377
      ]))
378
    self.assertEqual(frozenset(node2.disk_state[constants.LD_LV]), frozenset([
379
      "lv32352",
380
      "lv2082",
381
      ]))
382
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv2082"].total, 512)
383
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv32352"].total, 128)
384

    
385

    
386
if __name__ == "__main__":
387
  testutils.GanetiTestProgram()