Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.config_unittest.py @ 560ef132

History | View | Annotate | Download (23 kB)

1 e00fb268 Iustin Pop
#!/usr/bin/python
2 e00fb268 Iustin Pop
#
3 e00fb268 Iustin Pop
4 64760879 Bernardo Dal Seno
# Copyright (C) 2006, 2007, 2010, 2011, 2012, 2013 Google Inc.
5 e00fb268 Iustin Pop
#
6 e00fb268 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 e00fb268 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 e00fb268 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 e00fb268 Iustin Pop
# (at your option) any later version.
10 e00fb268 Iustin Pop
#
11 e00fb268 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 e00fb268 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 e00fb268 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 e00fb268 Iustin Pop
# General Public License for more details.
15 e00fb268 Iustin Pop
#
16 e00fb268 Iustin Pop
# You should have received a copy of the GNU General Public License
17 e00fb268 Iustin Pop
# along with this program; if not, write to the Free Software
18 e00fb268 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 e00fb268 Iustin Pop
# 02110-1301, USA.
20 e00fb268 Iustin Pop
21 e00fb268 Iustin Pop
22 e00fb268 Iustin Pop
"""Script for unittesting the config module"""
23 e00fb268 Iustin Pop
24 e00fb268 Iustin Pop
25 e00fb268 Iustin Pop
import unittest
26 e00fb268 Iustin Pop
import os
27 e00fb268 Iustin Pop
import tempfile
28 54c31fd3 Michael Hanselmann
import operator
29 e00fb268 Iustin Pop
30 c666722f Oleksiy Mishchenko
from ganeti import bootstrap
31 e00fb268 Iustin Pop
from ganeti import config
32 c666722f Oleksiy Mishchenko
from ganeti import constants
33 c666722f Oleksiy Mishchenko
from ganeti import errors
34 e00fb268 Iustin Pop
from ganeti import objects
35 6f1bebf9 Michael Hanselmann
from ganeti import utils
36 a744b676 Manuel Franceschini
from ganeti import netutils
37 54c31fd3 Michael Hanselmann
from ganeti import compat
38 22b7f6f8 Thomas Thrainer
from ganeti.cmdlib import instance
39 e00fb268 Iustin Pop
40 28a7318f Iustin Pop
from ganeti.config import TemporaryReservationManager
41 28a7318f Iustin Pop
42 25231ec5 Michael Hanselmann
import testutils
43 e60c73a1 René Nussbaumer
import mocks
44 def6577f Helga Velroyen
import mock
45 e60c73a1 René Nussbaumer
46 e60c73a1 René Nussbaumer
47 e60c73a1 René Nussbaumer
def _StubGetEntResolver():
48 e60c73a1 René Nussbaumer
  return mocks.FakeGetentResolver()
49 25231ec5 Michael Hanselmann
50 e00fb268 Iustin Pop
51 e00fb268 Iustin Pop
class TestConfigRunner(unittest.TestCase):
52 e00fb268 Iustin Pop
  """Testing case for HooksRunner"""
53 e00fb268 Iustin Pop
  def setUp(self):
54 e00fb268 Iustin Pop
    fd, self.cfg_file = tempfile.mkstemp()
55 e00fb268 Iustin Pop
    os.close(fd)
56 c666722f Oleksiy Mishchenko
    self._init_cluster(self.cfg_file)
57 e00fb268 Iustin Pop
58 e00fb268 Iustin Pop
  def tearDown(self):
59 e00fb268 Iustin Pop
    try:
60 e00fb268 Iustin Pop
      os.unlink(self.cfg_file)
61 e00fb268 Iustin Pop
    except OSError:
62 e00fb268 Iustin Pop
      pass
63 e00fb268 Iustin Pop
64 e00fb268 Iustin Pop
  def _get_object(self):
65 64760879 Bernardo Dal Seno
    """Returns an instance of ConfigWriter"""
66 e60c73a1 René Nussbaumer
    cfg = config.ConfigWriter(cfg_file=self.cfg_file, offline=True,
67 e60c73a1 René Nussbaumer
                              _getents=_StubGetEntResolver)
68 e00fb268 Iustin Pop
    return cfg
69 e00fb268 Iustin Pop
70 e00fb268 Iustin Pop
  def _init_cluster(self, cfg):
71 e00fb268 Iustin Pop
    """Initializes the cfg object"""
72 b705c7a6 Manuel Franceschini
    me = netutils.Hostname()
73 9769bb78 Manuel Franceschini
    ip = constants.IP4_ADDRESS_LOCALHOST
74 3697def0 Bernardo Dal Seno
    # master_ip must not conflict with the node ip address
75 3697def0 Bernardo Dal Seno
    master_ip = "127.0.0.2"
76 f6bd6e98 Michael Hanselmann
77 b9eeeb02 Michael Hanselmann
    cluster_config = objects.Cluster(
78 b9eeeb02 Michael Hanselmann
      serial_no=1,
79 b9eeeb02 Michael Hanselmann
      rsahostkeypub="",
80 a9542a4f Thomas Thrainer
      dsahostkeypub="",
81 b9eeeb02 Michael Hanselmann
      highest_used_port=(constants.FIRST_DRBD_PORT - 1),
82 b9eeeb02 Michael Hanselmann
      mac_prefix="aa:00:00",
83 b9eeeb02 Michael Hanselmann
      volume_group_name="xenvg",
84 9e33896b Luca Bigliardi
      drbd_usermode_helper="/bin/true",
85 c66f21a4 Guido Trotter
      nicparams={constants.PP_DEFAULT: constants.NICC_DEFAULTS},
86 5768e6a6 René Nussbaumer
      ndparams=constants.NDC_DEFAULTS,
87 b9eeeb02 Michael Hanselmann
      tcpudp_port_pool=set(),
88 066f465d Guido Trotter
      enabled_hypervisors=[constants.HT_FAKE],
89 f6bd6e98 Michael Hanselmann
      master_node=me.name,
90 3697def0 Bernardo Dal Seno
      master_ip=master_ip,
91 f6bd6e98 Michael Hanselmann
      master_netdev=constants.DEFAULT_BRIDGE,
92 f6bd6e98 Michael Hanselmann
      cluster_name="cluster.local",
93 f6bd6e98 Michael Hanselmann
      file_storage_dir="/tmp",
94 93be53da Balazs Lecz
      uid_pool=[],
95 b9eeeb02 Michael Hanselmann
      )
96 f6bd6e98 Michael Hanselmann
97 f6bd6e98 Michael Hanselmann
    master_node_config = objects.Node(name=me.name,
98 f6bd6e98 Michael Hanselmann
                                      primary_ip=me.ip,
99 36b8c2c1 Michael Hanselmann
                                      secondary_ip=ip,
100 4a89c54a Iustin Pop
                                      serial_no=1,
101 4a89c54a Iustin Pop
                                      master_candidate=True)
102 f6bd6e98 Michael Hanselmann
103 c666722f Oleksiy Mishchenko
    bootstrap.InitConfig(constants.CONFIG_VERSION,
104 c666722f Oleksiy Mishchenko
                         cluster_config, master_node_config, self.cfg_file)
105 e00fb268 Iustin Pop
106 e00fb268 Iustin Pop
  def _create_instance(self):
107 e00fb268 Iustin Pop
    """Create and return an instance object"""
108 da4a52a3 Thomas Thrainer
    inst = objects.Instance(name="test.example.com",
109 da4a52a3 Thomas Thrainer
                            uuid="test-uuid",
110 da4a52a3 Thomas Thrainer
                            disks=[], nics=[],
111 4a89c54a Iustin Pop
                            disk_template=constants.DT_DISKLESS,
112 4a89c54a Iustin Pop
                            primary_node=self._get_object().GetMasterNode())
113 e00fb268 Iustin Pop
    return inst
114 e00fb268 Iustin Pop
115 e00fb268 Iustin Pop
  def testEmpty(self):
116 e00fb268 Iustin Pop
    """Test instantiate config object"""
117 e00fb268 Iustin Pop
    self._get_object()
118 e00fb268 Iustin Pop
119 e00fb268 Iustin Pop
  def testInit(self):
120 e00fb268 Iustin Pop
    """Test initialize the config file"""
121 e00fb268 Iustin Pop
    cfg = self._get_object()
122 e00fb268 Iustin Pop
    self.failUnlessEqual(1, len(cfg.GetNodeList()))
123 e00fb268 Iustin Pop
    self.failUnlessEqual(0, len(cfg.GetInstanceList()))
124 e00fb268 Iustin Pop
125 e00fb268 Iustin Pop
  def testUpdateCluster(self):
126 e00fb268 Iustin Pop
    """Test updates on the cluster object"""
127 e00fb268 Iustin Pop
    cfg = self._get_object()
128 e00fb268 Iustin Pop
    # construct a fake cluster object
129 e00fb268 Iustin Pop
    fake_cl = objects.Cluster()
130 e00fb268 Iustin Pop
    # fail if we didn't read the config
131 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
132 e00fb268 Iustin Pop
133 e00fb268 Iustin Pop
    cl = cfg.GetClusterInfo()
134 e00fb268 Iustin Pop
    # first pass, must not fail
135 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
136 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
137 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
138 e00fb268 Iustin Pop
    # but the fake_cl update should still fail
139 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
140 e00fb268 Iustin Pop
141 e00fb268 Iustin Pop
  def testUpdateNode(self):
142 e00fb268 Iustin Pop
    """Test updates on one node object"""
143 e00fb268 Iustin Pop
    cfg = self._get_object()
144 e00fb268 Iustin Pop
    # construct a fake node
145 e00fb268 Iustin Pop
    fake_node = objects.Node()
146 e00fb268 Iustin Pop
    # fail if we didn't read the config
147 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
148 a4eae71f Michael Hanselmann
                          None)
149 e00fb268 Iustin Pop
150 e00fb268 Iustin Pop
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
151 e00fb268 Iustin Pop
    # first pass, must not fail
152 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
153 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
154 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
155 e00fb268 Iustin Pop
    # but the fake_node update should still fail
156 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
157 a4eae71f Michael Hanselmann
                          None)
158 e00fb268 Iustin Pop
159 e00fb268 Iustin Pop
  def testUpdateInstance(self):
160 e00fb268 Iustin Pop
    """Test updates on one instance object"""
161 e00fb268 Iustin Pop
    cfg = self._get_object()
162 e00fb268 Iustin Pop
    # construct a fake instance
163 e00fb268 Iustin Pop
    inst = self._create_instance()
164 e00fb268 Iustin Pop
    fake_instance = objects.Instance()
165 e00fb268 Iustin Pop
    # fail if we didn't read the config
166 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
167 a4eae71f Michael Hanselmann
                          None)
168 e00fb268 Iustin Pop
169 0debfb35 Guido Trotter
    cfg.AddInstance(inst, "my-job")
170 e00fb268 Iustin Pop
    instance = cfg.GetInstanceInfo(cfg.GetInstanceList()[0])
171 e00fb268 Iustin Pop
    # first pass, must not fail
172 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
173 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
174 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
175 e00fb268 Iustin Pop
    # but the fake_instance update should still fail
176 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
177 a4eae71f Michael Hanselmann
                          None)
178 e00fb268 Iustin Pop
179 45f62156 Bernardo Dal Seno
  def testUpgradeSave(self):
180 45f62156 Bernardo Dal Seno
    """Test that any modification done during upgrading is saved back"""
181 45f62156 Bernardo Dal Seno
    cfg = self._get_object()
182 45f62156 Bernardo Dal Seno
183 45f62156 Bernardo Dal Seno
    # Remove an element, run upgrade, and check if the element is
184 45f62156 Bernardo Dal Seno
    # back and the file upgraded
185 45f62156 Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
186 45f62156 Bernardo Dal Seno
    # For a ConfigObject, None is the same as a missing field
187 45f62156 Bernardo Dal Seno
    node.ndparams = None
188 45f62156 Bernardo Dal Seno
    oldsaved = utils.ReadFile(self.cfg_file)
189 45f62156 Bernardo Dal Seno
    cfg._UpgradeConfig()
190 45f62156 Bernardo Dal Seno
    self.assertTrue(node.ndparams is not None)
191 45f62156 Bernardo Dal Seno
    newsaved = utils.ReadFile(self.cfg_file)
192 45f62156 Bernardo Dal Seno
    # We rely on the fact that at least the serial number changes
193 45f62156 Bernardo Dal Seno
    self.assertNotEqual(oldsaved, newsaved)
194 45f62156 Bernardo Dal Seno
195 45f62156 Bernardo Dal Seno
    # Add something that should not be there this time
196 45f62156 Bernardo Dal Seno
    key = list(constants.NDC_GLOBALS)[0]
197 45f62156 Bernardo Dal Seno
    node.ndparams[key] = constants.NDC_DEFAULTS[key]
198 45f62156 Bernardo Dal Seno
    cfg._WriteConfig(None)
199 45f62156 Bernardo Dal Seno
    oldsaved = utils.ReadFile(self.cfg_file)
200 45f62156 Bernardo Dal Seno
    cfg._UpgradeConfig()
201 45f62156 Bernardo Dal Seno
    self.assertTrue(node.ndparams.get(key) is None)
202 45f62156 Bernardo Dal Seno
    newsaved = utils.ReadFile(self.cfg_file)
203 45f62156 Bernardo Dal Seno
    self.assertNotEqual(oldsaved, newsaved)
204 45f62156 Bernardo Dal Seno
205 45f62156 Bernardo Dal Seno
    # Do the upgrade again, this time there should be no update
206 45f62156 Bernardo Dal Seno
    oldsaved = newsaved
207 45f62156 Bernardo Dal Seno
    cfg._UpgradeConfig()
208 45f62156 Bernardo Dal Seno
    newsaved = utils.ReadFile(self.cfg_file)
209 45f62156 Bernardo Dal Seno
    self.assertEqual(oldsaved, newsaved)
210 45f62156 Bernardo Dal Seno
211 45f62156 Bernardo Dal Seno
    # Reload the configuration again: it shouldn't change the file
212 45f62156 Bernardo Dal Seno
    oldsaved = newsaved
213 45f62156 Bernardo Dal Seno
    self._get_object()
214 45f62156 Bernardo Dal Seno
    newsaved = utils.ReadFile(self.cfg_file)
215 45f62156 Bernardo Dal Seno
    self.assertEqual(oldsaved, newsaved)
216 45f62156 Bernardo Dal Seno
217 255e19d4 Guido Trotter
  def testNICParameterSyntaxCheck(self):
218 255e19d4 Guido Trotter
    """Test the NIC's CheckParameterSyntax function"""
219 255e19d4 Guido Trotter
    mode = constants.NIC_MODE
220 255e19d4 Guido Trotter
    link = constants.NIC_LINK
221 255e19d4 Guido Trotter
    m_bridged = constants.NIC_MODE_BRIDGED
222 255e19d4 Guido Trotter
    m_routed = constants.NIC_MODE_ROUTED
223 255e19d4 Guido Trotter
    CheckSyntax = objects.NIC.CheckParameterSyntax
224 255e19d4 Guido Trotter
225 255e19d4 Guido Trotter
    CheckSyntax(constants.NICC_DEFAULTS)
226 8c114acd Michael Hanselmann
    CheckSyntax({mode: m_bridged, link: "br1"})
227 8c114acd Michael Hanselmann
    CheckSyntax({mode: m_routed, link: "default"})
228 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
229 8c114acd Michael Hanselmann
                      CheckSyntax, {mode: "000invalid", link: "any"})
230 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
231 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: None})
232 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
233 8c114acd Michael Hanselmann
                      CheckSyntax, {mode: m_bridged, link: ""})
234 255e19d4 Guido Trotter
235 5768e6a6 René Nussbaumer
  def testGetNdParamsDefault(self):
236 5768e6a6 René Nussbaumer
    cfg = self._get_object()
237 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
238 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), constants.NDC_DEFAULTS)
239 5768e6a6 René Nussbaumer
240 5768e6a6 René Nussbaumer
  def testGetNdParamsModifiedNode(self):
241 5768e6a6 René Nussbaumer
    my_ndparams = {
242 5768e6a6 René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
243 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 1,
244 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: False,
245 807d8853 Sebastian Gebhard
        constants.ND_OVS: True,
246 807d8853 Sebastian Gebhard
        constants.ND_OVS_NAME: "openvswitch",
247 33ffda6c Petr Pudlak
        constants.ND_OVS_LINK: "eth1",
248 33ffda6c Petr Pudlak
        constants.ND_SSH_PORT: 22,
249 5768e6a6 René Nussbaumer
        }
250 5768e6a6 René Nussbaumer
251 5768e6a6 René Nussbaumer
    cfg = self._get_object()
252 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
253 5768e6a6 René Nussbaumer
    node.ndparams = my_ndparams
254 5768e6a6 René Nussbaumer
    cfg.Update(node, None)
255 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), my_ndparams)
256 5768e6a6 René Nussbaumer
257 0ea11dcb Bernardo Dal Seno
  def testGetNdParamsInheritance(self):
258 0ea11dcb Bernardo Dal Seno
    node_ndparams = {
259 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
260 807d8853 Sebastian Gebhard
      constants.ND_OVS_LINK: "eth3"
261 0ea11dcb Bernardo Dal Seno
      }
262 0ea11dcb Bernardo Dal Seno
    group_ndparams = {
263 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
264 807d8853 Sebastian Gebhard
      constants.ND_OVS: True,
265 807d8853 Sebastian Gebhard
      constants.ND_OVS_NAME: "openvswitch",
266 33ffda6c Petr Pudlak
      constants.ND_SSH_PORT: 222,
267 0ea11dcb Bernardo Dal Seno
      }
268 0ea11dcb Bernardo Dal Seno
    expected_ndparams = {
269 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
270 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
271 0ea11dcb Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE:
272 0ea11dcb Bernardo Dal Seno
        constants.NDC_DEFAULTS[constants.ND_EXCLUSIVE_STORAGE],
273 807d8853 Sebastian Gebhard
      constants.ND_OVS: True,
274 807d8853 Sebastian Gebhard
      constants.ND_OVS_NAME: "openvswitch",
275 33ffda6c Petr Pudlak
      constants.ND_OVS_LINK: "eth3",
276 33ffda6c Petr Pudlak
      constants.ND_SSH_PORT: 222,
277 0ea11dcb Bernardo Dal Seno
      }
278 0ea11dcb Bernardo Dal Seno
    cfg = self._get_object()
279 0ea11dcb Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
280 0ea11dcb Bernardo Dal Seno
    node.ndparams = node_ndparams
281 0ea11dcb Bernardo Dal Seno
    cfg.Update(node, None)
282 0ea11dcb Bernardo Dal Seno
    group = cfg.GetNodeGroup(node.group)
283 0ea11dcb Bernardo Dal Seno
    group.ndparams = group_ndparams
284 0ea11dcb Bernardo Dal Seno
    cfg.Update(group, None)
285 0ea11dcb Bernardo Dal Seno
    self.assertEqual(cfg.GetNdParams(node), expected_ndparams)
286 0ea11dcb Bernardo Dal Seno
287 2bac48c4 Adeodato Simo
  def testAddGroupFillsFieldsIfMissing(self):
288 2bac48c4 Adeodato Simo
    cfg = self._get_object()
289 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[])
290 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
291 2bac48c4 Adeodato Simo
    self.assert_(utils.UUID_RE.match(group.uuid))
292 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_PREFERRED, group.alloc_policy)
293 2bac48c4 Adeodato Simo
294 2bac48c4 Adeodato Simo
  def testAddGroupPreservesFields(self):
295 2bac48c4 Adeodato Simo
    cfg = self._get_object()
296 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
297 2bac48c4 Adeodato Simo
                              alloc_policy=constants.ALLOC_POLICY_LAST_RESORT)
298 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
299 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_LAST_RESORT, group.alloc_policy)
300 2bac48c4 Adeodato Simo
301 2bac48c4 Adeodato Simo
  def testAddGroupDoesNotPreserveFields(self):
302 2bac48c4 Adeodato Simo
    cfg = self._get_object()
303 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
304 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
305 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
306 2bac48c4 Adeodato Simo
    self.assertEqual(1, group.serial_no)
307 2bac48c4 Adeodato Simo
    self.assert_(group.ctime > 1200000000)
308 2bac48c4 Adeodato Simo
    self.assert_(group.mtime > 1200000000)
309 2bac48c4 Adeodato Simo
310 2bac48c4 Adeodato Simo
  def testAddGroupCanSkipUUIDCheck(self):
311 2bac48c4 Adeodato Simo
    cfg = self._get_object()
312 2bac48c4 Adeodato Simo
    uuid = cfg.GenerateUniqueID("my-job")
313 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[], uuid=uuid,
314 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
315 2bac48c4 Adeodato Simo
316 2bac48c4 Adeodato Simo
    self.assertRaises(errors.ConfigurationError,
317 2bac48c4 Adeodato Simo
                      cfg.AddNodeGroup, group, "my-job")
318 2bac48c4 Adeodato Simo
319 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job", check_uuid=False) # Does not raise.
320 2bac48c4 Adeodato Simo
    self.assertEqual(uuid, group.uuid)
321 2bac48c4 Adeodato Simo
322 54c31fd3 Michael Hanselmann
  def testAssignGroupNodes(self):
323 54c31fd3 Michael Hanselmann
    me = netutils.Hostname()
324 54c31fd3 Michael Hanselmann
    cfg = self._get_object()
325 54c31fd3 Michael Hanselmann
326 54c31fd3 Michael Hanselmann
    # Create two groups
327 54c31fd3 Michael Hanselmann
    grp1 = objects.NodeGroup(name="grp1", members=[],
328 54c31fd3 Michael Hanselmann
                             uuid="2f2fadf7-2a70-4a23-9ab5-2568c252032c")
329 54c31fd3 Michael Hanselmann
    grp1_serial = 1
330 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp1, "job")
331 54c31fd3 Michael Hanselmann
332 54c31fd3 Michael Hanselmann
    grp2 = objects.NodeGroup(name="grp2", members=[],
333 54c31fd3 Michael Hanselmann
                             uuid="798d0de3-680f-4a0e-b29a-0f54f693b3f1")
334 54c31fd3 Michael Hanselmann
    grp2_serial = 1
335 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp2, "job")
336 54c31fd3 Michael Hanselmann
    self.assertEqual(set(map(operator.attrgetter("name"),
337 54c31fd3 Michael Hanselmann
                             cfg.GetAllNodeGroupsInfo().values())),
338 54c31fd3 Michael Hanselmann
                     set(["grp1", "grp2", constants.INITIAL_NODE_GROUP_NAME]))
339 54c31fd3 Michael Hanselmann
340 54c31fd3 Michael Hanselmann
    # No-op
341 54c31fd3 Michael Hanselmann
    cluster_serial = cfg.GetClusterInfo().serial_no
342 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
343 54c31fd3 Michael Hanselmann
    cluster_serial += 1
344 54c31fd3 Michael Hanselmann
345 54c31fd3 Michael Hanselmann
    # Create two nodes
346 1c3231aa Thomas Thrainer
    node1 = objects.Node(name="node1", group=grp1.uuid, ndparams={},
347 1c3231aa Thomas Thrainer
                         uuid="node1-uuid")
348 54c31fd3 Michael Hanselmann
    node1_serial = 1
349 1c3231aa Thomas Thrainer
    node2 = objects.Node(name="node2", group=grp2.uuid, ndparams={},
350 1c3231aa Thomas Thrainer
                         uuid="node2-uuid")
351 54c31fd3 Michael Hanselmann
    node2_serial = 1
352 54c31fd3 Michael Hanselmann
    cfg.AddNode(node1, "job")
353 54c31fd3 Michael Hanselmann
    cfg.AddNode(node2, "job")
354 54c31fd3 Michael Hanselmann
    cluster_serial += 2
355 1c3231aa Thomas Thrainer
    self.assertEqual(set(cfg.GetNodeList()),
356 1c3231aa Thomas Thrainer
                     set(["node1-uuid", "node2-uuid",
357 1c3231aa Thomas Thrainer
                          cfg.GetNodeInfoByName(me.name).uuid]))
358 54c31fd3 Michael Hanselmann
359 54c31fd3 Michael Hanselmann
    def _VerifySerials():
360 54c31fd3 Michael Hanselmann
      self.assertEqual(cfg.GetClusterInfo().serial_no, cluster_serial)
361 54c31fd3 Michael Hanselmann
      self.assertEqual(node1.serial_no, node1_serial)
362 54c31fd3 Michael Hanselmann
      self.assertEqual(node2.serial_no, node2_serial)
363 54c31fd3 Michael Hanselmann
      self.assertEqual(grp1.serial_no, grp1_serial)
364 54c31fd3 Michael Hanselmann
      self.assertEqual(grp2.serial_no, grp2_serial)
365 54c31fd3 Michael Hanselmann
366 54c31fd3 Michael Hanselmann
    _VerifySerials()
367 54c31fd3 Michael Hanselmann
368 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp1.members), set(["node1-uuid"]))
369 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp2.members), set(["node2-uuid"]))
370 54c31fd3 Michael Hanselmann
371 54c31fd3 Michael Hanselmann
    # Check invalid nodes and groups
372 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
373 54c31fd3 Michael Hanselmann
      ("unknown.node.example.com", grp2.uuid),
374 54c31fd3 Michael Hanselmann
      ])
375 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
376 54c31fd3 Michael Hanselmann
      (node1.name, "unknown-uuid"),
377 54c31fd3 Michael Hanselmann
      ])
378 54c31fd3 Michael Hanselmann
379 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
380 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
381 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp1.members), set(["node1-uuid"]))
382 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp2.members), set(["node2-uuid"]))
383 54c31fd3 Michael Hanselmann
384 54c31fd3 Michael Hanselmann
    # Another no-op
385 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
386 54c31fd3 Michael Hanselmann
    cluster_serial += 1
387 54c31fd3 Michael Hanselmann
    _VerifySerials()
388 54c31fd3 Michael Hanselmann
389 54c31fd3 Michael Hanselmann
    # Assign to the same group (should be a no-op)
390 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
391 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
392 1c3231aa Thomas Thrainer
      (node2.uuid, grp2.uuid),
393 54c31fd3 Michael Hanselmann
      ])
394 54c31fd3 Michael Hanselmann
    cluster_serial += 1
395 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
396 54c31fd3 Michael Hanselmann
    _VerifySerials()
397 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp1.members), set(["node1-uuid"]))
398 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp2.members), set(["node2-uuid"]))
399 54c31fd3 Michael Hanselmann
400 54c31fd3 Michael Hanselmann
    # Assign node 2 to group 1
401 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
402 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
403 1c3231aa Thomas Thrainer
      (node2.uuid, grp1.uuid),
404 54c31fd3 Michael Hanselmann
      ])
405 54c31fd3 Michael Hanselmann
    cluster_serial += 1
406 54c31fd3 Michael Hanselmann
    node2_serial += 1
407 54c31fd3 Michael Hanselmann
    grp1_serial += 1
408 54c31fd3 Michael Hanselmann
    grp2_serial += 1
409 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
410 54c31fd3 Michael Hanselmann
    _VerifySerials()
411 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp1.members), set(["node1-uuid", "node2-uuid"]))
412 54c31fd3 Michael Hanselmann
    self.assertFalse(grp2.members)
413 54c31fd3 Michael Hanselmann
414 54c31fd3 Michael Hanselmann
    # And assign both nodes to group 2
415 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
416 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
417 54c31fd3 Michael Hanselmann
    self.assertNotEqual(grp1.uuid, grp2.uuid)
418 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
419 1c3231aa Thomas Thrainer
      (node1.uuid, grp2.uuid),
420 1c3231aa Thomas Thrainer
      (node2.uuid, grp2.uuid),
421 54c31fd3 Michael Hanselmann
      ])
422 54c31fd3 Michael Hanselmann
    cluster_serial += 1
423 54c31fd3 Michael Hanselmann
    node1_serial += 1
424 54c31fd3 Michael Hanselmann
    node2_serial += 1
425 54c31fd3 Michael Hanselmann
    grp1_serial += 1
426 54c31fd3 Michael Hanselmann
    grp2_serial += 1
427 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp2.uuid)
428 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
429 54c31fd3 Michael Hanselmann
    _VerifySerials()
430 54c31fd3 Michael Hanselmann
    self.assertFalse(grp1.members)
431 1c3231aa Thomas Thrainer
    self.assertEqual(set(grp2.members), set(["node1-uuid", "node2-uuid"]))
432 54c31fd3 Michael Hanselmann
433 54c31fd3 Michael Hanselmann
    # Destructive tests
434 54c31fd3 Michael Hanselmann
    orig_group = node2.group
435 54c31fd3 Michael Hanselmann
    try:
436 54c31fd3 Michael Hanselmann
      other_uuid = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
437 54c31fd3 Michael Hanselmann
      assert compat.all(node.group != other_uuid
438 54c31fd3 Michael Hanselmann
                        for node in cfg.GetAllNodesInfo().values())
439 54c31fd3 Michael Hanselmann
      node2.group = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
440 54c31fd3 Michael Hanselmann
      self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
441 1c3231aa Thomas Thrainer
        (node2.uuid, grp2.uuid),
442 54c31fd3 Michael Hanselmann
        ])
443 54c31fd3 Michael Hanselmann
      _VerifySerials()
444 54c31fd3 Michael Hanselmann
    finally:
445 54c31fd3 Michael Hanselmann
      node2.group = orig_group
446 54c31fd3 Michael Hanselmann
447 64760879 Bernardo Dal Seno
  def _TestVerifyConfigIPolicy(self, ipolicy, ipowner, cfg, isgroup):
448 64760879 Bernardo Dal Seno
    INVALID_KEY = "this_key_cannot_exist"
449 64760879 Bernardo Dal Seno
450 64760879 Bernardo Dal Seno
    ipolicy[INVALID_KEY] = None
451 64760879 Bernardo Dal Seno
    # A call to cluster.SimpleFillIPolicy causes different kinds of error
452 64760879 Bernardo Dal Seno
    # depending on the owner (cluster or group)
453 64760879 Bernardo Dal Seno
    if isgroup:
454 64760879 Bernardo Dal Seno
      errs = cfg.VerifyConfig()
455 0f511c8a Bernardo Dal Seno
      self.assertTrue(len(errs) >= 1)
456 64760879 Bernardo Dal Seno
      errstr = "%s has invalid instance policy" % ipowner
457 0f511c8a Bernardo Dal Seno
      self.assertTrue(_IsErrorInList(errstr, errs))
458 64760879 Bernardo Dal Seno
    else:
459 64760879 Bernardo Dal Seno
      self.assertRaises(AssertionError, cfg.VerifyConfig)
460 64760879 Bernardo Dal Seno
    del ipolicy[INVALID_KEY]
461 64760879 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
462 64760879 Bernardo Dal Seno
    self.assertFalse(errs)
463 64760879 Bernardo Dal Seno
464 64760879 Bernardo Dal Seno
    key = list(constants.IPOLICY_PARAMETERS)[0]
465 64760879 Bernardo Dal Seno
    hasoldv = (key in ipolicy)
466 64760879 Bernardo Dal Seno
    if hasoldv:
467 64760879 Bernardo Dal Seno
      oldv = ipolicy[key]
468 64760879 Bernardo Dal Seno
    ipolicy[key] = "blah"
469 64760879 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
470 64760879 Bernardo Dal Seno
    self.assertTrue(len(errs) >= 1)
471 64760879 Bernardo Dal Seno
    self.assertTrue(_IsErrorInList("%s has invalid instance policy" % ipowner,
472 64760879 Bernardo Dal Seno
                                   errs))
473 64760879 Bernardo Dal Seno
    if hasoldv:
474 64760879 Bernardo Dal Seno
      ipolicy[key] = oldv
475 64760879 Bernardo Dal Seno
    else:
476 64760879 Bernardo Dal Seno
      del ipolicy[key]
477 64760879 Bernardo Dal Seno
478 0f511c8a Bernardo Dal Seno
    ispeclist = []
479 0f511c8a Bernardo Dal Seno
    if constants.ISPECS_MINMAX in ipolicy:
480 41044e04 Bernardo Dal Seno
      for k in range(len(ipolicy[constants.ISPECS_MINMAX])):
481 41044e04 Bernardo Dal Seno
        ispeclist.extend([
482 41044e04 Bernardo Dal Seno
            (ipolicy[constants.ISPECS_MINMAX][k][constants.ISPECS_MIN],
483 41044e04 Bernardo Dal Seno
             "%s[%s]/%s" % (constants.ISPECS_MINMAX, k, constants.ISPECS_MIN)),
484 41044e04 Bernardo Dal Seno
            (ipolicy[constants.ISPECS_MINMAX][k][constants.ISPECS_MAX],
485 41044e04 Bernardo Dal Seno
             "%s[%s]/%s" % (constants.ISPECS_MINMAX, k, constants.ISPECS_MAX)),
486 41044e04 Bernardo Dal Seno
            ])
487 0f511c8a Bernardo Dal Seno
    if constants.ISPECS_STD in ipolicy:
488 0f511c8a Bernardo Dal Seno
      ispeclist.append((ipolicy[constants.ISPECS_STD], constants.ISPECS_STD))
489 0f511c8a Bernardo Dal Seno
490 64760879 Bernardo Dal Seno
    for (ispec, ispecpath) in ispeclist:
491 64760879 Bernardo Dal Seno
      ispec[INVALID_KEY] = None
492 64760879 Bernardo Dal Seno
      errs = cfg.VerifyConfig()
493 64760879 Bernardo Dal Seno
      self.assertTrue(len(errs) >= 1)
494 64760879 Bernardo Dal Seno
      self.assertTrue(_IsErrorInList(("%s has invalid ipolicy/%s" %
495 64760879 Bernardo Dal Seno
                                      (ipowner, ispecpath)), errs))
496 64760879 Bernardo Dal Seno
      del ispec[INVALID_KEY]
497 64760879 Bernardo Dal Seno
      errs = cfg.VerifyConfig()
498 64760879 Bernardo Dal Seno
      self.assertFalse(errs)
499 64760879 Bernardo Dal Seno
500 64760879 Bernardo Dal Seno
      for par in constants.ISPECS_PARAMETERS:
501 64760879 Bernardo Dal Seno
        hasoldv = par in ispec
502 64760879 Bernardo Dal Seno
        if hasoldv:
503 64760879 Bernardo Dal Seno
          oldv = ispec[par]
504 64760879 Bernardo Dal Seno
        ispec[par] = "blah"
505 64760879 Bernardo Dal Seno
        errs = cfg.VerifyConfig()
506 64760879 Bernardo Dal Seno
        self.assertTrue(len(errs) >= 1)
507 64760879 Bernardo Dal Seno
        self.assertTrue(_IsErrorInList(("%s has invalid ipolicy/%s" %
508 64760879 Bernardo Dal Seno
                                        (ipowner, ispecpath)), errs))
509 64760879 Bernardo Dal Seno
        if hasoldv:
510 64760879 Bernardo Dal Seno
          ispec[par] = oldv
511 64760879 Bernardo Dal Seno
        else:
512 64760879 Bernardo Dal Seno
          del ispec[par]
513 64760879 Bernardo Dal Seno
        errs = cfg.VerifyConfig()
514 64760879 Bernardo Dal Seno
        self.assertFalse(errs)
515 64760879 Bernardo Dal Seno
516 0f511c8a Bernardo Dal Seno
    if constants.ISPECS_MINMAX in ipolicy:
517 0f511c8a Bernardo Dal Seno
      # Test partial minmax specs
518 41044e04 Bernardo Dal Seno
      for minmax in ipolicy[constants.ISPECS_MINMAX]:
519 41044e04 Bernardo Dal Seno
        for key in constants.ISPECS_MINMAX_KEYS:
520 41044e04 Bernardo Dal Seno
          self.assertTrue(key in minmax)
521 41044e04 Bernardo Dal Seno
          ispec = minmax[key]
522 41044e04 Bernardo Dal Seno
          del minmax[key]
523 0f511c8a Bernardo Dal Seno
          errs = cfg.VerifyConfig()
524 0f511c8a Bernardo Dal Seno
          self.assertTrue(len(errs) >= 1)
525 41044e04 Bernardo Dal Seno
          self.assertTrue(_IsErrorInList("Missing instance specification",
526 0f511c8a Bernardo Dal Seno
                                         errs))
527 41044e04 Bernardo Dal Seno
          minmax[key] = ispec
528 41044e04 Bernardo Dal Seno
          for par in constants.ISPECS_PARAMETERS:
529 41044e04 Bernardo Dal Seno
            oldv = ispec[par]
530 41044e04 Bernardo Dal Seno
            del ispec[par]
531 41044e04 Bernardo Dal Seno
            errs = cfg.VerifyConfig()
532 41044e04 Bernardo Dal Seno
            self.assertTrue(len(errs) >= 1)
533 41044e04 Bernardo Dal Seno
            self.assertTrue(_IsErrorInList("Missing instance specs parameters",
534 41044e04 Bernardo Dal Seno
                                           errs))
535 41044e04 Bernardo Dal Seno
            ispec[par] = oldv
536 0f511c8a Bernardo Dal Seno
      errs = cfg.VerifyConfig()
537 0f511c8a Bernardo Dal Seno
      self.assertFalse(errs)
538 0f511c8a Bernardo Dal Seno
539 64760879 Bernardo Dal Seno
  def _TestVerifyConfigGroupIPolicy(self, groupinfo, cfg):
540 64760879 Bernardo Dal Seno
    old_ipolicy = groupinfo.ipolicy
541 64760879 Bernardo Dal Seno
    ipolicy = cfg.GetClusterInfo().SimpleFillIPolicy({})
542 64760879 Bernardo Dal Seno
    groupinfo.ipolicy = ipolicy
543 64760879 Bernardo Dal Seno
    # Test partial policies
544 64760879 Bernardo Dal Seno
    for key in constants.IPOLICY_ALL_KEYS:
545 64760879 Bernardo Dal Seno
      self.assertTrue(key in ipolicy)
546 64760879 Bernardo Dal Seno
      oldv = ipolicy[key]
547 64760879 Bernardo Dal Seno
      del ipolicy[key]
548 64760879 Bernardo Dal Seno
      errs = cfg.VerifyConfig()
549 64760879 Bernardo Dal Seno
      self.assertFalse(errs)
550 64760879 Bernardo Dal Seno
      ipolicy[key] = oldv
551 64760879 Bernardo Dal Seno
    groupinfo.ipolicy = old_ipolicy
552 64760879 Bernardo Dal Seno
553 64760879 Bernardo Dal Seno
  def _TestVerifyConfigClusterIPolicy(self, ipolicy, cfg):
554 64760879 Bernardo Dal Seno
    # Test partial policies
555 64760879 Bernardo Dal Seno
    for key in constants.IPOLICY_ALL_KEYS:
556 64760879 Bernardo Dal Seno
      self.assertTrue(key in ipolicy)
557 64760879 Bernardo Dal Seno
      oldv = ipolicy[key]
558 64760879 Bernardo Dal Seno
      del ipolicy[key]
559 64760879 Bernardo Dal Seno
      self.assertRaises(AssertionError, cfg.VerifyConfig)
560 64760879 Bernardo Dal Seno
      ipolicy[key] = oldv
561 0f511c8a Bernardo Dal Seno
    errs = cfg.VerifyConfig()
562 0f511c8a Bernardo Dal Seno
    self.assertFalse(errs)
563 0f511c8a Bernardo Dal Seno
    # Partial standard specs
564 0f511c8a Bernardo Dal Seno
    ispec = ipolicy[constants.ISPECS_STD]
565 0f511c8a Bernardo Dal Seno
    for par in constants.ISPECS_PARAMETERS:
566 0f511c8a Bernardo Dal Seno
      oldv = ispec[par]
567 0f511c8a Bernardo Dal Seno
      del ispec[par]
568 0f511c8a Bernardo Dal Seno
      errs = cfg.VerifyConfig()
569 0f511c8a Bernardo Dal Seno
      self.assertTrue(len(errs) >= 1)
570 0f511c8a Bernardo Dal Seno
      self.assertTrue(_IsErrorInList("Missing instance specs parameters",
571 0f511c8a Bernardo Dal Seno
                                     errs))
572 0f511c8a Bernardo Dal Seno
      ispec[par] = oldv
573 64760879 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
574 64760879 Bernardo Dal Seno
    self.assertFalse(errs)
575 64760879 Bernardo Dal Seno
576 3697def0 Bernardo Dal Seno
  def testVerifyConfig(self):
577 3697def0 Bernardo Dal Seno
    cfg = self._get_object()
578 3697def0 Bernardo Dal Seno
579 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
580 3697def0 Bernardo Dal Seno
    self.assertFalse(errs)
581 3697def0 Bernardo Dal Seno
582 3697def0 Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
583 3697def0 Bernardo Dal Seno
    key = list(constants.NDC_GLOBALS)[0]
584 3697def0 Bernardo Dal Seno
    node.ndparams[key] = constants.NDC_DEFAULTS[key]
585 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
586 3697def0 Bernardo Dal Seno
    self.assertTrue(len(errs) >= 1)
587 3697def0 Bernardo Dal Seno
    self.assertTrue(_IsErrorInList("has some global parameters set", errs))
588 3697def0 Bernardo Dal Seno
589 3697def0 Bernardo Dal Seno
    del node.ndparams[key]
590 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
591 3697def0 Bernardo Dal Seno
    self.assertFalse(errs)
592 3697def0 Bernardo Dal Seno
593 64760879 Bernardo Dal Seno
    cluster = cfg.GetClusterInfo()
594 64760879 Bernardo Dal Seno
    nodegroup = cfg.GetNodeGroup(cfg.GetNodeGroupList()[0])
595 64760879 Bernardo Dal Seno
    self._TestVerifyConfigIPolicy(cluster.ipolicy, "cluster", cfg, False)
596 64760879 Bernardo Dal Seno
    self._TestVerifyConfigClusterIPolicy(cluster.ipolicy, cfg)
597 64760879 Bernardo Dal Seno
    self._TestVerifyConfigIPolicy(nodegroup.ipolicy, nodegroup.name, cfg, True)
598 64760879 Bernardo Dal Seno
    self._TestVerifyConfigGroupIPolicy(nodegroup, cfg)
599 64760879 Bernardo Dal Seno
    nodegroup.ipolicy = cluster.SimpleFillIPolicy(nodegroup.ipolicy)
600 64760879 Bernardo Dal Seno
    self._TestVerifyConfigIPolicy(nodegroup.ipolicy, nodegroup.name, cfg, True)
601 64760879 Bernardo Dal Seno
602 def6577f Helga Velroyen
  # Tests for Ssconf helper functions
603 def6577f Helga Velroyen
  def testUnlockedGetHvparamsString(self):
604 def6577f Helga Velroyen
    hvparams = {"a": "A", "b": "B", "c": "C"}
605 def6577f Helga Velroyen
    hvname = "myhv"
606 def6577f Helga Velroyen
    cfg_writer = self._get_object()
607 def6577f Helga Velroyen
    cfg_writer._config_data = mock.Mock()
608 def6577f Helga Velroyen
    cfg_writer._config_data.cluster = mock.Mock()
609 def6577f Helga Velroyen
    cfg_writer._config_data.cluster.hvparams = {hvname: hvparams}
610 def6577f Helga Velroyen
611 def6577f Helga Velroyen
    result = cfg_writer._UnlockedGetHvparamsString(hvname)
612 def6577f Helga Velroyen
613 def6577f Helga Velroyen
    self.assertTrue("a=A" in result)
614 def6577f Helga Velroyen
    lines = [line for line in result.split('\n') if line != '']
615 def6577f Helga Velroyen
    self.assertEqual(len(hvparams.keys()), len(lines))
616 def6577f Helga Velroyen
617 def6577f Helga Velroyen
  def testExtendByAllHvparamsStrings(self):
618 def6577f Helga Velroyen
    all_hvparams = {constants.HT_XEN_PVM: "foo"}
619 def6577f Helga Velroyen
    ssconf_values = {}
620 def6577f Helga Velroyen
    cfg_writer = self._get_object()
621 def6577f Helga Velroyen
622 def6577f Helga Velroyen
    cfg_writer._ExtendByAllHvparamsStrings(ssconf_values, all_hvparams)
623 def6577f Helga Velroyen
624 def6577f Helga Velroyen
    expected_key = constants.SS_HVPARAMS_PREF + constants.HT_XEN_PVM
625 def6577f Helga Velroyen
    self.assertTrue(expected_key in ssconf_values)
626 def6577f Helga Velroyen
627 3697def0 Bernardo Dal Seno
628 3697def0 Bernardo Dal Seno
def _IsErrorInList(err_str, err_list):
629 3697def0 Bernardo Dal Seno
  return any(map(lambda e: err_str in e, err_list))
630 3697def0 Bernardo Dal Seno
631 e00fb268 Iustin Pop
632 28a7318f Iustin Pop
class TestTRM(unittest.TestCase):
633 28a7318f Iustin Pop
  EC_ID = 1
634 28a7318f Iustin Pop
635 28a7318f Iustin Pop
  def testEmpty(self):
636 28a7318f Iustin Pop
    t = TemporaryReservationManager()
637 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
638 28a7318f Iustin Pop
    self.assertFalse(t.Reserved(self.EC_ID))
639 28a7318f Iustin Pop
    self.assertTrue(t.Reserved("a"))
640 28a7318f Iustin Pop
    self.assertEqual(len(t.GetReserved()), 1)
641 28a7318f Iustin Pop
642 28a7318f Iustin Pop
  def testDuplicate(self):
643 28a7318f Iustin Pop
    t = TemporaryReservationManager()
644 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
645 28a7318f Iustin Pop
    self.assertRaises(errors.ReservationError, t.Reserve, 2, "a")
646 28a7318f Iustin Pop
    t.DropECReservations(self.EC_ID)
647 28a7318f Iustin Pop
    self.assertFalse(t.Reserved("a"))
648 28a7318f Iustin Pop
649 28a7318f Iustin Pop
650 82c54b5b Michael Hanselmann
class TestCheckInstanceDiskIvNames(unittest.TestCase):
651 82c54b5b Michael Hanselmann
  @staticmethod
652 82c54b5b Michael Hanselmann
  def _MakeDisks(names):
653 82c54b5b Michael Hanselmann
    return [objects.Disk(iv_name=name) for name in names]
654 82c54b5b Michael Hanselmann
655 82c54b5b Michael Hanselmann
  def testNoError(self):
656 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/0", "disk/1"])
657 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
658 22b7f6f8 Thomas Thrainer
    instance._UpdateIvNames(0, disks)
659 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
660 82c54b5b Michael Hanselmann
661 82c54b5b Michael Hanselmann
  def testWrongNames(self):
662 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/1", "disk/3", "disk/2"])
663 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [
664 82c54b5b Michael Hanselmann
      (0, "disk/0", "disk/1"),
665 82c54b5b Michael Hanselmann
      (1, "disk/1", "disk/3"),
666 82c54b5b Michael Hanselmann
      ])
667 82c54b5b Michael Hanselmann
668 82c54b5b Michael Hanselmann
    # Fix names
669 22b7f6f8 Thomas Thrainer
    instance._UpdateIvNames(0, disks)
670 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
671 82c54b5b Michael Hanselmann
672 82c54b5b Michael Hanselmann
673 2f96c43c Michael Hanselmann
if __name__ == "__main__":
674 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()