Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.objects_unittest.py @ 14933c17

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