Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.objects_unittest.py @ a2112db5

History | View | Annotate | Download (26.7 kB)

1 4c14965f Guido Trotter
#!/usr/bin/python
2 4c14965f Guido Trotter
#
3 4c14965f Guido Trotter
4 da5f09ef Bernardo Dal Seno
# Copyright (C) 2006, 2007, 2008, 2010, 2012, 2013 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 41044e04 Bernardo Dal Seno
import copy
26 4c14965f Guido Trotter
import unittest
27 4c14965f Guido Trotter
28 7b64b9ea René Nussbaumer
from ganeti import constants
29 4c14965f Guido Trotter
from ganeti import objects
30 6a050007 Michael Hanselmann
from ganeti import errors
31 4c14965f Guido Trotter
32 25231ec5 Michael Hanselmann
import testutils
33 25231ec5 Michael Hanselmann
34 25231ec5 Michael Hanselmann
35 4c14965f Guido Trotter
class SimpleObject(objects.ConfigObject):
36 8c114acd Michael Hanselmann
  __slots__ = ["a", "b"]
37 4c14965f Guido Trotter
38 25231ec5 Michael Hanselmann
39 4c14965f Guido Trotter
class TestDictState(unittest.TestCase):
40 4c14965f Guido Trotter
  """Simple dict tansformation tests"""
41 4c14965f Guido Trotter
42 4c14965f Guido Trotter
  def testSimpleObjectToDict(self):
43 8c114acd Michael Hanselmann
    o1 = SimpleObject(a="1")
44 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": "1"})
45 8c114acd Michael Hanselmann
    self.assertEquals(o1.__getstate__(), {"a": "1"})
46 4c14965f Guido Trotter
    self.assertEquals(o1.__getstate__(), o1.ToDict())
47 4c14965f Guido Trotter
    o1.a = 2
48 4c14965f Guido Trotter
    o1.b = 5
49 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
50 4c14965f Guido Trotter
    o2 = SimpleObject.FromDict(o1.ToDict())
51 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
52 4c14965f Guido Trotter
53 4c14965f Guido Trotter
54 7b64b9ea René Nussbaumer
class TestClusterObject(unittest.TestCase):
55 7b64b9ea René Nussbaumer
  """Tests done on a L{objects.Cluster}"""
56 7b64b9ea René Nussbaumer
57 7b64b9ea René Nussbaumer
  def setUp(self):
58 7b64b9ea René Nussbaumer
    hvparams = {
59 7b64b9ea René Nussbaumer
      constants.HT_FAKE: {
60 7b64b9ea René Nussbaumer
        "foo": "bar",
61 7b64b9ea René Nussbaumer
        "bar": "foo",
62 7b64b9ea René Nussbaumer
        "foobar": "barfoo",
63 7b64b9ea René Nussbaumer
        },
64 7b64b9ea René Nussbaumer
      }
65 7b64b9ea René Nussbaumer
    os_hvp = {
66 7b64b9ea René Nussbaumer
      "lenny-image": {
67 7b64b9ea René Nussbaumer
        constants.HT_FAKE: {
68 7b64b9ea René Nussbaumer
          "foo": "baz",
69 7b64b9ea René Nussbaumer
          "foobar": "foobar",
70 7b64b9ea René Nussbaumer
          "blah": "blibb",
71 7b64b9ea René Nussbaumer
          "blubb": "blah",
72 7b64b9ea René Nussbaumer
          },
73 7b64b9ea René Nussbaumer
        constants.HT_XEN_PVM: {
74 7b64b9ea René Nussbaumer
          "root_path": "/dev/sda5",
75 7b64b9ea René Nussbaumer
          "foo": "foobar",
76 7b64b9ea René Nussbaumer
          },
77 7b64b9ea René Nussbaumer
        },
78 7b64b9ea René Nussbaumer
      "ubuntu-hardy": {
79 7b64b9ea René Nussbaumer
        },
80 7b64b9ea René Nussbaumer
      }
81 095e71aa René Nussbaumer
    ndparams = {
82 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/cluster-oob",
83 0ea11dcb Bernardo Dal Seno
        constants.ND_SPINDLE_COUNT: 1,
84 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: False,
85 095e71aa René Nussbaumer
        }
86 095e71aa René Nussbaumer
87 095e71aa René Nussbaumer
    self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
88 095e71aa René Nussbaumer
                                   ndparams=ndparams)
89 7b64b9ea René Nussbaumer
    self.fake_cl.UpgradeConfig()
90 7b64b9ea René Nussbaumer
91 d63479b5 Iustin Pop
  def testGetHVDefaults(self):
92 d63479b5 Iustin Pop
    cl = self.fake_cl
93 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
94 d63479b5 Iustin Pop
                         cl.hvparams[constants.HT_FAKE])
95 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(None), {})
96 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
97 d63479b5 Iustin Pop
                                          os_name="lenny-image"),
98 d63479b5 Iustin Pop
                         cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
99 d63479b5 Iustin Pop
100 7b64b9ea René Nussbaumer
  def testFillHvFullMerge(self):
101 7b64b9ea René Nussbaumer
    inst_hvparams = {
102 7b64b9ea René Nussbaumer
      "blah": "blubb",
103 7b64b9ea René Nussbaumer
      }
104 7b64b9ea René Nussbaumer
105 1f3096c2 Thomas Thrainer
    fake_dict = constants.HVC_DEFAULTS[constants.HT_FAKE].copy()
106 1f3096c2 Thomas Thrainer
    fake_dict.update({
107 7b64b9ea René Nussbaumer
      "foo": "baz",
108 7b64b9ea René Nussbaumer
      "bar": "foo",
109 7b64b9ea René Nussbaumer
      "foobar": "foobar",
110 7b64b9ea René Nussbaumer
      "blah": "blubb",
111 7b64b9ea René Nussbaumer
      "blubb": "blah",
112 1f3096c2 Thomas Thrainer
      })
113 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
114 7b64b9ea René Nussbaumer
                                 os="lenny-image",
115 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
116 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
117 7b64b9ea René Nussbaumer
    self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
118 7b64b9ea René Nussbaumer
119 7b64b9ea René Nussbaumer
  def testFillHvGlobalParams(self):
120 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
121 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
122 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
123 7b64b9ea René Nussbaumer
                                 hvparams={})
124 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
125 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
126 7b64b9ea René Nussbaumer
127 7b64b9ea René Nussbaumer
  def testFillHvInstParams(self):
128 7b64b9ea René Nussbaumer
    inst_hvparams = {
129 7b64b9ea René Nussbaumer
      "blah": "blubb",
130 7b64b9ea René Nussbaumer
      }
131 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
132 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
133 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
134 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
135 7b64b9ea René Nussbaumer
    self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
136 7b64b9ea René Nussbaumer
137 7b64b9ea René Nussbaumer
  def testFillHvEmptyParams(self):
138 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
139 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
140 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
141 7b64b9ea René Nussbaumer
                                 hvparams={})
142 7b64b9ea René Nussbaumer
    self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
143 7b64b9ea René Nussbaumer
144 7b64b9ea René Nussbaumer
  def testFillHvPartialParams(self):
145 7b64b9ea René Nussbaumer
    os = "lenny-image"
146 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
147 7b64b9ea René Nussbaumer
                                 os=os,
148 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
149 7b64b9ea René Nussbaumer
                                 hvparams={})
150 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
151 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
152 7b64b9ea René Nussbaumer
153 095e71aa René Nussbaumer
  def testFillNdParamsCluster(self):
154 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
155 095e71aa René Nussbaumer
                             ndparams={},
156 095e71aa René Nussbaumer
                             group="testgroup")
157 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
158 095e71aa René Nussbaumer
                                   ndparams={})
159 095e71aa René Nussbaumer
    self.assertEqual(self.fake_cl.ndparams,
160 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
161 095e71aa René Nussbaumer
162 095e71aa René Nussbaumer
  def testFillNdParamsNodeGroup(self):
163 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
164 095e71aa René Nussbaumer
                             ndparams={},
165 095e71aa René Nussbaumer
                             group="testgroup")
166 095e71aa René Nussbaumer
    group_ndparams = {
167 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
168 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 10,
169 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
170 095e71aa René Nussbaumer
        }
171 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
172 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
173 095e71aa René Nussbaumer
    self.assertEqual(group_ndparams,
174 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
175 095e71aa René Nussbaumer
176 095e71aa René Nussbaumer
  def testFillNdParamsNode(self):
177 095e71aa René Nussbaumer
    node_ndparams = {
178 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
179 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 2,
180 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
181 095e71aa René Nussbaumer
        }
182 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
183 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
184 095e71aa René Nussbaumer
                             group="testgroup")
185 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
186 095e71aa René Nussbaumer
                                   ndparams={})
187 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
188 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
189 095e71aa René Nussbaumer
190 095e71aa René Nussbaumer
  def testFillNdParamsAll(self):
191 095e71aa René Nussbaumer
    node_ndparams = {
192 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
193 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 5,
194 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
195 095e71aa René Nussbaumer
        }
196 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
197 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
198 095e71aa René Nussbaumer
                             group="testgroup")
199 095e71aa René Nussbaumer
    group_ndparams = {
200 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
201 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 4,
202 095e71aa René Nussbaumer
        }
203 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
204 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
205 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
206 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
207 095e71aa René Nussbaumer
208 0fbedb7a Michael Hanselmann
  def testPrimaryHypervisor(self):
209 0fbedb7a Michael Hanselmann
    assert self.fake_cl.enabled_hypervisors is None
210 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
211 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
212 0fbedb7a Michael Hanselmann
213 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
214 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
215 0fbedb7a Michael Hanselmann
216 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
217 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
218 0fbedb7a Michael Hanselmann
219 4f7e5a1d Bernardo Dal Seno
  def testUpgradeConfig(self):
220 4f7e5a1d Bernardo Dal Seno
    # FIXME: This test is incomplete
221 4f7e5a1d Bernardo Dal Seno
    cluster = objects.Cluster()
222 4f7e5a1d Bernardo Dal Seno
    cluster.UpgradeConfig()
223 4f7e5a1d Bernardo Dal Seno
    cluster = objects.Cluster(ipolicy={"unknown_key": None})
224 4f7e5a1d Bernardo Dal Seno
    self.assertRaises(errors.ConfigurationError, cluster.UpgradeConfig)
225 4f7e5a1d Bernardo Dal Seno
226 a2112db5 Helga Velroyen
  def testUpgradeEnabledDiskTemplates(self):
227 a2112db5 Helga Velroyen
    cfg = objects.ConfigData()
228 a2112db5 Helga Velroyen
    cfg.cluster = objects.Cluster()
229 a2112db5 Helga Velroyen
    cfg.cluster.volume_group_name = "myvg"
230 a2112db5 Helga Velroyen
    instance1 = objects.Instance()
231 a2112db5 Helga Velroyen
    instance1.disk_template = constants.DT_DISKLESS
232 a2112db5 Helga Velroyen
    instance2 = objects.Instance()
233 a2112db5 Helga Velroyen
    instance2.disk_template = constants.DT_RBD
234 a2112db5 Helga Velroyen
    cfg.instances = { "myinstance1": instance1, "myinstance2": instance2 }
235 a2112db5 Helga Velroyen
    nodegroup = objects.NodeGroup()
236 a2112db5 Helga Velroyen
    nodegroup.ipolicy = {}
237 a2112db5 Helga Velroyen
    nodegroup.ipolicy[constants.IPOLICY_DTS] = [instance1.disk_template, \
238 a2112db5 Helga Velroyen
      constants.DT_BLOCK]
239 a2112db5 Helga Velroyen
    cfg.cluster.ipolicy = {}
240 a2112db5 Helga Velroyen
    cfg.cluster.ipolicy[constants.IPOLICY_DTS] = \
241 a2112db5 Helga Velroyen
      [constants.DT_EXT, constants.DT_DISKLESS]
242 a2112db5 Helga Velroyen
    cfg.nodegroups = { "mynodegroup": nodegroup }
243 a2112db5 Helga Velroyen
    cfg._UpgradeEnabledDiskTemplates()
244 a2112db5 Helga Velroyen
    expected_disk_templates = [constants.DT_DRBD8,
245 a2112db5 Helga Velroyen
                               constants.DT_PLAIN,
246 a2112db5 Helga Velroyen
                               instance1.disk_template,
247 a2112db5 Helga Velroyen
                               instance2.disk_template]
248 a2112db5 Helga Velroyen
    self.assertEqual(set(expected_disk_templates),
249 a2112db5 Helga Velroyen
                     set(cfg.cluster.enabled_disk_templates))
250 a2112db5 Helga Velroyen
    self.assertEqual(set([instance1.disk_template]),
251 a2112db5 Helga Velroyen
                     set(cfg.cluster.ipolicy[constants.IPOLICY_DTS]))
252 a2112db5 Helga Velroyen
253 7b64b9ea René Nussbaumer
254 4d36fbf4 Michael Hanselmann
class TestClusterObjectTcpUdpPortPool(unittest.TestCase):
255 4d36fbf4 Michael Hanselmann
  def testNewCluster(self):
256 4d36fbf4 Michael Hanselmann
    self.assertTrue(objects.Cluster().tcpudp_port_pool is None)
257 4d36fbf4 Michael Hanselmann
258 4d36fbf4 Michael Hanselmann
  def testSerializingEmpty(self):
259 4d36fbf4 Michael Hanselmann
    self.assertEqual(objects.Cluster().ToDict(), {
260 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [],
261 4d36fbf4 Michael Hanselmann
      })
262 4d36fbf4 Michael Hanselmann
263 4d36fbf4 Michael Hanselmann
  def testSerializing(self):
264 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
265 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
266 4d36fbf4 Michael Hanselmann
267 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(3546)
268 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(62511)
269 4d36fbf4 Michael Hanselmann
270 4d36fbf4 Michael Hanselmann
    data = cluster.ToDict()
271 4d36fbf4 Michael Hanselmann
    self.assertEqual(data.keys(), ["tcpudp_port_pool"])
272 4d36fbf4 Michael Hanselmann
    self.assertEqual(sorted(data["tcpudp_port_pool"]), sorted([3546, 62511]))
273 4d36fbf4 Michael Hanselmann
274 4d36fbf4 Michael Hanselmann
  def testDeserializingEmpty(self):
275 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
276 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
277 4d36fbf4 Michael Hanselmann
278 4d36fbf4 Michael Hanselmann
  def testDeserialize(self):
279 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({
280 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [26214, 10039, 267],
281 4d36fbf4 Michael Hanselmann
      })
282 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set([26214, 10039, 267]))
283 4d36fbf4 Michael Hanselmann
284 4d36fbf4 Michael Hanselmann
285 870dc44c Iustin Pop
class TestOS(unittest.TestCase):
286 870dc44c Iustin Pop
  ALL_DATA = [
287 870dc44c Iustin Pop
    "debootstrap",
288 870dc44c Iustin Pop
    "debootstrap+default",
289 870dc44c Iustin Pop
    "debootstrap++default",
290 870dc44c Iustin Pop
    ]
291 870dc44c Iustin Pop
292 870dc44c Iustin Pop
  def testSplitNameVariant(self):
293 870dc44c Iustin Pop
    for name in self.ALL_DATA:
294 870dc44c Iustin Pop
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
295 870dc44c Iustin Pop
296 870dc44c Iustin Pop
  def testVariant(self):
297 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
298 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
299 870dc44c Iustin Pop
300 870dc44c Iustin Pop
301 6a050007 Michael Hanselmann
class TestInstance(unittest.TestCase):
302 6a050007 Michael Hanselmann
  def _GenericCheck(self, inst):
303 6a050007 Michael Hanselmann
    for i in [inst.all_nodes, inst.secondary_nodes]:
304 6a050007 Michael Hanselmann
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
305 6a050007 Michael Hanselmann
                      msg="Data type doesn't guarantee order")
306 6a050007 Michael Hanselmann
307 6a050007 Michael Hanselmann
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
308 6a050007 Michael Hanselmann
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
309 6a050007 Michael Hanselmann
                     msg="Primary node not first node in list")
310 6a050007 Michael Hanselmann
311 6a050007 Michael Hanselmann
  def testNodesNoDisks(self):
312 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinst.example.com",
313 6a050007 Michael Hanselmann
      primary_node="pnode.example.com",
314 6a050007 Michael Hanselmann
      disks=[
315 6a050007 Michael Hanselmann
        ])
316 6a050007 Michael Hanselmann
317 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
318 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
319 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
320 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
321 6a050007 Michael Hanselmann
      inst.primary_node: [],
322 6a050007 Michael Hanselmann
      })
323 6a050007 Michael Hanselmann
324 6a050007 Michael Hanselmann
  def testNodesPlainDisks(self):
325 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstplain.example.com",
326 6a050007 Michael Hanselmann
      primary_node="node3.example.com",
327 6a050007 Michael Hanselmann
      disks=[
328 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_PLAIN, size=128,
329 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk25494")),
330 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_PLAIN, size=512,
331 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk29071")),
332 6a050007 Michael Hanselmann
        ])
333 6a050007 Michael Hanselmann
334 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
335 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
336 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
337 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
338 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
339 6a050007 Michael Hanselmann
      })
340 6a050007 Michael Hanselmann
341 6a050007 Michael Hanselmann
  def testNodesDrbdDisks(self):
342 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstdrbd.example.com",
343 6a050007 Michael Hanselmann
      primary_node="node10.example.com",
344 6a050007 Michael Hanselmann
      disks=[
345 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_DRBD8, size=786432,
346 6a050007 Michael Hanselmann
          logical_id=("node10.example.com", "node15.example.com",
347 6a050007 Michael Hanselmann
                      12300, 0, 0, "secret"),
348 6a050007 Michael Hanselmann
          children=[
349 cd3b4ff4 Helga Velroyen
            objects.Disk(dev_type=constants.DT_PLAIN, size=786432,
350 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "disk0")),
351 cd3b4ff4 Helga Velroyen
            objects.Disk(dev_type=constants.DT_PLAIN, size=128,
352 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "meta0"))
353 6a050007 Michael Hanselmann
          ],
354 6a050007 Michael Hanselmann
          iv_name="disk/0")
355 6a050007 Michael Hanselmann
        ])
356 6a050007 Michael Hanselmann
357 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
358 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
359 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes),
360 6a050007 Michael Hanselmann
                     set([inst.primary_node, "node15.example.com"]))
361 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
362 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
363 6a050007 Michael Hanselmann
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
364 6a050007 Michael Hanselmann
      })
365 6a050007 Michael Hanselmann
366 6a050007 Michael Hanselmann
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
367 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
368 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
369 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
370 6a050007 Michael Hanselmann
371 6a050007 Michael Hanselmann
372 5f06ce5e Michael Hanselmann
class TestNode(unittest.TestCase):
373 5f06ce5e Michael Hanselmann
  def testEmpty(self):
374 5f06ce5e Michael Hanselmann
    self.assertEqual(objects.Node().ToDict(), {})
375 5f06ce5e Michael Hanselmann
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
376 5f06ce5e Michael Hanselmann
377 5f06ce5e Michael Hanselmann
  def testHvState(self):
378 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node18157.example.com", hv_state={
379 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
380 5f06ce5e Michael Hanselmann
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
381 5f06ce5e Michael Hanselmann
      })
382 5f06ce5e Michael Hanselmann
383 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
384 5f06ce5e Michael Hanselmann
385 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
386 5f06ce5e Michael Hanselmann
    del node
387 5f06ce5e Michael Hanselmann
388 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node18157.example.com")
389 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.hv_state), frozenset([
390 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM,
391 5f06ce5e Michael Hanselmann
      constants.HT_KVM,
392 5f06ce5e Michael Hanselmann
      ]))
393 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
394 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
395 5f06ce5e Michael Hanselmann
396 5f06ce5e Michael Hanselmann
  def testDiskState(self):
397 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node32087.example.com", disk_state={
398 cd3b4ff4 Helga Velroyen
      constants.DT_PLAIN: {
399 5f06ce5e Michael Hanselmann
        "lv32352": objects.NodeDiskState(total=128),
400 5f06ce5e Michael Hanselmann
        "lv2082": objects.NodeDiskState(total=512),
401 5f06ce5e Michael Hanselmann
        },
402 5f06ce5e Michael Hanselmann
      })
403 5f06ce5e Michael Hanselmann
404 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
405 5f06ce5e Michael Hanselmann
406 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
407 5f06ce5e Michael Hanselmann
    del node
408 5f06ce5e Michael Hanselmann
409 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node32087.example.com")
410 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state), frozenset([
411 cd3b4ff4 Helga Velroyen
      constants.DT_PLAIN,
412 5f06ce5e Michael Hanselmann
      ]))
413 cd3b4ff4 Helga Velroyen
    self.assertEqual(frozenset(node2.disk_state[constants.DT_PLAIN]),
414 cd3b4ff4 Helga Velroyen
                     frozenset(["lv32352", "lv2082"]))
415 cd3b4ff4 Helga Velroyen
    self.assertEqual(node2.disk_state[constants.DT_PLAIN]["lv2082"].total, 512)
416 cd3b4ff4 Helga Velroyen
    self.assertEqual(node2.disk_state[constants.DT_PLAIN]["lv32352"].total, 128)
417 5f06ce5e Michael Hanselmann
418 250a9404 Bernardo Dal Seno
  def testFilterEsNdp(self):
419 250a9404 Bernardo Dal Seno
    node1 = objects.Node(name="node11673.example.com", ndparams={
420 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: True,
421 250a9404 Bernardo Dal Seno
      })
422 250a9404 Bernardo Dal Seno
    node2 = objects.Node(name="node11674.example.com", ndparams={
423 250a9404 Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 3,
424 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: False,
425 250a9404 Bernardo Dal Seno
      })
426 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
427 250a9404 Bernardo Dal Seno
    node1.UpgradeConfig()
428 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
429 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
430 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
431 250a9404 Bernardo Dal Seno
    node2.UpgradeConfig()
432 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
433 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
434 250a9404 Bernardo Dal Seno
435 5f06ce5e Michael Hanselmann
436 e38bc4eb Bernardo Dal Seno
class TestInstancePolicy(unittest.TestCase):
437 e38bc4eb Bernardo Dal Seno
  def setUp(self):
438 e38bc4eb Bernardo Dal Seno
    # Policies are big, and we want to see the difference in case of an error
439 e38bc4eb Bernardo Dal Seno
    self.maxDiff = None
440 e38bc4eb Bernardo Dal Seno
441 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyIsFull(self, policy):
442 e38bc4eb Bernardo Dal Seno
    self.assertEqual(frozenset(policy.keys()), constants.IPOLICY_ALL_KEYS)
443 41044e04 Bernardo Dal Seno
    self.assertTrue(len(policy[constants.ISPECS_MINMAX]) > 0)
444 41044e04 Bernardo Dal Seno
    for minmax in policy[constants.ISPECS_MINMAX]:
445 41044e04 Bernardo Dal Seno
      self.assertEqual(frozenset(minmax.keys()), constants.ISPECS_MINMAX_KEYS)
446 41044e04 Bernardo Dal Seno
      for key in constants.ISPECS_MINMAX_KEYS:
447 41044e04 Bernardo Dal Seno
        self.assertEqual(frozenset(minmax[key].keys()),
448 41044e04 Bernardo Dal Seno
                         constants.ISPECS_PARAMETERS)
449 da5f09ef Bernardo Dal Seno
    self.assertEqual(frozenset(policy[constants.ISPECS_STD].keys()),
450 da5f09ef Bernardo Dal Seno
                     constants.ISPECS_PARAMETERS)
451 e38bc4eb Bernardo Dal Seno
452 e38bc4eb Bernardo Dal Seno
  def testDefaultIPolicy(self):
453 e38bc4eb Bernardo Dal Seno
    objects.InstancePolicy.CheckParameterSyntax(constants.IPOLICY_DEFAULTS,
454 e38bc4eb Bernardo Dal Seno
                                                True)
455 e38bc4eb Bernardo Dal Seno
    self._AssertIPolicyIsFull(constants.IPOLICY_DEFAULTS)
456 e38bc4eb Bernardo Dal Seno
457 41044e04 Bernardo Dal Seno
  def _AssertPolicyIsBad(self, ipolicy, do_check_std=None):
458 41044e04 Bernardo Dal Seno
    if do_check_std is None:
459 41044e04 Bernardo Dal Seno
      check_std_vals = [False, True]
460 41044e04 Bernardo Dal Seno
    else:
461 41044e04 Bernardo Dal Seno
      check_std_vals = [do_check_std]
462 41044e04 Bernardo Dal Seno
    for check_std in check_std_vals:
463 41044e04 Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
464 41044e04 Bernardo Dal Seno
                        objects.InstancePolicy.CheckISpecSyntax,
465 41044e04 Bernardo Dal Seno
                        ipolicy, check_std)
466 41044e04 Bernardo Dal Seno
467 ba5c6c6b Bernardo Dal Seno
  def testCheckISpecSyntax(self):
468 b342c9dd Bernardo Dal Seno
    default_stdspec = constants.IPOLICY_DEFAULTS[constants.ISPECS_STD]
469 62fed51b Bernardo Dal Seno
    incomplete_ipolicies = [
470 62fed51b Bernardo Dal Seno
      {
471 41044e04 Bernardo Dal Seno
         constants.ISPECS_MINMAX: [],
472 b342c9dd Bernardo Dal Seno
         constants.ISPECS_STD: default_stdspec,
473 62fed51b Bernardo Dal Seno
         },
474 62fed51b Bernardo Dal Seno
      {
475 41044e04 Bernardo Dal Seno
         constants.ISPECS_MINMAX: [{}],
476 41044e04 Bernardo Dal Seno
         constants.ISPECS_STD: default_stdspec,
477 41044e04 Bernardo Dal Seno
         },
478 41044e04 Bernardo Dal Seno
      {
479 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
480 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
481 41044e04 Bernardo Dal Seno
          }],
482 b342c9dd Bernardo Dal Seno
        constants.ISPECS_STD: default_stdspec,
483 62fed51b Bernardo Dal Seno
        },
484 62fed51b Bernardo Dal Seno
      {
485 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
486 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
487 41044e04 Bernardo Dal Seno
          }],
488 b342c9dd Bernardo Dal Seno
        constants.ISPECS_STD: default_stdspec,
489 62fed51b Bernardo Dal Seno
        },
490 62fed51b Bernardo Dal Seno
      {
491 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
492 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
493 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
494 41044e04 Bernardo Dal Seno
          }],
495 62fed51b Bernardo Dal Seno
        },
496 62fed51b Bernardo Dal Seno
      ]
497 62fed51b Bernardo Dal Seno
    for ipol in incomplete_ipolicies:
498 62fed51b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
499 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy.CheckISpecSyntax,
500 62fed51b Bernardo Dal Seno
                        ipol, True)
501 41044e04 Bernardo Dal Seno
      oldminmax = ipol[constants.ISPECS_MINMAX]
502 41044e04 Bernardo Dal Seno
      if oldminmax:
503 41044e04 Bernardo Dal Seno
        # Prepending valid specs shouldn't change the error
504 41044e04 Bernardo Dal Seno
        ipol[constants.ISPECS_MINMAX] = ([constants.ISPECS_MINMAX_DEFAULTS] +
505 41044e04 Bernardo Dal Seno
                                         oldminmax)
506 41044e04 Bernardo Dal Seno
        self.assertRaises(errors.ConfigurationError,
507 41044e04 Bernardo Dal Seno
                          objects.InstancePolicy.CheckISpecSyntax,
508 41044e04 Bernardo Dal Seno
                          ipol, True)
509 41044e04 Bernardo Dal Seno
510 41044e04 Bernardo Dal Seno
    good_ipolicy = {
511 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [
512 41044e04 Bernardo Dal Seno
        {
513 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: {
514 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 64,
515 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 1,
516 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 2,
517 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 64,
518 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 1,
519 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 1,
520 41044e04 Bernardo Dal Seno
            },
521 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: {
522 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 16384,
523 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 5,
524 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 12,
525 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024,
526 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 9,
527 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 18,
528 41044e04 Bernardo Dal Seno
            },
529 41044e04 Bernardo Dal Seno
          },
530 41044e04 Bernardo Dal Seno
        {
531 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: {
532 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 32768,
533 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 8,
534 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 1,
535 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024,
536 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 1,
537 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 1,
538 41044e04 Bernardo Dal Seno
            },
539 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: {
540 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 65536,
541 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 10,
542 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 5,
543 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024 * 1024,
544 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 3,
545 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 12,
546 41044e04 Bernardo Dal Seno
            },
547 41044e04 Bernardo Dal Seno
          },
548 41044e04 Bernardo Dal Seno
        ],
549 41044e04 Bernardo Dal Seno
      }
550 41044e04 Bernardo Dal Seno
    good_ipolicy[constants.ISPECS_STD] = copy.deepcopy(
551 41044e04 Bernardo Dal Seno
      good_ipolicy[constants.ISPECS_MINMAX][0][constants.ISPECS_MAX])
552 41044e04 Bernardo Dal Seno
    # Check that it's really good before making it bad
553 41044e04 Bernardo Dal Seno
    objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True)
554 41044e04 Bernardo Dal Seno
555 41044e04 Bernardo Dal Seno
    bad_ipolicy = copy.deepcopy(good_ipolicy)
556 41044e04 Bernardo Dal Seno
    for minmax in bad_ipolicy[constants.ISPECS_MINMAX]:
557 41044e04 Bernardo Dal Seno
      for (key, spec) in minmax.items():
558 41044e04 Bernardo Dal Seno
        for param in spec:
559 41044e04 Bernardo Dal Seno
          oldv = spec[param]
560 41044e04 Bernardo Dal Seno
          del spec[param]
561 41044e04 Bernardo Dal Seno
          self._AssertPolicyIsBad(bad_ipolicy)
562 41044e04 Bernardo Dal Seno
          if key == constants.ISPECS_MIN:
563 41044e04 Bernardo Dal Seno
            spec[param] = minmax[constants.ISPECS_MAX][param] + 1
564 41044e04 Bernardo Dal Seno
          self._AssertPolicyIsBad(bad_ipolicy)
565 41044e04 Bernardo Dal Seno
          spec[param] = oldv
566 41044e04 Bernardo Dal Seno
    assert bad_ipolicy == good_ipolicy
567 41044e04 Bernardo Dal Seno
568 41044e04 Bernardo Dal Seno
    stdspec = bad_ipolicy[constants.ISPECS_STD]
569 41044e04 Bernardo Dal Seno
    for param in stdspec:
570 41044e04 Bernardo Dal Seno
      oldv = stdspec[param]
571 41044e04 Bernardo Dal Seno
      del stdspec[param]
572 41044e04 Bernardo Dal Seno
      self._AssertPolicyIsBad(bad_ipolicy, True)
573 41044e04 Bernardo Dal Seno
      # Note that std spec is the same as a max spec
574 41044e04 Bernardo Dal Seno
      stdspec[param] = oldv + 1
575 41044e04 Bernardo Dal Seno
      self._AssertPolicyIsBad(bad_ipolicy, True)
576 41044e04 Bernardo Dal Seno
      stdspec[param] = oldv
577 41044e04 Bernardo Dal Seno
    assert bad_ipolicy == good_ipolicy
578 41044e04 Bernardo Dal Seno
579 41044e04 Bernardo Dal Seno
    for minmax in good_ipolicy[constants.ISPECS_MINMAX]:
580 41044e04 Bernardo Dal Seno
      for spec in minmax.values():
581 41044e04 Bernardo Dal Seno
        good_ipolicy[constants.ISPECS_STD] = spec
582 41044e04 Bernardo Dal Seno
        objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True)
583 62fed51b Bernardo Dal Seno
584 62fed51b Bernardo Dal Seno
  def testCheckISpecParamSyntax(self):
585 ba5c6c6b Bernardo Dal Seno
    par = "my_parameter"
586 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
587 ba5c6c6b Bernardo Dal Seno
      # Min and max only
588 ba5c6c6b Bernardo Dal Seno
      good_values = [(11, 11), (11, 40), (0, 0)]
589 ba5c6c6b Bernardo Dal Seno
      for (mn, mx) in good_values:
590 da5f09ef Bernardo Dal Seno
        minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
591 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MIN][par] = mn
592 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MAX][par] = mx
593 62fed51b Bernardo Dal Seno
        objects.InstancePolicy._CheckISpecParamSyntax(minmax, {}, par,
594 62fed51b Bernardo Dal Seno
                                                     check_std)
595 da5f09ef Bernardo Dal Seno
      minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
596 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MIN][par] = 11
597 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MAX][par] = 5
598 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
599 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy._CheckISpecParamSyntax,
600 da5f09ef Bernardo Dal Seno
                        minmax, {}, par, check_std)
601 ba5c6c6b Bernardo Dal Seno
    # Min, std, max
602 ba5c6c6b Bernardo Dal Seno
    good_values = [
603 ba5c6c6b Bernardo Dal Seno
      (11, 11, 11),
604 ba5c6c6b Bernardo Dal Seno
      (11, 11, 40),
605 ba5c6c6b Bernardo Dal Seno
      (11, 40, 40),
606 ba5c6c6b Bernardo Dal Seno
      ]
607 ba5c6c6b Bernardo Dal Seno
    for (mn, st, mx) in good_values:
608 da5f09ef Bernardo Dal Seno
      minmax = {
609 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
610 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
611 ba5c6c6b Bernardo Dal Seno
        }
612 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
613 62fed51b Bernardo Dal Seno
      objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec, par, True)
614 ba5c6c6b Bernardo Dal Seno
    bad_values = [
615 b342c9dd Bernardo Dal Seno
      (11, 11,  5, True),
616 b342c9dd Bernardo Dal Seno
      (40, 11, 11, True),
617 b342c9dd Bernardo Dal Seno
      (11, 80, 40, False),
618 b342c9dd Bernardo Dal Seno
      (11,  5, 40, False,),
619 b342c9dd Bernardo Dal Seno
      (11,  5,  5, True),
620 b342c9dd Bernardo Dal Seno
      (40, 40, 11, True),
621 ba5c6c6b Bernardo Dal Seno
      ]
622 b342c9dd Bernardo Dal Seno
    for (mn, st, mx, excp) in bad_values:
623 da5f09ef Bernardo Dal Seno
      minmax = {
624 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
625 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
626 ba5c6c6b Bernardo Dal Seno
        }
627 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
628 b342c9dd Bernardo Dal Seno
      if excp:
629 b342c9dd Bernardo Dal Seno
        self.assertRaises(errors.ConfigurationError,
630 b342c9dd Bernardo Dal Seno
                          objects.InstancePolicy._CheckISpecParamSyntax,
631 b342c9dd Bernardo Dal Seno
                          minmax, stdspec, par, True)
632 b342c9dd Bernardo Dal Seno
      else:
633 b342c9dd Bernardo Dal Seno
        ret = objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec,
634 b342c9dd Bernardo Dal Seno
                                                            par, True)
635 b342c9dd Bernardo Dal Seno
        self.assertFalse(ret)
636 ba5c6c6b Bernardo Dal Seno
637 ba5c6c6b Bernardo Dal Seno
  def testCheckDiskTemplates(self):
638 ba5c6c6b Bernardo Dal Seno
    invalid = "this_is_not_a_good_template"
639 ba5c6c6b Bernardo Dal Seno
    for dt in constants.DISK_TEMPLATES:
640 ba5c6c6b Bernardo Dal Seno
      objects.InstancePolicy.CheckDiskTemplates([dt])
641 ba5c6c6b Bernardo Dal Seno
    objects.InstancePolicy.CheckDiskTemplates(list(constants.DISK_TEMPLATES))
642 ba5c6c6b Bernardo Dal Seno
    bad_examples = [
643 ba5c6c6b Bernardo Dal Seno
      [invalid],
644 ba5c6c6b Bernardo Dal Seno
      [constants.DT_DRBD8, invalid],
645 ba5c6c6b Bernardo Dal Seno
      list(constants.DISK_TEMPLATES) + [invalid],
646 ba5c6c6b Bernardo Dal Seno
      [],
647 ba5c6c6b Bernardo Dal Seno
      None,
648 ba5c6c6b Bernardo Dal Seno
      ]
649 ba5c6c6b Bernardo Dal Seno
    for dtl in bad_examples:
650 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
651 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckDiskTemplates,
652 ba5c6c6b Bernardo Dal Seno
                        dtl)
653 ba5c6c6b Bernardo Dal Seno
654 ba5c6c6b Bernardo Dal Seno
  def testCheckParameterSyntax(self):
655 ba5c6c6b Bernardo Dal Seno
    invalid = "this_key_shouldnt_be_here"
656 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
657 da5f09ef Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax({}, check_std)
658 da5f09ef Bernardo Dal Seno
      policy = {invalid: None}
659 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
660 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckParameterSyntax,
661 ba5c6c6b Bernardo Dal Seno
                        policy, check_std)
662 ba5c6c6b Bernardo Dal Seno
      for par in constants.IPOLICY_PARAMETERS:
663 ba5c6c6b Bernardo Dal Seno
        for val in ("blah", None, {}, [42]):
664 da5f09ef Bernardo Dal Seno
          policy = {par: val}
665 ba5c6c6b Bernardo Dal Seno
          self.assertRaises(errors.ConfigurationError,
666 ba5c6c6b Bernardo Dal Seno
                            objects.InstancePolicy.CheckParameterSyntax,
667 ba5c6c6b Bernardo Dal Seno
                            policy, check_std)
668 ba5c6c6b Bernardo Dal Seno
669 e38bc4eb Bernardo Dal Seno
  def testFillIPolicyEmpty(self):
670 e38bc4eb Bernardo Dal Seno
    policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, {})
671 e38bc4eb Bernardo Dal Seno
    objects.InstancePolicy.CheckParameterSyntax(policy, True)
672 e38bc4eb Bernardo Dal Seno
    self.assertEqual(policy, constants.IPOLICY_DEFAULTS)
673 e38bc4eb Bernardo Dal Seno
674 e38bc4eb Bernardo Dal Seno
  def _AssertISpecsMerged(self, default_spec, diff_spec, merged_spec):
675 e38bc4eb Bernardo Dal Seno
    for (param, value) in merged_spec.items():
676 e38bc4eb Bernardo Dal Seno
      if param in diff_spec:
677 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, diff_spec[param])
678 e38bc4eb Bernardo Dal Seno
      else:
679 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_spec[param])
680 e38bc4eb Bernardo Dal Seno
681 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyMerged(self, default_pol, diff_pol, merged_pol):
682 e38bc4eb Bernardo Dal Seno
    for (key, value) in merged_pol.items():
683 e38bc4eb Bernardo Dal Seno
      if key in diff_pol:
684 41044e04 Bernardo Dal Seno
        if key == constants.ISPECS_STD:
685 e38bc4eb Bernardo Dal Seno
          self._AssertISpecsMerged(default_pol[key], diff_pol[key], value)
686 e38bc4eb Bernardo Dal Seno
        else:
687 e38bc4eb Bernardo Dal Seno
          self.assertEqual(value, diff_pol[key])
688 e38bc4eb Bernardo Dal Seno
      else:
689 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_pol[key])
690 e38bc4eb Bernardo Dal Seno
691 e38bc4eb Bernardo Dal Seno
  def testFillIPolicy(self):
692 e38bc4eb Bernardo Dal Seno
    partial_policies = [
693 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_VCPU_RATIO: 3.14},
694 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_SPINDLE_RATIO: 2.72},
695 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_DTS: [constants.DT_FILE]},
696 41044e04 Bernardo Dal Seno
      {constants.ISPECS_STD: {constants.ISPEC_DISK_COUNT: 3}},
697 41044e04 Bernardo Dal Seno
      {constants.ISPECS_MINMAX: [constants.ISPECS_MINMAX_DEFAULTS,
698 41044e04 Bernardo Dal Seno
                                 constants.ISPECS_MINMAX_DEFAULTS]}
699 e38bc4eb Bernardo Dal Seno
      ]
700 e38bc4eb Bernardo Dal Seno
    for diff_pol in partial_policies:
701 e38bc4eb Bernardo Dal Seno
      policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
702 e38bc4eb Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax(policy, True)
703 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyIsFull(policy)
704 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyMerged(constants.IPOLICY_DEFAULTS, diff_pol, policy)
705 e38bc4eb Bernardo Dal Seno
706 f73f3567 Bernardo Dal Seno
  def testFillIPolicyKeepsUnknown(self):
707 f73f3567 Bernardo Dal Seno
    INVALID_KEY = "invalid_ipolicy_key"
708 f73f3567 Bernardo Dal Seno
    diff_pol = {
709 f73f3567 Bernardo Dal Seno
      INVALID_KEY: None,
710 f73f3567 Bernardo Dal Seno
      }
711 f73f3567 Bernardo Dal Seno
    policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
712 f73f3567 Bernardo Dal Seno
    self.assertTrue(INVALID_KEY in policy)
713 f73f3567 Bernardo Dal Seno
714 e38bc4eb Bernardo Dal Seno
715 73d6b4a7 Helga Velroyen
class TestDisk(unittest.TestCase):
716 73d6b4a7 Helga Velroyen
  def addChild(self, disk):
717 73d6b4a7 Helga Velroyen
    """Adds a child of the same device type as the parent."""
718 73d6b4a7 Helga Velroyen
    disk.children = []
719 73d6b4a7 Helga Velroyen
    child = objects.Disk()
720 73d6b4a7 Helga Velroyen
    child.dev_type = disk.dev_type
721 73d6b4a7 Helga Velroyen
    disk.children.append(child)
722 73d6b4a7 Helga Velroyen
723 73d6b4a7 Helga Velroyen
  def testUpgradeConfigDevTypeLegacy(self):
724 73d6b4a7 Helga Velroyen
    for old, new in [("drbd8", constants.DT_DRBD8),
725 73d6b4a7 Helga Velroyen
                     ("lvm", constants.DT_PLAIN)]:
726 73d6b4a7 Helga Velroyen
      disk = objects.Disk()
727 73d6b4a7 Helga Velroyen
      disk.dev_type = old
728 73d6b4a7 Helga Velroyen
      self.addChild(disk)
729 73d6b4a7 Helga Velroyen
      disk.UpgradeConfig()
730 73d6b4a7 Helga Velroyen
      self.assertEqual(new, disk.dev_type)
731 73d6b4a7 Helga Velroyen
      self.assertEqual(new, disk.children[0].dev_type)
732 73d6b4a7 Helga Velroyen
733 73d6b4a7 Helga Velroyen
  def testUpgradeConfigDevTypeLegacyUnchanged(self):
734 73d6b4a7 Helga Velroyen
    dev_types = [constants.DT_FILE, constants.DT_SHARED_FILE,
735 73d6b4a7 Helga Velroyen
                 constants.DT_BLOCK, constants.DT_EXT,
736 73d6b4a7 Helga Velroyen
                 constants.DT_RBD]
737 73d6b4a7 Helga Velroyen
    for dev_type in dev_types:
738 73d6b4a7 Helga Velroyen
      disk = objects.Disk()
739 73d6b4a7 Helga Velroyen
      disk.dev_type = dev_type
740 73d6b4a7 Helga Velroyen
      self.addChild(disk)
741 73d6b4a7 Helga Velroyen
      disk.UpgradeConfig()
742 73d6b4a7 Helga Velroyen
      self.assertEqual(dev_type, disk.dev_type)
743 73d6b4a7 Helga Velroyen
      self.assertEqual(dev_type, disk.children[0].dev_type)
744 73d6b4a7 Helga Velroyen
745 73d6b4a7 Helga Velroyen
746 2f96c43c Michael Hanselmann
if __name__ == "__main__":
747 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()