Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.objects_unittest.py @ 62fed51b

History | View | Annotate | Download (21.8 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 4c14965f Guido Trotter
import unittest
26 4c14965f Guido Trotter
27 7b64b9ea René Nussbaumer
from ganeti import constants
28 4c14965f Guido Trotter
from ganeti import objects
29 6a050007 Michael Hanselmann
from ganeti import errors
30 4c14965f Guido Trotter
31 25231ec5 Michael Hanselmann
import testutils
32 25231ec5 Michael Hanselmann
33 25231ec5 Michael Hanselmann
34 4c14965f Guido Trotter
class SimpleObject(objects.ConfigObject):
35 8c114acd Michael Hanselmann
  __slots__ = ["a", "b"]
36 4c14965f Guido Trotter
37 25231ec5 Michael Hanselmann
38 4c14965f Guido Trotter
class TestDictState(unittest.TestCase):
39 4c14965f Guido Trotter
  """Simple dict tansformation tests"""
40 4c14965f Guido Trotter
41 4c14965f Guido Trotter
  def testSimpleObjectToDict(self):
42 8c114acd Michael Hanselmann
    o1 = SimpleObject(a="1")
43 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": "1"})
44 8c114acd Michael Hanselmann
    self.assertEquals(o1.__getstate__(), {"a": "1"})
45 4c14965f Guido Trotter
    self.assertEquals(o1.__getstate__(), o1.ToDict())
46 4c14965f Guido Trotter
    o1.a = 2
47 4c14965f Guido Trotter
    o1.b = 5
48 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
49 4c14965f Guido Trotter
    o2 = SimpleObject.FromDict(o1.ToDict())
50 8c114acd Michael Hanselmann
    self.assertEquals(o1.ToDict(), {"a": 2, "b": 5})
51 4c14965f Guido Trotter
52 4c14965f Guido Trotter
53 7b64b9ea René Nussbaumer
class TestClusterObject(unittest.TestCase):
54 7b64b9ea René Nussbaumer
  """Tests done on a L{objects.Cluster}"""
55 7b64b9ea René Nussbaumer
56 7b64b9ea René Nussbaumer
  def setUp(self):
57 7b64b9ea René Nussbaumer
    hvparams = {
58 7b64b9ea René Nussbaumer
      constants.HT_FAKE: {
59 7b64b9ea René Nussbaumer
        "foo": "bar",
60 7b64b9ea René Nussbaumer
        "bar": "foo",
61 7b64b9ea René Nussbaumer
        "foobar": "barfoo",
62 7b64b9ea René Nussbaumer
        },
63 7b64b9ea René Nussbaumer
      }
64 7b64b9ea René Nussbaumer
    os_hvp = {
65 7b64b9ea René Nussbaumer
      "lenny-image": {
66 7b64b9ea René Nussbaumer
        constants.HT_FAKE: {
67 7b64b9ea René Nussbaumer
          "foo": "baz",
68 7b64b9ea René Nussbaumer
          "foobar": "foobar",
69 7b64b9ea René Nussbaumer
          "blah": "blibb",
70 7b64b9ea René Nussbaumer
          "blubb": "blah",
71 7b64b9ea René Nussbaumer
          },
72 7b64b9ea René Nussbaumer
        constants.HT_XEN_PVM: {
73 7b64b9ea René Nussbaumer
          "root_path": "/dev/sda5",
74 7b64b9ea René Nussbaumer
          "foo": "foobar",
75 7b64b9ea René Nussbaumer
          },
76 7b64b9ea René Nussbaumer
        },
77 7b64b9ea René Nussbaumer
      "ubuntu-hardy": {
78 7b64b9ea René Nussbaumer
        },
79 7b64b9ea René Nussbaumer
      }
80 095e71aa René Nussbaumer
    ndparams = {
81 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/cluster-oob",
82 0ea11dcb Bernardo Dal Seno
        constants.ND_SPINDLE_COUNT: 1,
83 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: False,
84 095e71aa René Nussbaumer
        }
85 095e71aa René Nussbaumer
86 095e71aa René Nussbaumer
    self.fake_cl = objects.Cluster(hvparams=hvparams, os_hvp=os_hvp,
87 095e71aa René Nussbaumer
                                   ndparams=ndparams)
88 7b64b9ea René Nussbaumer
    self.fake_cl.UpgradeConfig()
89 7b64b9ea René Nussbaumer
90 d63479b5 Iustin Pop
  def testGetHVDefaults(self):
91 d63479b5 Iustin Pop
    cl = self.fake_cl
92 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_FAKE),
93 d63479b5 Iustin Pop
                         cl.hvparams[constants.HT_FAKE])
94 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(None), {})
95 d63479b5 Iustin Pop
    self.failUnlessEqual(cl.GetHVDefaults(constants.HT_XEN_PVM,
96 d63479b5 Iustin Pop
                                          os_name="lenny-image"),
97 d63479b5 Iustin Pop
                         cl.os_hvp["lenny-image"][constants.HT_XEN_PVM])
98 d63479b5 Iustin Pop
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 7b64b9ea René Nussbaumer
    fake_dict = {
106 7b64b9ea René Nussbaumer
      "foo": "baz",
107 7b64b9ea René Nussbaumer
      "bar": "foo",
108 7b64b9ea René Nussbaumer
      "foobar": "foobar",
109 7b64b9ea René Nussbaumer
      "blah": "blubb",
110 7b64b9ea René Nussbaumer
      "blubb": "blah",
111 7b64b9ea René Nussbaumer
      }
112 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
113 7b64b9ea René Nussbaumer
                                 os="lenny-image",
114 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
115 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
116 7b64b9ea René Nussbaumer
    self.assertEqual(fake_dict, self.fake_cl.FillHV(fake_inst))
117 7b64b9ea René Nussbaumer
118 7b64b9ea René Nussbaumer
  def testFillHvGlobalParams(self):
119 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
120 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
121 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_FAKE,
122 7b64b9ea René Nussbaumer
                                 hvparams={})
123 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.hvparams[constants.HT_FAKE],
124 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
125 7b64b9ea René Nussbaumer
126 7b64b9ea René Nussbaumer
  def testFillHvInstParams(self):
127 7b64b9ea René Nussbaumer
    inst_hvparams = {
128 7b64b9ea René Nussbaumer
      "blah": "blubb",
129 7b64b9ea René Nussbaumer
      }
130 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
131 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
132 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
133 7b64b9ea René Nussbaumer
                                 hvparams=inst_hvparams)
134 7b64b9ea René Nussbaumer
    self.assertEqual(inst_hvparams, self.fake_cl.FillHV(fake_inst))
135 7b64b9ea René Nussbaumer
136 7b64b9ea René Nussbaumer
  def testFillHvEmptyParams(self):
137 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
138 7b64b9ea René Nussbaumer
                                 os="ubuntu-hardy",
139 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
140 7b64b9ea René Nussbaumer
                                 hvparams={})
141 7b64b9ea René Nussbaumer
    self.assertEqual({}, self.fake_cl.FillHV(fake_inst))
142 7b64b9ea René Nussbaumer
143 7b64b9ea René Nussbaumer
  def testFillHvPartialParams(self):
144 7b64b9ea René Nussbaumer
    os = "lenny-image"
145 7b64b9ea René Nussbaumer
    fake_inst = objects.Instance(name="foobar",
146 7b64b9ea René Nussbaumer
                                 os=os,
147 7b64b9ea René Nussbaumer
                                 hypervisor=constants.HT_XEN_PVM,
148 7b64b9ea René Nussbaumer
                                 hvparams={})
149 7b64b9ea René Nussbaumer
    self.assertEqual(self.fake_cl.os_hvp[os][constants.HT_XEN_PVM],
150 7b64b9ea René Nussbaumer
                     self.fake_cl.FillHV(fake_inst))
151 7b64b9ea René Nussbaumer
152 095e71aa René Nussbaumer
  def testFillNdParamsCluster(self):
153 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
154 095e71aa René Nussbaumer
                             ndparams={},
155 095e71aa René Nussbaumer
                             group="testgroup")
156 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
157 095e71aa René Nussbaumer
                                   ndparams={})
158 095e71aa René Nussbaumer
    self.assertEqual(self.fake_cl.ndparams,
159 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
160 095e71aa René Nussbaumer
161 095e71aa René Nussbaumer
  def testFillNdParamsNodeGroup(self):
162 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
163 095e71aa René Nussbaumer
                             ndparams={},
164 095e71aa René Nussbaumer
                             group="testgroup")
165 095e71aa René Nussbaumer
    group_ndparams = {
166 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
167 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 10,
168 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
169 095e71aa René Nussbaumer
        }
170 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
171 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
172 095e71aa René Nussbaumer
    self.assertEqual(group_ndparams,
173 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
174 095e71aa René Nussbaumer
175 095e71aa René Nussbaumer
  def testFillNdParamsNode(self):
176 095e71aa René Nussbaumer
    node_ndparams = {
177 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
178 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 2,
179 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
180 095e71aa René Nussbaumer
        }
181 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
182 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
183 095e71aa René Nussbaumer
                             group="testgroup")
184 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
185 095e71aa René Nussbaumer
                                   ndparams={})
186 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
187 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
188 095e71aa René Nussbaumer
189 095e71aa René Nussbaumer
  def testFillNdParamsAll(self):
190 095e71aa René Nussbaumer
    node_ndparams = {
191 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
192 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 5,
193 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: True,
194 095e71aa René Nussbaumer
        }
195 095e71aa René Nussbaumer
    fake_node = objects.Node(name="test",
196 095e71aa René Nussbaumer
                             ndparams=node_ndparams,
197 095e71aa René Nussbaumer
                             group="testgroup")
198 095e71aa René Nussbaumer
    group_ndparams = {
199 432e8e2f Iustin Pop
        constants.ND_OOB_PROGRAM: "/bin/group-oob",
200 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 4,
201 095e71aa René Nussbaumer
        }
202 095e71aa René Nussbaumer
    fake_group = objects.NodeGroup(name="testgroup",
203 095e71aa René Nussbaumer
                                   ndparams=group_ndparams)
204 095e71aa René Nussbaumer
    self.assertEqual(node_ndparams,
205 095e71aa René Nussbaumer
                     self.fake_cl.FillND(fake_node, fake_group))
206 095e71aa René Nussbaumer
207 0fbedb7a Michael Hanselmann
  def testPrimaryHypervisor(self):
208 0fbedb7a Michael Hanselmann
    assert self.fake_cl.enabled_hypervisors is None
209 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_HVM]
210 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_HVM)
211 0fbedb7a Michael Hanselmann
212 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = [constants.HT_XEN_PVM, constants.HT_KVM]
213 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_XEN_PVM)
214 0fbedb7a Michael Hanselmann
215 0fbedb7a Michael Hanselmann
    self.fake_cl.enabled_hypervisors = sorted(constants.HYPER_TYPES)
216 0fbedb7a Michael Hanselmann
    self.assertEqual(self.fake_cl.primary_hypervisor, constants.HT_CHROOT)
217 0fbedb7a Michael Hanselmann
218 4f7e5a1d Bernardo Dal Seno
  def testUpgradeConfig(self):
219 4f7e5a1d Bernardo Dal Seno
    # FIXME: This test is incomplete
220 4f7e5a1d Bernardo Dal Seno
    cluster = objects.Cluster()
221 4f7e5a1d Bernardo Dal Seno
    cluster.UpgradeConfig()
222 4f7e5a1d Bernardo Dal Seno
    cluster = objects.Cluster(ipolicy={"unknown_key": None})
223 4f7e5a1d Bernardo Dal Seno
    self.assertRaises(errors.ConfigurationError, cluster.UpgradeConfig)
224 4f7e5a1d Bernardo Dal Seno
225 7b64b9ea René Nussbaumer
226 4d36fbf4 Michael Hanselmann
class TestClusterObjectTcpUdpPortPool(unittest.TestCase):
227 4d36fbf4 Michael Hanselmann
  def testNewCluster(self):
228 4d36fbf4 Michael Hanselmann
    self.assertTrue(objects.Cluster().tcpudp_port_pool is None)
229 4d36fbf4 Michael Hanselmann
230 4d36fbf4 Michael Hanselmann
  def testSerializingEmpty(self):
231 4d36fbf4 Michael Hanselmann
    self.assertEqual(objects.Cluster().ToDict(), {
232 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [],
233 4d36fbf4 Michael Hanselmann
      })
234 4d36fbf4 Michael Hanselmann
235 4d36fbf4 Michael Hanselmann
  def testSerializing(self):
236 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
237 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
238 4d36fbf4 Michael Hanselmann
239 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(3546)
240 4d36fbf4 Michael Hanselmann
    cluster.tcpudp_port_pool.add(62511)
241 4d36fbf4 Michael Hanselmann
242 4d36fbf4 Michael Hanselmann
    data = cluster.ToDict()
243 4d36fbf4 Michael Hanselmann
    self.assertEqual(data.keys(), ["tcpudp_port_pool"])
244 4d36fbf4 Michael Hanselmann
    self.assertEqual(sorted(data["tcpudp_port_pool"]), sorted([3546, 62511]))
245 4d36fbf4 Michael Hanselmann
246 4d36fbf4 Michael Hanselmann
  def testDeserializingEmpty(self):
247 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({})
248 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set())
249 4d36fbf4 Michael Hanselmann
250 4d36fbf4 Michael Hanselmann
  def testDeserialize(self):
251 4d36fbf4 Michael Hanselmann
    cluster = objects.Cluster.FromDict({
252 4d36fbf4 Michael Hanselmann
      "tcpudp_port_pool": [26214, 10039, 267],
253 4d36fbf4 Michael Hanselmann
      })
254 4d36fbf4 Michael Hanselmann
    self.assertEqual(cluster.tcpudp_port_pool, set([26214, 10039, 267]))
255 4d36fbf4 Michael Hanselmann
256 4d36fbf4 Michael Hanselmann
257 870dc44c Iustin Pop
class TestOS(unittest.TestCase):
258 870dc44c Iustin Pop
  ALL_DATA = [
259 870dc44c Iustin Pop
    "debootstrap",
260 870dc44c Iustin Pop
    "debootstrap+default",
261 870dc44c Iustin Pop
    "debootstrap++default",
262 870dc44c Iustin Pop
    ]
263 870dc44c Iustin Pop
264 870dc44c Iustin Pop
  def testSplitNameVariant(self):
265 870dc44c Iustin Pop
    for name in self.ALL_DATA:
266 870dc44c Iustin Pop
      self.assertEqual(len(objects.OS.SplitNameVariant(name)), 2)
267 870dc44c Iustin Pop
268 870dc44c Iustin Pop
  def testVariant(self):
269 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap"), "")
270 870dc44c Iustin Pop
    self.assertEqual(objects.OS.GetVariant("debootstrap+default"), "default")
271 870dc44c Iustin Pop
272 870dc44c Iustin Pop
273 6a050007 Michael Hanselmann
class TestInstance(unittest.TestCase):
274 6a050007 Michael Hanselmann
  def _GenericCheck(self, inst):
275 6a050007 Michael Hanselmann
    for i in [inst.all_nodes, inst.secondary_nodes]:
276 6a050007 Michael Hanselmann
      self.assertTrue(isinstance(inst.all_nodes, (list, tuple)),
277 6a050007 Michael Hanselmann
                      msg="Data type doesn't guarantee order")
278 6a050007 Michael Hanselmann
279 6a050007 Michael Hanselmann
    self.assertTrue(inst.primary_node not in inst.secondary_nodes)
280 6a050007 Michael Hanselmann
    self.assertEqual(inst.all_nodes[0], inst.primary_node,
281 6a050007 Michael Hanselmann
                     msg="Primary node not first node in list")
282 6a050007 Michael Hanselmann
283 6a050007 Michael Hanselmann
  def testNodesNoDisks(self):
284 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinst.example.com",
285 6a050007 Michael Hanselmann
      primary_node="pnode.example.com",
286 6a050007 Michael Hanselmann
      disks=[
287 6a050007 Michael Hanselmann
        ])
288 6a050007 Michael Hanselmann
289 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
290 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
291 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
292 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
293 6a050007 Michael Hanselmann
      inst.primary_node: [],
294 6a050007 Michael Hanselmann
      })
295 6a050007 Michael Hanselmann
296 6a050007 Michael Hanselmann
  def testNodesPlainDisks(self):
297 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstplain.example.com",
298 6a050007 Michael Hanselmann
      primary_node="node3.example.com",
299 6a050007 Michael Hanselmann
      disks=[
300 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=128,
301 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk25494")),
302 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_LV, size=512,
303 6a050007 Michael Hanselmann
                     logical_id=("myxenvg", "disk29071")),
304 6a050007 Michael Hanselmann
        ])
305 6a050007 Michael Hanselmann
306 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
307 6a050007 Michael Hanselmann
    self.assertEqual(len(inst.secondary_nodes), 0)
308 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes), set([inst.primary_node]))
309 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
310 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk25494", "myxenvg/disk29071"],
311 6a050007 Michael Hanselmann
      })
312 6a050007 Michael Hanselmann
313 6a050007 Michael Hanselmann
  def testNodesDrbdDisks(self):
314 6a050007 Michael Hanselmann
    inst = objects.Instance(name="fakeinstdrbd.example.com",
315 6a050007 Michael Hanselmann
      primary_node="node10.example.com",
316 6a050007 Michael Hanselmann
      disks=[
317 6a050007 Michael Hanselmann
        objects.Disk(dev_type=constants.LD_DRBD8, size=786432,
318 6a050007 Michael Hanselmann
          logical_id=("node10.example.com", "node15.example.com",
319 6a050007 Michael Hanselmann
                      12300, 0, 0, "secret"),
320 6a050007 Michael Hanselmann
          children=[
321 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=786432,
322 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "disk0")),
323 6a050007 Michael Hanselmann
            objects.Disk(dev_type=constants.LD_LV, size=128,
324 6a050007 Michael Hanselmann
                         logical_id=("myxenvg", "meta0"))
325 6a050007 Michael Hanselmann
          ],
326 6a050007 Michael Hanselmann
          iv_name="disk/0")
327 6a050007 Michael Hanselmann
        ])
328 6a050007 Michael Hanselmann
329 6a050007 Michael Hanselmann
    self._GenericCheck(inst)
330 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.secondary_nodes), set(["node15.example.com"]))
331 6a050007 Michael Hanselmann
    self.assertEqual(set(inst.all_nodes),
332 6a050007 Michael Hanselmann
                     set([inst.primary_node, "node15.example.com"]))
333 6a050007 Michael Hanselmann
    self.assertEqual(inst.MapLVsByNode(), {
334 6a050007 Michael Hanselmann
      inst.primary_node: ["myxenvg/disk0", "myxenvg/meta0"],
335 6a050007 Michael Hanselmann
      "node15.example.com": ["myxenvg/disk0", "myxenvg/meta0"],
336 6a050007 Michael Hanselmann
      })
337 6a050007 Michael Hanselmann
338 6a050007 Michael Hanselmann
    self.assertEqual(inst.FindDisk(0), inst.disks[0])
339 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, "hello")
340 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 100)
341 6a050007 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, inst.FindDisk, 1)
342 6a050007 Michael Hanselmann
343 6a050007 Michael Hanselmann
344 5f06ce5e Michael Hanselmann
class TestNode(unittest.TestCase):
345 5f06ce5e Michael Hanselmann
  def testEmpty(self):
346 5f06ce5e Michael Hanselmann
    self.assertEqual(objects.Node().ToDict(), {})
347 5f06ce5e Michael Hanselmann
    self.assertTrue(isinstance(objects.Node.FromDict({}), objects.Node))
348 5f06ce5e Michael Hanselmann
349 5f06ce5e Michael Hanselmann
  def testHvState(self):
350 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node18157.example.com", hv_state={
351 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM: objects.NodeHvState(cpu_total=64),
352 5f06ce5e Michael Hanselmann
      constants.HT_KVM: objects.NodeHvState(cpu_node=1),
353 5f06ce5e Michael Hanselmann
      })
354 5f06ce5e Michael Hanselmann
355 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
356 5f06ce5e Michael Hanselmann
357 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
358 5f06ce5e Michael Hanselmann
    del node
359 5f06ce5e Michael Hanselmann
360 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node18157.example.com")
361 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.hv_state), frozenset([
362 5f06ce5e Michael Hanselmann
      constants.HT_XEN_HVM,
363 5f06ce5e Michael Hanselmann
      constants.HT_KVM,
364 5f06ce5e Michael Hanselmann
      ]))
365 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_KVM].cpu_node, 1)
366 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.hv_state[constants.HT_XEN_HVM].cpu_total, 64)
367 5f06ce5e Michael Hanselmann
368 5f06ce5e Michael Hanselmann
  def testDiskState(self):
369 5f06ce5e Michael Hanselmann
    node = objects.Node(name="node32087.example.com", disk_state={
370 5f06ce5e Michael Hanselmann
      constants.LD_LV: {
371 5f06ce5e Michael Hanselmann
        "lv32352": objects.NodeDiskState(total=128),
372 5f06ce5e Michael Hanselmann
        "lv2082": objects.NodeDiskState(total=512),
373 5f06ce5e Michael Hanselmann
        },
374 5f06ce5e Michael Hanselmann
      })
375 5f06ce5e Michael Hanselmann
376 5f06ce5e Michael Hanselmann
    node2 = objects.Node.FromDict(node.ToDict())
377 5f06ce5e Michael Hanselmann
378 5f06ce5e Michael Hanselmann
    # Make sure nothing can reference it anymore
379 5f06ce5e Michael Hanselmann
    del node
380 5f06ce5e Michael Hanselmann
381 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.name, "node32087.example.com")
382 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state), frozenset([
383 5f06ce5e Michael Hanselmann
      constants.LD_LV,
384 5f06ce5e Michael Hanselmann
      ]))
385 5f06ce5e Michael Hanselmann
    self.assertEqual(frozenset(node2.disk_state[constants.LD_LV]), frozenset([
386 5f06ce5e Michael Hanselmann
      "lv32352",
387 5f06ce5e Michael Hanselmann
      "lv2082",
388 5f06ce5e Michael Hanselmann
      ]))
389 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv2082"].total, 512)
390 5f06ce5e Michael Hanselmann
    self.assertEqual(node2.disk_state[constants.LD_LV]["lv32352"].total, 128)
391 5f06ce5e Michael Hanselmann
392 250a9404 Bernardo Dal Seno
  def testFilterEsNdp(self):
393 250a9404 Bernardo Dal Seno
    node1 = objects.Node(name="node11673.example.com", ndparams={
394 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: True,
395 250a9404 Bernardo Dal Seno
      })
396 250a9404 Bernardo Dal Seno
    node2 = objects.Node(name="node11674.example.com", ndparams={
397 250a9404 Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 3,
398 250a9404 Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: False,
399 250a9404 Bernardo Dal Seno
      })
400 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
401 250a9404 Bernardo Dal Seno
    node1.UpgradeConfig()
402 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node1.ndparams)
403 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
404 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
405 250a9404 Bernardo Dal Seno
    node2.UpgradeConfig()
406 250a9404 Bernardo Dal Seno
    self.assertFalse(constants.ND_EXCLUSIVE_STORAGE in node2.ndparams)
407 250a9404 Bernardo Dal Seno
    self.assertTrue(constants.ND_SPINDLE_COUNT in node2.ndparams)
408 250a9404 Bernardo Dal Seno
409 5f06ce5e Michael Hanselmann
410 e38bc4eb Bernardo Dal Seno
class TestInstancePolicy(unittest.TestCase):
411 e38bc4eb Bernardo Dal Seno
  def setUp(self):
412 e38bc4eb Bernardo Dal Seno
    # Policies are big, and we want to see the difference in case of an error
413 e38bc4eb Bernardo Dal Seno
    self.maxDiff = None
414 e38bc4eb Bernardo Dal Seno
415 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyIsFull(self, policy):
416 e38bc4eb Bernardo Dal Seno
    self.assertEqual(frozenset(policy.keys()), constants.IPOLICY_ALL_KEYS)
417 da5f09ef Bernardo Dal Seno
    minmax = policy[constants.ISPECS_MINMAX]
418 da5f09ef Bernardo Dal Seno
    self.assertEqual(frozenset(minmax.keys()), constants.ISPECS_MINMAX_KEYS)
419 da5f09ef Bernardo Dal Seno
    for key in constants.ISPECS_MINMAX_KEYS:
420 da5f09ef Bernardo Dal Seno
      self.assertEqual(frozenset(minmax[key].keys()),
421 da5f09ef 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 ba5c6c6b Bernardo Dal Seno
  def testCheckISpecSyntax(self):
431 62fed51b Bernardo Dal Seno
    incomplete_ipolicies = [
432 62fed51b Bernardo Dal Seno
      {
433 62fed51b Bernardo Dal Seno
         constants.ISPECS_MINMAX: {},
434 62fed51b Bernardo Dal Seno
         constants.ISPECS_STD: NotImplemented,
435 62fed51b Bernardo Dal Seno
         },
436 62fed51b Bernardo Dal Seno
      {
437 62fed51b Bernardo Dal Seno
        constants.ISPECS_MINMAX: {
438 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
439 62fed51b Bernardo Dal Seno
          },
440 62fed51b Bernardo Dal Seno
        constants.ISPECS_STD: NotImplemented,
441 62fed51b Bernardo Dal Seno
        },
442 62fed51b Bernardo Dal Seno
      {
443 62fed51b Bernardo Dal Seno
        constants.ISPECS_MINMAX: {
444 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
445 62fed51b Bernardo Dal Seno
          },
446 62fed51b Bernardo Dal Seno
        constants.ISPECS_STD: NotImplemented,
447 62fed51b Bernardo Dal Seno
        },
448 62fed51b Bernardo Dal Seno
      {
449 62fed51b Bernardo Dal Seno
        constants.ISPECS_MINMAX: {
450 62fed51b Bernardo Dal Seno
          constants.ISPECS_MIN: NotImplemented,
451 62fed51b Bernardo Dal Seno
          constants.ISPECS_MAX: NotImplemented,
452 62fed51b Bernardo Dal Seno
          },
453 62fed51b Bernardo Dal Seno
        },
454 62fed51b Bernardo Dal Seno
      ]
455 62fed51b Bernardo Dal Seno
    for ipol in incomplete_ipolicies:
456 62fed51b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
457 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy.CheckISpecSyntax,
458 62fed51b Bernardo Dal Seno
                        ipol, True)
459 62fed51b Bernardo Dal Seno
460 62fed51b Bernardo Dal Seno
  def testCheckISpecParamSyntax(self):
461 ba5c6c6b Bernardo Dal Seno
    par = "my_parameter"
462 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
463 ba5c6c6b Bernardo Dal Seno
      # Only one policy limit
464 da5f09ef Bernardo Dal Seno
      for key in constants.ISPECS_MINMAX_KEYS:
465 da5f09ef Bernardo Dal Seno
        minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
466 da5f09ef Bernardo Dal Seno
        minmax[key][par] = 11
467 62fed51b Bernardo Dal Seno
        objects.InstancePolicy._CheckISpecParamSyntax(minmax, {}, par,
468 62fed51b Bernardo Dal Seno
                                                      check_std)
469 da5f09ef Bernardo Dal Seno
      if check_std:
470 da5f09ef Bernardo Dal Seno
        minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
471 da5f09ef Bernardo Dal Seno
        stdspec = {par: 11}
472 62fed51b Bernardo Dal Seno
        objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec, par,
473 62fed51b Bernardo Dal Seno
                                                      check_std)
474 da5f09ef Bernardo Dal Seno
475 ba5c6c6b Bernardo Dal Seno
      # Min and max only
476 ba5c6c6b Bernardo Dal Seno
      good_values = [(11, 11), (11, 40), (0, 0)]
477 ba5c6c6b Bernardo Dal Seno
      for (mn, mx) in good_values:
478 da5f09ef Bernardo Dal Seno
        minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
479 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MIN][par] = mn
480 da5f09ef Bernardo Dal Seno
        minmax[constants.ISPECS_MAX][par] = mx
481 62fed51b Bernardo Dal Seno
        objects.InstancePolicy._CheckISpecParamSyntax(minmax, {}, par,
482 62fed51b Bernardo Dal Seno
                                                     check_std)
483 da5f09ef Bernardo Dal Seno
      minmax = dict((k, {}) for k in constants.ISPECS_MINMAX_KEYS)
484 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MIN][par] = 11
485 da5f09ef Bernardo Dal Seno
      minmax[constants.ISPECS_MAX][par] = 5
486 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
487 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy._CheckISpecParamSyntax,
488 da5f09ef Bernardo Dal Seno
                        minmax, {}, par, check_std)
489 ba5c6c6b Bernardo Dal Seno
    # Min, std, max
490 ba5c6c6b Bernardo Dal Seno
    good_values = [
491 ba5c6c6b Bernardo Dal Seno
      (11, 11, 11),
492 ba5c6c6b Bernardo Dal Seno
      (11, 11, 40),
493 ba5c6c6b Bernardo Dal Seno
      (11, 40, 40),
494 ba5c6c6b Bernardo Dal Seno
      ]
495 ba5c6c6b Bernardo Dal Seno
    for (mn, st, mx) in good_values:
496 da5f09ef Bernardo Dal Seno
      minmax = {
497 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
498 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
499 ba5c6c6b Bernardo Dal Seno
        }
500 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
501 62fed51b Bernardo Dal Seno
      objects.InstancePolicy._CheckISpecParamSyntax(minmax, stdspec, par, True)
502 ba5c6c6b Bernardo Dal Seno
    bad_values = [
503 ba5c6c6b Bernardo Dal Seno
      (11, 11,  5),
504 ba5c6c6b Bernardo Dal Seno
      (40, 11, 11),
505 ba5c6c6b Bernardo Dal Seno
      (11, 80, 40),
506 ba5c6c6b Bernardo Dal Seno
      (11,  5, 40),
507 ba5c6c6b Bernardo Dal Seno
      (11,  5,  5),
508 ba5c6c6b Bernardo Dal Seno
      (40, 40, 11),
509 ba5c6c6b Bernardo Dal Seno
      ]
510 ba5c6c6b Bernardo Dal Seno
    for (mn, st, mx) in bad_values:
511 da5f09ef Bernardo Dal Seno
      minmax = {
512 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MIN: {par: mn},
513 ba5c6c6b Bernardo Dal Seno
        constants.ISPECS_MAX: {par: mx},
514 ba5c6c6b Bernardo Dal Seno
        }
515 da5f09ef Bernardo Dal Seno
      stdspec = {par: st}
516 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
517 62fed51b Bernardo Dal Seno
                        objects.InstancePolicy._CheckISpecParamSyntax,
518 da5f09ef Bernardo Dal Seno
                        minmax, stdspec, par, True)
519 ba5c6c6b Bernardo Dal Seno
520 ba5c6c6b Bernardo Dal Seno
  def testCheckDiskTemplates(self):
521 ba5c6c6b Bernardo Dal Seno
    invalid = "this_is_not_a_good_template"
522 ba5c6c6b Bernardo Dal Seno
    for dt in constants.DISK_TEMPLATES:
523 ba5c6c6b Bernardo Dal Seno
      objects.InstancePolicy.CheckDiskTemplates([dt])
524 ba5c6c6b Bernardo Dal Seno
    objects.InstancePolicy.CheckDiskTemplates(list(constants.DISK_TEMPLATES))
525 ba5c6c6b Bernardo Dal Seno
    bad_examples = [
526 ba5c6c6b Bernardo Dal Seno
      [invalid],
527 ba5c6c6b Bernardo Dal Seno
      [constants.DT_DRBD8, invalid],
528 ba5c6c6b Bernardo Dal Seno
      list(constants.DISK_TEMPLATES) + [invalid],
529 ba5c6c6b Bernardo Dal Seno
      [],
530 ba5c6c6b Bernardo Dal Seno
      None,
531 ba5c6c6b Bernardo Dal Seno
      ]
532 ba5c6c6b Bernardo Dal Seno
    for dtl in bad_examples:
533 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
534 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckDiskTemplates,
535 ba5c6c6b Bernardo Dal Seno
                        dtl)
536 ba5c6c6b Bernardo Dal Seno
537 ba5c6c6b Bernardo Dal Seno
  def testCheckParameterSyntax(self):
538 ba5c6c6b Bernardo Dal Seno
    invalid = "this_key_shouldnt_be_here"
539 ba5c6c6b Bernardo Dal Seno
    for check_std in [True, False]:
540 da5f09ef Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax({}, check_std)
541 da5f09ef Bernardo Dal Seno
      policy = {invalid: None}
542 ba5c6c6b Bernardo Dal Seno
      self.assertRaises(errors.ConfigurationError,
543 ba5c6c6b Bernardo Dal Seno
                        objects.InstancePolicy.CheckParameterSyntax,
544 ba5c6c6b Bernardo Dal Seno
                        policy, check_std)
545 ba5c6c6b Bernardo Dal Seno
      for par in constants.IPOLICY_PARAMETERS:
546 ba5c6c6b Bernardo Dal Seno
        for val in ("blah", None, {}, [42]):
547 da5f09ef Bernardo Dal Seno
          policy = {par: val}
548 ba5c6c6b Bernardo Dal Seno
          self.assertRaises(errors.ConfigurationError,
549 ba5c6c6b Bernardo Dal Seno
                            objects.InstancePolicy.CheckParameterSyntax,
550 ba5c6c6b Bernardo Dal Seno
                            policy, check_std)
551 ba5c6c6b Bernardo Dal Seno
552 e38bc4eb Bernardo Dal Seno
  def testFillIPolicyEmpty(self):
553 e38bc4eb Bernardo Dal Seno
    policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, {})
554 e38bc4eb Bernardo Dal Seno
    objects.InstancePolicy.CheckParameterSyntax(policy, True)
555 e38bc4eb Bernardo Dal Seno
    self.assertEqual(policy, constants.IPOLICY_DEFAULTS)
556 e38bc4eb Bernardo Dal Seno
557 e38bc4eb Bernardo Dal Seno
  def _AssertISpecsMerged(self, default_spec, diff_spec, merged_spec):
558 e38bc4eb Bernardo Dal Seno
    for (param, value) in merged_spec.items():
559 e38bc4eb Bernardo Dal Seno
      if param in diff_spec:
560 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, diff_spec[param])
561 e38bc4eb Bernardo Dal Seno
      else:
562 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_spec[param])
563 e38bc4eb Bernardo Dal Seno
564 e38bc4eb Bernardo Dal Seno
  def _AssertIPolicyMerged(self, default_pol, diff_pol, merged_pol):
565 e38bc4eb Bernardo Dal Seno
    for (key, value) in merged_pol.items():
566 e38bc4eb Bernardo Dal Seno
      if key in diff_pol:
567 da5f09ef Bernardo Dal Seno
        if key == constants.ISPECS_MINMAX:
568 da5f09ef Bernardo Dal Seno
          self.assertEqual(frozenset(value), constants.ISPECS_MINMAX_KEYS)
569 da5f09ef Bernardo Dal Seno
          for k in constants.ISPECS_MINMAX_KEYS:
570 da5f09ef Bernardo Dal Seno
            self._AssertISpecsMerged(default_pol[key][k], diff_pol[key][k],
571 da5f09ef Bernardo Dal Seno
                                     value[k])
572 da5f09ef Bernardo Dal Seno
        elif key == constants.ISPECS_STD:
573 e38bc4eb Bernardo Dal Seno
          self._AssertISpecsMerged(default_pol[key], diff_pol[key], value)
574 e38bc4eb Bernardo Dal Seno
        else:
575 e38bc4eb Bernardo Dal Seno
          self.assertEqual(value, diff_pol[key])
576 e38bc4eb Bernardo Dal Seno
      else:
577 e38bc4eb Bernardo Dal Seno
        self.assertEqual(value, default_pol[key])
578 e38bc4eb Bernardo Dal Seno
579 e38bc4eb Bernardo Dal Seno
  def testFillIPolicy(self):
580 e38bc4eb Bernardo Dal Seno
    partial_policies = [
581 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_VCPU_RATIO: 3.14},
582 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_SPINDLE_RATIO: 2.72},
583 e38bc4eb Bernardo Dal Seno
      {constants.IPOLICY_DTS: [constants.DT_FILE]},
584 e38bc4eb Bernardo Dal Seno
      ]
585 e38bc4eb Bernardo Dal Seno
    for diff_pol in partial_policies:
586 e38bc4eb Bernardo Dal Seno
      policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
587 e38bc4eb Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax(policy, True)
588 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyIsFull(policy)
589 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyMerged(constants.IPOLICY_DEFAULTS, diff_pol, policy)
590 e38bc4eb Bernardo Dal Seno
591 e38bc4eb Bernardo Dal Seno
  def testFillIPolicySpecs(self):
592 da5f09ef Bernardo Dal Seno
    partial_ipolicies = [
593 da5f09ef Bernardo Dal Seno
      {
594 da5f09ef Bernardo Dal Seno
        constants.ISPECS_MINMAX: {
595 da5f09ef Bernardo Dal Seno
          constants.ISPECS_MIN: {constants.ISPEC_MEM_SIZE: 32},
596 da5f09ef Bernardo Dal Seno
          constants.ISPECS_MAX: {constants.ISPEC_CPU_COUNT: 1024}
597 da5f09ef Bernardo Dal Seno
          },
598 da5f09ef Bernardo Dal Seno
        },
599 da5f09ef Bernardo Dal Seno
      {
600 da5f09ef Bernardo Dal Seno
        constants.ISPECS_MINMAX: {
601 da5f09ef Bernardo Dal Seno
          constants.ISPECS_MAX: {
602 da5f09ef Bernardo Dal Seno
            constants.ISPEC_DISK_COUNT: constants.MAX_DISKS - 1,
603 da5f09ef Bernardo Dal Seno
            constants.ISPEC_NIC_COUNT: constants.MAX_NICS - 1,
604 da5f09ef Bernardo Dal Seno
            },
605 da5f09ef Bernardo Dal Seno
          constants.ISPECS_MIN: {},
606 da5f09ef Bernardo Dal Seno
          },
607 da5f09ef Bernardo Dal Seno
          constants.ISPECS_STD: {constants.ISPEC_DISK_SIZE: 2048},
608 da5f09ef Bernardo Dal Seno
        },
609 da5f09ef Bernardo Dal Seno
      {
610 da5f09ef Bernardo Dal Seno
        constants.ISPECS_STD: {constants.ISPEC_SPINDLE_USE: 3},
611 da5f09ef Bernardo Dal Seno
        },
612 e38bc4eb Bernardo Dal Seno
      ]
613 da5f09ef Bernardo Dal Seno
    for diff_pol in partial_ipolicies:
614 e38bc4eb Bernardo Dal Seno
      policy = objects.FillIPolicy(constants.IPOLICY_DEFAULTS, diff_pol)
615 e38bc4eb Bernardo Dal Seno
      objects.InstancePolicy.CheckParameterSyntax(policy, True)
616 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyIsFull(policy)
617 e38bc4eb Bernardo Dal Seno
      self._AssertIPolicyMerged(constants.IPOLICY_DEFAULTS, diff_pol, policy)
618 e38bc4eb Bernardo Dal Seno
619 e38bc4eb Bernardo Dal Seno
620 2f96c43c Michael Hanselmann
if __name__ == "__main__":
621 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()