Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.objects_unittest.py @ 93a968aa

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