Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (24.4 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 7b64b9ea René Nussbaumer
227 4d36fbf4 Michael Hanselmann
class TestClusterObjectTcpUdpPortPool(unittest.TestCase):
228 4d36fbf4 Michael Hanselmann
  def testNewCluster(self):
229 4d36fbf4 Michael Hanselmann
    self.assertTrue(objects.Cluster().tcpudp_port_pool is None)
230 4d36fbf4 Michael Hanselmann
231 4d36fbf4 Michael Hanselmann
  def testSerializingEmpty(self):
232 4d36fbf4 Michael Hanselmann
    self.assertEqual(objects.Cluster().ToDict(), {
233 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [],
234 4d36fbf4 Michael Hanselmann
      })
235 4d36fbf4 Michael Hanselmann
236 4d36fbf4 Michael Hanselmann
  def testSerializing(self):
237 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
238 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
239 4d36fbf4 Michael Hanselmann
240 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(3546)
241 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(62511)
242 4d36fbf4 Michael Hanselmann
243 4d36fbf4 Michael Hanselmann
    data = cluster.ToDict()
244 4d36fbf4 Michael Hanselmann
    self.assertEqual(data.keys(), ["tcpudp_port_pool"])
245 4d36fbf4 Michael Hanselmann
    self.assertEqual(sorted(data["tcpudp_port_pool"]), sorted([3546, 62511]))
246 4d36fbf4 Michael Hanselmann
247 4d36fbf4 Michael Hanselmann
  def testDeserializingEmpty(self):
248 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
249 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
250 4d36fbf4 Michael Hanselmann
251 4d36fbf4 Michael Hanselmann
  def testDeserialize(self):
252 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({
253 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [26214, 10039, 267],
254 4d36fbf4 Michael Hanselmann
      })
255 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set([26214, 10039, 267]))
256 4d36fbf4 Michael Hanselmann
257 4d36fbf4 Michael Hanselmann
258 870dc44c Iustin Pop
class TestOS(unittest.TestCase):
259 870dc44c Iustin Pop
  ALL_DATA = [
260 870dc44c Iustin Pop
    "debootstrap",
261 870dc44c Iustin Pop
    "debootstrap+default",
262 870dc44c Iustin Pop
    "debootstrap++default",
263 870dc44c Iustin Pop
    ]
264 870dc44c Iustin Pop
265 870dc44c Iustin Pop
  def testSplitNameVariant(self):
266 870dc44c Iustin Pop
    for name in self.ALL_DATA:
267 870dc44c Iustin Pop
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
268 870dc44c Iustin Pop
269 870dc44c Iustin Pop
  def testVariant(self):
270 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
271 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
272 870dc44c Iustin Pop
273 870dc44c Iustin Pop
274 6a050007 Michael Hanselmann
class TestInstance(unittest.TestCase):
275 6a050007 Michael Hanselmann
  def _GenericCheck(self, inst):
276 6a050007 Michael Hanselmann
    for i in [inst.all_nodes, inst.secondary_nodes]:
277 6a050007 Michael Hanselmann
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
278 6a050007 Michael Hanselmann
                      msg="Data type doesn't guarantee order")
279 6a050007 Michael Hanselmann
280 6a050007 Michael Hanselmann
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
281 6a050007 Michael Hanselmann
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
282 6a050007 Michael Hanselmann
                     msg="Primary node not first node in list")
283 6a050007 Michael Hanselmann
284 6a050007 Michael Hanselmann
  def testNodesNoDisks(self):
285 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinst.example.com",
286 6a050007 Michael Hanselmann
      primary_node="pnode.example.com",
287 6a050007 Michael Hanselmann
      disks=[
288 6a050007 Michael Hanselmann
        ])
289 6a050007 Michael Hanselmann
290 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
291 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
292 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
293 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
294 6a050007 Michael Hanselmann
      inst.primary_node: [],
295 6a050007 Michael Hanselmann
      })
296 6a050007 Michael Hanselmann
297 6a050007 Michael Hanselmann
  def testNodesPlainDisks(self):
298 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstplain.example.com",
299 6a050007 Michael Hanselmann
      primary_node="node3.example.com",
300 6a050007 Michael Hanselmann
      disks=[
301 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_PLAIN, size=128,
302 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk25494")),
303 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_PLAIN, size=512,
304 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk29071")),
305 6a050007 Michael Hanselmann
        ])
306 6a050007 Michael Hanselmann
307 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
308 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
309 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
310 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
311 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
312 6a050007 Michael Hanselmann
      })
313 6a050007 Michael Hanselmann
314 6a050007 Michael Hanselmann
  def testNodesDrbdDisks(self):
315 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstdrbd.example.com",
316 6a050007 Michael Hanselmann
      primary_node="node10.example.com",
317 6a050007 Michael Hanselmann
      disks=[
318 cd3b4ff4 Helga Velroyen
        objects.Disk(dev_type=constants.DT_DRBD8, size=786432,
319 6a050007 Michael Hanselmann
          logical_id=("node10.example.com", "node15.example.com",
320 6a050007 Michael Hanselmann
                      12300, 0, 0, "secret"),
321 6a050007 Michael Hanselmann
          children=[
322 cd3b4ff4 Helga Velroyen
            objects.Disk(dev_type=constants.DT_PLAIN, size=786432,
323 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "disk0")),
324 cd3b4ff4 Helga Velroyen
            objects.Disk(dev_type=constants.DT_PLAIN, size=128,
325 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "meta0"))
326 6a050007 Michael Hanselmann
          ],
327 6a050007 Michael Hanselmann
          iv_name="disk/0")
328 6a050007 Michael Hanselmann
        ])
329 6a050007 Michael Hanselmann
330 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
331 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
332 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes),
333 6a050007 Michael Hanselmann
                     set([inst.primary_node, "node15.example.com"]))
334 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
335 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
336 6a050007 Michael Hanselmann
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
337 6a050007 Michael Hanselmann
      })
338 6a050007 Michael Hanselmann
339 6a050007 Michael Hanselmann
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
340 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
341 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
342 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
343 6a050007 Michael Hanselmann
344 6a050007 Michael Hanselmann
345 5f06ce5e Michael Hanselmann
class TestNode(unittest.TestCase):
346 5f06ce5e Michael Hanselmann
  def testEmpty(self):
347 5f06ce5e Michael Hanselmann
    self.assertEqual(objects.Node().ToDict(), {})
348 5f06ce5e Michael Hanselmann
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
349 5f06ce5e Michael Hanselmann
350 5f06ce5e Michael Hanselmann
  def testHvState(self):
351 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node18157.example.com", hv_state={
352 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
353 5f06ce5e Michael Hanselmann
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
354 5f06ce5e Michael Hanselmann
      })
355 5f06ce5e Michael Hanselmann
356 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
357 5f06ce5e Michael Hanselmann
358 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
359 5f06ce5e Michael Hanselmann
    del node
360 5f06ce5e Michael Hanselmann
361 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node18157.example.com")
362 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.hv_state), frozenset([
363 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM,
364 5f06ce5e Michael Hanselmann
      constants.HT_KVM,
365 5f06ce5e Michael Hanselmann
      ]))
366 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
367 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
368 5f06ce5e Michael Hanselmann
369 5f06ce5e Michael Hanselmann
  def testDiskState(self):
370 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node32087.example.com", disk_state={
371 cd3b4ff4 Helga Velroyen
      constants.DT_PLAIN: {
372 5f06ce5e Michael Hanselmann
        "lv32352": objects.NodeDiskState(total=128),
373 5f06ce5e Michael Hanselmann
        "lv2082": objects.NodeDiskState(total=512),
374 5f06ce5e Michael Hanselmann
        },
375 5f06ce5e Michael Hanselmann
      })
376 5f06ce5e Michael Hanselmann
377 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
378 5f06ce5e Michael Hanselmann
379 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
380 5f06ce5e Michael Hanselmann
    del node
381 5f06ce5e Michael Hanselmann
382 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node32087.example.com")
383 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state), frozenset([
384 cd3b4ff4 Helga Velroyen
      constants.DT_PLAIN,
385 5f06ce5e Michael Hanselmann
      ]))
386 cd3b4ff4 Helga Velroyen
    self.assertEqual(frozenset(node2.disk_state[constants.DT_PLAIN]),
387 cd3b4ff4 Helga Velroyen
                     frozenset(["lv32352", "lv2082"]))
388 cd3b4ff4 Helga Velroyen
    self.assertEqual(node2.disk_state[constants.DT_PLAIN]["lv2082"].total, 512)
389 cd3b4ff4 Helga Velroyen
    self.assertEqual(node2.disk_state[constants.DT_PLAIN]["lv32352"].total, 128)
390 5f06ce5e Michael Hanselmann
391 250a9404 Bernardo Dal Seno
  def testFilterEsNdp(self):
392 250a9404 Bernardo Dal Seno
    node1 = objects.Node(name="node11673.example.com", ndparams={
393 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: True,
394 250a9404 Bernardo Dal Seno
      })
395 250a9404 Bernardo Dal Seno
    node2 = objects.Node(name="node11674.example.com", ndparams={
396 250a9404 Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 3,
397 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: False,
398 250a9404 Bernardo Dal Seno
      })
399 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
400 250a9404 Bernardo Dal Seno
    node1.UpgradeConfig()
401 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
402 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
403 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
404 250a9404 Bernardo Dal Seno
    node2.UpgradeConfig()
405 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
406 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
407 250a9404 Bernardo Dal Seno
408 5f06ce5e Michael Hanselmann
409 e38bc4eb Bernardo Dal Seno
class TestInstancePolicy(unittest.TestCase):
410 e38bc4eb Bernardo Dal Seno
  def setUp(self):
411 e38bc4eb Bernardo Dal Seno
    # Policies are big, and we want to see the difference in case of an error
412 e38bc4eb Bernardo Dal Seno
    self.maxDiff = None
413 e38bc4eb Bernardo Dal Seno
414 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyIsFull(self, policy):
415 e38bc4eb Bernardo Dal Seno
    self.assertEqual(frozenset(policy.keys()), constants.IPOLICY_ALL_KEYS)
416 41044e04 Bernardo Dal Seno
    self.assertTrue(len(policy[constants.ISPECS_MINMAX]) > 0)
417 41044e04 Bernardo Dal Seno
    for minmax in policy[constants.ISPECS_MINMAX]:
418 41044e04 Bernardo Dal Seno
      self.assertEqual(frozenset(minmax.keys()), constants.ISPECS_MINMAX_KEYS)
419 41044e04 Bernardo Dal Seno
      for key in constants.ISPECS_MINMAX_KEYS:
420 41044e04 Bernardo Dal Seno
        self.assertEqual(frozenset(minmax[key].keys()),
421 41044e04 Bernardo Dal Seno
                         constants.ISPECS_PARAMETERS)
422 da5f09ef Bernardo Dal Seno
    self.assertEqual(frozenset(policy[constants.ISPECS_STD].keys()),
423 da5f09ef Bernardo Dal Seno
                     constants.ISPECS_PARAMETERS)
424 e38bc4eb Bernardo Dal Seno
425 e38bc4eb Bernardo Dal Seno
  def testDefaultIPolicy(self):
426 e38bc4eb Bernardo Dal Seno
    objects.InstancePolicy.CheckParameterSyntax(constants.IPOLICY_DEFAULTS,
427 e38bc4eb Bernardo Dal Seno
                                                True)
428 e38bc4eb Bernardo Dal Seno
    self._AssertIPolicyIsFull(constants.IPOLICY_DEFAULTS)
429 e38bc4eb Bernardo Dal Seno
430 41044e04 Bernardo Dal Seno
  def _AssertPolicyIsBad(self, ipolicy, do_check_std=None):
431 41044e04 Bernardo Dal Seno
    if do_check_std is None:
432 41044e04 Bernardo Dal Seno
      check_std_vals = [False, True]
433 41044e04 Bernardo Dal Seno
    else:
434 41044e04 Bernardo Dal Seno
      check_std_vals = [do_check_std]
435 41044e04 Bernardo Dal Seno
    for check_std in check_std_vals:
436 41044e04 Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
437 41044e04 Bernardo Dal Seno
                        objects.InstancePolicy.CheckISpecSyntax,
438 41044e04 Bernardo Dal Seno
                        ipolicy, check_std)
439 41044e04 Bernardo Dal Seno
440 ba5c6c6b Bernardo Dal Seno
  def testCheckISpecSyntax(self):
441 b342c9dd Bernardo Dal Seno
    default_stdspec = constants.IPOLICY_DEFAULTS[constants.ISPECS_STD]
442 62fed51b Bernardo Dal Seno
    incomplete_ipolicies = [
443 62fed51b Bernardo Dal Seno
      {
444 41044e04 Bernardo Dal Seno
         constants.ISPECS_MINMAX: [],
445 b342c9dd Bernardo Dal Seno
         constants.ISPECS_STD: default_stdspec,
446 62fed51b Bernardo Dal Seno
         },
447 62fed51b Bernardo Dal Seno
      {
448 41044e04 Bernardo Dal Seno
         constants.ISPECS_MINMAX: [{}],
449 41044e04 Bernardo Dal Seno
         constants.ISPECS_STD: default_stdspec,
450 41044e04 Bernardo Dal Seno
         },
451 41044e04 Bernardo Dal Seno
      {
452 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
453 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
454 41044e04 Bernardo Dal Seno
          }],
455 b342c9dd Bernardo Dal Seno
        constants.ISPECS_STD: default_stdspec,
456 62fed51b Bernardo Dal Seno
        },
457 62fed51b Bernardo Dal Seno
      {
458 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
459 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
460 41044e04 Bernardo Dal Seno
          }],
461 b342c9dd Bernardo Dal Seno
        constants.ISPECS_STD: default_stdspec,
462 62fed51b Bernardo Dal Seno
        },
463 62fed51b Bernardo Dal Seno
      {
464 41044e04 Bernardo Dal Seno
        constants.ISPECS_MINMAX: [{
465 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
466 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
467 41044e04 Bernardo Dal Seno
          }],
468 62fed51b Bernardo Dal Seno
        },
469 62fed51b Bernardo Dal Seno
      ]
470 62fed51b Bernardo Dal Seno
    for ipol in incomplete_ipolicies:
471 62fed51b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
472 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy.CheckISpecSyntax,
473 62fed51b Bernardo Dal Seno
                        ipol, True)
474 41044e04 Bernardo Dal Seno
      oldminmax = ipol[constants.ISPECS_MINMAX]
475 41044e04 Bernardo Dal Seno
      if oldminmax:
476 41044e04 Bernardo Dal Seno
        # Prepending valid specs shouldn't change the error
477 41044e04 Bernardo Dal Seno
        ipol[constants.ISPECS_MINMAX] = ([constants.ISPECS_MINMAX_DEFAULTS] +
478 41044e04 Bernardo Dal Seno
                                         oldminmax)
479 41044e04 Bernardo Dal Seno
        self.assertRaises(errors.ConfigurationError,
480 41044e04 Bernardo Dal Seno
                          objects.InstancePolicy.CheckISpecSyntax,
481 41044e04 Bernardo Dal Seno
                          ipol, True)
482 41044e04 Bernardo Dal Seno
483 41044e04 Bernardo Dal Seno
    good_ipolicy = {
484 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [
485 41044e04 Bernardo Dal Seno
        {
486 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: {
487 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 64,
488 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 1,
489 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 2,
490 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 64,
491 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 1,
492 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 1,
493 41044e04 Bernardo Dal Seno
            },
494 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: {
495 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 16384,
496 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 5,
497 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 12,
498 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024,
499 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 9,
500 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 18,
501 41044e04 Bernardo Dal Seno
            },
502 41044e04 Bernardo Dal Seno
          },
503 41044e04 Bernardo Dal Seno
        {
504 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: {
505 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 32768,
506 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 8,
507 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 1,
508 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024,
509 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 1,
510 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 1,
511 41044e04 Bernardo Dal Seno
            },
512 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: {
513 41044e04 Bernardo Dal Seno
            constants.ISPEC_MEM_SIZE: 65536,
514 41044e04 Bernardo Dal Seno
            constants.ISPEC_CPU_COUNT: 10,
515 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: 5,
516 41044e04 Bernardo Dal Seno
            constants.ISPEC_DISK_SIZE: 1024 * 1024,
517 41044e04 Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: 3,
518 41044e04 Bernardo Dal Seno
            constants.ISPEC_SPINDLE_USE: 12,
519 41044e04 Bernardo Dal Seno
            },
520 41044e04 Bernardo Dal Seno
          },
521 41044e04 Bernardo Dal Seno
        ],
522 41044e04 Bernardo Dal Seno
      }
523 41044e04 Bernardo Dal Seno
    good_ipolicy[constants.ISPECS_STD] = copy.deepcopy(
524 41044e04 Bernardo Dal Seno
      good_ipolicy[constants.ISPECS_MINMAX][0][constants.ISPECS_MAX])
525 41044e04 Bernardo Dal Seno
    # Check that it's really good before making it bad
526 41044e04 Bernardo Dal Seno
    objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True)
527 41044e04 Bernardo Dal Seno
528 41044e04 Bernardo Dal Seno
    bad_ipolicy = copy.deepcopy(good_ipolicy)
529 41044e04 Bernardo Dal Seno
    for minmax in bad_ipolicy[constants.ISPECS_MINMAX]:
530 41044e04 Bernardo Dal Seno
      for (key, spec) in minmax.items():
531 41044e04 Bernardo Dal Seno
        for param in spec:
532 41044e04 Bernardo Dal Seno
          oldv = spec[param]
533 41044e04 Bernardo Dal Seno
          del spec[param]
534 41044e04 Bernardo Dal Seno
          self._AssertPolicyIsBad(bad_ipolicy)
535 41044e04 Bernardo Dal Seno
          if key == constants.ISPECS_MIN:
536 41044e04 Bernardo Dal Seno
            spec[param] = minmax[constants.ISPECS_MAX][param] + 1
537 41044e04 Bernardo Dal Seno
          self._AssertPolicyIsBad(bad_ipolicy)
538 41044e04 Bernardo Dal Seno
          spec[param] = oldv
539 41044e04 Bernardo Dal Seno
    assert bad_ipolicy == good_ipolicy
540 41044e04 Bernardo Dal Seno
541 41044e04 Bernardo Dal Seno
    stdspec = bad_ipolicy[constants.ISPECS_STD]
542 41044e04 Bernardo Dal Seno
    for param in stdspec:
543 41044e04 Bernardo Dal Seno
      oldv = stdspec[param]
544 41044e04 Bernardo Dal Seno
      del stdspec[param]
545 41044e04 Bernardo Dal Seno
      self._AssertPolicyIsBad(bad_ipolicy, True)
546 41044e04 Bernardo Dal Seno
      # Note that std spec is the same as a max spec
547 41044e04 Bernardo Dal Seno
      stdspec[param] = oldv + 1
548 41044e04 Bernardo Dal Seno
      self._AssertPolicyIsBad(bad_ipolicy, True)
549 41044e04 Bernardo Dal Seno
      stdspec[param] = oldv
550 41044e04 Bernardo Dal Seno
    assert bad_ipolicy == good_ipolicy
551 41044e04 Bernardo Dal Seno
552 41044e04 Bernardo Dal Seno
    for minmax in good_ipolicy[constants.ISPECS_MINMAX]:
553 41044e04 Bernardo Dal Seno
      for spec in minmax.values():
554 41044e04 Bernardo Dal Seno
        good_ipolicy[constants.ISPECS_STD] = spec
555 41044e04 Bernardo Dal Seno
        objects.InstancePolicy.CheckISpecSyntax(good_ipolicy, True)
556 62fed51b Bernardo Dal Seno
557 62fed51b Bernardo Dal Seno
  def testCheckISpecParamSyntax(self):
558 ba5c6c6b Bernardo Dal Seno
    par = "my_parameter"
559 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
560 ba5c6c6b Bernardo Dal Seno
      # Min and max only
561 ba5c6c6b Bernardo Dal Seno
      good_values = [(11, 11), (11, 40), (0, 0)]
562 ba5c6c6b Bernardo Dal Seno
      for (mn, mx) in good_values:
563 da5f09ef Bernardo Dal Seno
        minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
564 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MIN][par] = mn
565 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MAX][par] = mx
566 62fed51b Bernardo Dal Seno
        objects.InstancePolicy._CheckISpecParamSyntax(minmax, {}, par,
567 62fed51b Bernardo Dal Seno
                                                     check_std)
568 da5f09ef Bernardo Dal Seno
      minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
569 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MIN][par] = 11
570 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MAX][par] = 5
571 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
572 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy._CheckISpecParamSyntax,
573 da5f09ef Bernardo Dal Seno
                        minmax, {}, par, check_std)
574 ba5c6c6b Bernardo Dal Seno
    # Min, std, max
575 ba5c6c6b Bernardo Dal Seno
    good_values = [
576 ba5c6c6b Bernardo Dal Seno
      (11, 11, 11),
577 ba5c6c6b Bernardo Dal Seno
      (11, 11, 40),
578 ba5c6c6b Bernardo Dal Seno
      (11, 40, 40),
579 ba5c6c6b Bernardo Dal Seno
      ]
580 ba5c6c6b Bernardo Dal Seno
    for (mn, st, mx) in good_values:
581 da5f09ef Bernardo Dal Seno
      minmax = {
582 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
583 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
584 ba5c6c6b Bernardo Dal Seno
        }
585 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
586 62fed51b Bernardo Dal Seno
      objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec, par, True)
587 ba5c6c6b Bernardo Dal Seno
    bad_values = [
588 b342c9dd Bernardo Dal Seno
      (11, 11,  5, True),
589 b342c9dd Bernardo Dal Seno
      (40, 11, 11, True),
590 b342c9dd Bernardo Dal Seno
      (11, 80, 40, False),
591 b342c9dd Bernardo Dal Seno
      (11,  5, 40, False,),
592 b342c9dd Bernardo Dal Seno
      (11,  5,  5, True),
593 b342c9dd Bernardo Dal Seno
      (40, 40, 11, True),
594 ba5c6c6b Bernardo Dal Seno
      ]
595 b342c9dd Bernardo Dal Seno
    for (mn, st, mx, excp) in bad_values:
596 da5f09ef Bernardo Dal Seno
      minmax = {
597 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
598 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
599 ba5c6c6b Bernardo Dal Seno
        }
600 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
601 b342c9dd Bernardo Dal Seno
      if excp:
602 b342c9dd Bernardo Dal Seno
        self.assertRaises(errors.ConfigurationError,
603 b342c9dd Bernardo Dal Seno
                          objects.InstancePolicy._CheckISpecParamSyntax,
604 b342c9dd Bernardo Dal Seno
                          minmax, stdspec, par, True)
605 b342c9dd Bernardo Dal Seno
      else:
606 b342c9dd Bernardo Dal Seno
        ret = objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec,
607 b342c9dd Bernardo Dal Seno
                                                            par, True)
608 b342c9dd Bernardo Dal Seno
        self.assertFalse(ret)
609 ba5c6c6b Bernardo Dal Seno
610 ba5c6c6b Bernardo Dal Seno
  def testCheckDiskTemplates(self):
611 ba5c6c6b Bernardo Dal Seno
    invalid = "this_is_not_a_good_template"
612 ba5c6c6b Bernardo Dal Seno
    for dt in constants.DISK_TEMPLATES:
613 ba5c6c6b Bernardo Dal Seno
      objects.InstancePolicy.CheckDiskTemplates([dt])
614 ba5c6c6b Bernardo Dal Seno
    objects.InstancePolicy.CheckDiskTemplates(list(constants.DISK_TEMPLATES))
615 ba5c6c6b Bernardo Dal Seno
    bad_examples = [
616 ba5c6c6b Bernardo Dal Seno
      [invalid],
617 ba5c6c6b Bernardo Dal Seno
      [constants.DT_DRBD8, invalid],
618 ba5c6c6b Bernardo Dal Seno
      list(constants.DISK_TEMPLATES) + [invalid],
619 ba5c6c6b Bernardo Dal Seno
      [],
620 ba5c6c6b Bernardo Dal Seno
      None,
621 ba5c6c6b Bernardo Dal Seno
      ]
622 ba5c6c6b Bernardo Dal Seno
    for dtl in bad_examples:
623 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
624 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckDiskTemplates,
625 ba5c6c6b Bernardo Dal Seno
                        dtl)
626 ba5c6c6b Bernardo Dal Seno
627 ba5c6c6b Bernardo Dal Seno
  def testCheckParameterSyntax(self):
628 ba5c6c6b Bernardo Dal Seno
    invalid = "this_key_shouldnt_be_here"
629 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
630 da5f09ef Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax({}, check_std)
631 da5f09ef Bernardo Dal Seno
      policy = {invalid: None}
632 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
633 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckParameterSyntax,
634 ba5c6c6b Bernardo Dal Seno
                        policy, check_std)
635 ba5c6c6b Bernardo Dal Seno
      for par in constants.IPOLICY_PARAMETERS:
636 ba5c6c6b Bernardo Dal Seno
        for val in ("blah", None, {}, [42]):
637 da5f09ef Bernardo Dal Seno
          policy = {par: val}
638 ba5c6c6b Bernardo Dal Seno
          self.assertRaises(errors.ConfigurationError,
639 ba5c6c6b Bernardo Dal Seno
                            objects.InstancePolicy.CheckParameterSyntax,
640 ba5c6c6b Bernardo Dal Seno
                            policy, check_std)
641 ba5c6c6b Bernardo Dal Seno
642 e38bc4eb Bernardo Dal Seno
  def testFillIPolicyEmpty(self):
643 e38bc4eb Bernardo Dal Seno
    policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, {})
644 e38bc4eb Bernardo Dal Seno
    objects.InstancePolicy.CheckParameterSyntax(policy, True)
645 e38bc4eb Bernardo Dal Seno
    self.assertEqual(policy, constants.IPOLICY_DEFAULTS)
646 e38bc4eb Bernardo Dal Seno
647 e38bc4eb Bernardo Dal Seno
  def _AssertISpecsMerged(self, default_spec, diff_spec, merged_spec):
648 e38bc4eb Bernardo Dal Seno
    for (param, value) in merged_spec.items():
649 e38bc4eb Bernardo Dal Seno
      if param in diff_spec:
650 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, diff_spec[param])
651 e38bc4eb Bernardo Dal Seno
      else:
652 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_spec[param])
653 e38bc4eb Bernardo Dal Seno
654 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyMerged(self, default_pol, diff_pol, merged_pol):
655 e38bc4eb Bernardo Dal Seno
    for (key, value) in merged_pol.items():
656 e38bc4eb Bernardo Dal Seno
      if key in diff_pol:
657 41044e04 Bernardo Dal Seno
        if key == constants.ISPECS_STD:
658 e38bc4eb Bernardo Dal Seno
          self._AssertISpecsMerged(default_pol[key], diff_pol[key], value)
659 e38bc4eb Bernardo Dal Seno
        else:
660 e38bc4eb Bernardo Dal Seno
          self.assertEqual(value, diff_pol[key])
661 e38bc4eb Bernardo Dal Seno
      else:
662 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_pol[key])
663 e38bc4eb Bernardo Dal Seno
664 e38bc4eb Bernardo Dal Seno
  def testFillIPolicy(self):
665 e38bc4eb Bernardo Dal Seno
    partial_policies = [
666 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_VCPU_RATIO: 3.14},
667 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_SPINDLE_RATIO: 2.72},
668 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_DTS: [constants.DT_FILE]},
669 41044e04 Bernardo Dal Seno
      {constants.ISPECS_STD: {constants.ISPEC_DISK_COUNT: 3}},
670 41044e04 Bernardo Dal Seno
      {constants.ISPECS_MINMAX: [constants.ISPECS_MINMAX_DEFAULTS,
671 41044e04 Bernardo Dal Seno
                                 constants.ISPECS_MINMAX_DEFAULTS]}
672 e38bc4eb Bernardo Dal Seno
      ]
673 e38bc4eb Bernardo Dal Seno
    for diff_pol in partial_policies:
674 e38bc4eb Bernardo Dal Seno
      policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
675 e38bc4eb Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax(policy, True)
676 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyIsFull(policy)
677 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyMerged(constants.IPOLICY_DEFAULTS, diff_pol, policy)
678 e38bc4eb Bernardo Dal Seno
679 f73f3567 Bernardo Dal Seno
  def testFillIPolicyKeepsUnknown(self):
680 f73f3567 Bernardo Dal Seno
    INVALID_KEY = "invalid_ipolicy_key"
681 f73f3567 Bernardo Dal Seno
    diff_pol = {
682 f73f3567 Bernardo Dal Seno
      INVALID_KEY: None,
683 f73f3567 Bernardo Dal Seno
      }
684 f73f3567 Bernardo Dal Seno
    policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
685 f73f3567 Bernardo Dal Seno
    self.assertTrue(INVALID_KEY in policy)
686 f73f3567 Bernardo Dal Seno
687 e38bc4eb Bernardo Dal Seno
688 2f96c43c Michael Hanselmann
if __name__ == "__main__":
689 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()