Statistics
| Branch: | Tag: | Revision:

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

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