Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.config_unittest.py @ 91c17910

History | View | Annotate | Download (16.3 kB)

1 e00fb268 Iustin Pop
#!/usr/bin/python
2 e00fb268 Iustin Pop
#
3 e00fb268 Iustin Pop
4 432e8e2f Iustin Pop
# Copyright (C) 2006, 2007, 2010, 2011, 2012 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 time
28 e00fb268 Iustin Pop
import tempfile
29 e00fb268 Iustin Pop
import os.path
30 e00fb268 Iustin Pop
import socket
31 54c31fd3 Michael Hanselmann
import operator
32 54c31fd3 Michael Hanselmann
import itertools
33 e00fb268 Iustin Pop
34 c666722f Oleksiy Mishchenko
from ganeti import bootstrap
35 e00fb268 Iustin Pop
from ganeti import config
36 c666722f Oleksiy Mishchenko
from ganeti import constants
37 c666722f Oleksiy Mishchenko
from ganeti import errors
38 e00fb268 Iustin Pop
from ganeti import objects
39 6f1bebf9 Michael Hanselmann
from ganeti import utils
40 a744b676 Manuel Franceschini
from ganeti import netutils
41 54c31fd3 Michael Hanselmann
from ganeti import compat
42 82c54b5b Michael Hanselmann
from ganeti import cmdlib
43 e00fb268 Iustin Pop
44 28a7318f Iustin Pop
from ganeti.config import TemporaryReservationManager
45 28a7318f Iustin Pop
46 25231ec5 Michael Hanselmann
import testutils
47 e60c73a1 René Nussbaumer
import mocks
48 e60c73a1 René Nussbaumer
49 e60c73a1 René Nussbaumer
50 e60c73a1 René Nussbaumer
def _StubGetEntResolver():
51 e60c73a1 René Nussbaumer
  return mocks.FakeGetentResolver()
52 25231ec5 Michael Hanselmann
53 e00fb268 Iustin Pop
54 e00fb268 Iustin Pop
class TestConfigRunner(unittest.TestCase):
55 e00fb268 Iustin Pop
  """Testing case for HooksRunner"""
56 e00fb268 Iustin Pop
  def setUp(self):
57 e00fb268 Iustin Pop
    fd, self.cfg_file = tempfile.mkstemp()
58 e00fb268 Iustin Pop
    os.close(fd)
59 c666722f Oleksiy Mishchenko
    self._init_cluster(self.cfg_file)
60 e00fb268 Iustin Pop
61 e00fb268 Iustin Pop
  def tearDown(self):
62 e00fb268 Iustin Pop
    try:
63 e00fb268 Iustin Pop
      os.unlink(self.cfg_file)
64 e00fb268 Iustin Pop
    except OSError:
65 e00fb268 Iustin Pop
      pass
66 e00fb268 Iustin Pop
67 e00fb268 Iustin Pop
  def _get_object(self):
68 e00fb268 Iustin Pop
    """Returns a instance of ConfigWriter"""
69 e60c73a1 René Nussbaumer
    cfg = config.ConfigWriter(cfg_file=self.cfg_file, offline=True,
70 e60c73a1 René Nussbaumer
                              _getents=_StubGetEntResolver)
71 e00fb268 Iustin Pop
    return cfg
72 e00fb268 Iustin Pop
73 e00fb268 Iustin Pop
  def _init_cluster(self, cfg):
74 e00fb268 Iustin Pop
    """Initializes the cfg object"""
75 b705c7a6 Manuel Franceschini
    me = netutils.Hostname()
76 9769bb78 Manuel Franceschini
    ip = constants.IP4_ADDRESS_LOCALHOST
77 3697def0 Bernardo Dal Seno
    # master_ip must not conflict with the node ip address
78 3697def0 Bernardo Dal Seno
    master_ip = "127.0.0.2"
79 f6bd6e98 Michael Hanselmann
80 b9eeeb02 Michael Hanselmann
    cluster_config = objects.Cluster(
81 b9eeeb02 Michael Hanselmann
      serial_no=1,
82 b9eeeb02 Michael Hanselmann
      rsahostkeypub="",
83 b9eeeb02 Michael Hanselmann
      highest_used_port=(constants.FIRST_DRBD_PORT - 1),
84 b9eeeb02 Michael Hanselmann
      mac_prefix="aa:00:00",
85 b9eeeb02 Michael Hanselmann
      volume_group_name="xenvg",
86 9e33896b Luca Bigliardi
      drbd_usermode_helper="/bin/true",
87 c66f21a4 Guido Trotter
      nicparams={constants.PP_DEFAULT: constants.NICC_DEFAULTS},
88 5768e6a6 René Nussbaumer
      ndparams=constants.NDC_DEFAULTS,
89 b9eeeb02 Michael Hanselmann
      tcpudp_port_pool=set(),
90 066f465d Guido Trotter
      enabled_hypervisors=[constants.HT_FAKE],
91 f6bd6e98 Michael Hanselmann
      master_node=me.name,
92 3697def0 Bernardo Dal Seno
      master_ip=master_ip,
93 f6bd6e98 Michael Hanselmann
      master_netdev=constants.DEFAULT_BRIDGE,
94 f6bd6e98 Michael Hanselmann
      cluster_name="cluster.local",
95 f6bd6e98 Michael Hanselmann
      file_storage_dir="/tmp",
96 93be53da Balazs Lecz
      uid_pool=[],
97 b9eeeb02 Michael Hanselmann
      )
98 f6bd6e98 Michael Hanselmann
99 f6bd6e98 Michael Hanselmann
    master_node_config = objects.Node(name=me.name,
100 f6bd6e98 Michael Hanselmann
                                      primary_ip=me.ip,
101 36b8c2c1 Michael Hanselmann
                                      secondary_ip=ip,
102 4a89c54a Iustin Pop
                                      serial_no=1,
103 4a89c54a Iustin Pop
                                      master_candidate=True)
104 f6bd6e98 Michael Hanselmann
105 c666722f Oleksiy Mishchenko
    bootstrap.InitConfig(constants.CONFIG_VERSION,
106 c666722f Oleksiy Mishchenko
                         cluster_config, master_node_config, self.cfg_file)
107 e00fb268 Iustin Pop
108 e00fb268 Iustin Pop
  def _create_instance(self):
109 e00fb268 Iustin Pop
    """Create and return an instance object"""
110 4a89c54a Iustin Pop
    inst = objects.Instance(name="test.example.com", 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 5768e6a6 René Nussbaumer
        }
246 5768e6a6 René Nussbaumer
247 5768e6a6 René Nussbaumer
    cfg = self._get_object()
248 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
249 5768e6a6 René Nussbaumer
    node.ndparams = my_ndparams
250 5768e6a6 René Nussbaumer
    cfg.Update(node, None)
251 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), my_ndparams)
252 5768e6a6 René Nussbaumer
253 0ea11dcb Bernardo Dal Seno
  def testGetNdParamsInheritance(self):
254 0ea11dcb Bernardo Dal Seno
    node_ndparams = {
255 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
256 0ea11dcb Bernardo Dal Seno
      }
257 0ea11dcb Bernardo Dal Seno
    group_ndparams = {
258 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
259 0ea11dcb Bernardo Dal Seno
      }
260 0ea11dcb Bernardo Dal Seno
    expected_ndparams = {
261 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
262 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
263 0ea11dcb Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE:
264 0ea11dcb Bernardo Dal Seno
        constants.NDC_DEFAULTS[constants.ND_EXCLUSIVE_STORAGE],
265 0ea11dcb Bernardo Dal Seno
      }
266 0ea11dcb Bernardo Dal Seno
    cfg = self._get_object()
267 0ea11dcb Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
268 0ea11dcb Bernardo Dal Seno
    node.ndparams = node_ndparams
269 0ea11dcb Bernardo Dal Seno
    cfg.Update(node, None)
270 0ea11dcb Bernardo Dal Seno
    group = cfg.GetNodeGroup(node.group)
271 0ea11dcb Bernardo Dal Seno
    group.ndparams = group_ndparams
272 0ea11dcb Bernardo Dal Seno
    cfg.Update(group, None)
273 0ea11dcb Bernardo Dal Seno
    self.assertEqual(cfg.GetNdParams(node), expected_ndparams)
274 0ea11dcb Bernardo Dal Seno
275 2bac48c4 Adeodato Simo
  def testAddGroupFillsFieldsIfMissing(self):
276 2bac48c4 Adeodato Simo
    cfg = self._get_object()
277 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[])
278 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
279 2bac48c4 Adeodato Simo
    self.assert_(utils.UUID_RE.match(group.uuid))
280 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_PREFERRED, group.alloc_policy)
281 2bac48c4 Adeodato Simo
282 2bac48c4 Adeodato Simo
  def testAddGroupPreservesFields(self):
283 2bac48c4 Adeodato Simo
    cfg = self._get_object()
284 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
285 2bac48c4 Adeodato Simo
                              alloc_policy=constants.ALLOC_POLICY_LAST_RESORT)
286 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
287 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_LAST_RESORT, group.alloc_policy)
288 2bac48c4 Adeodato Simo
289 2bac48c4 Adeodato Simo
  def testAddGroupDoesNotPreserveFields(self):
290 2bac48c4 Adeodato Simo
    cfg = self._get_object()
291 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
292 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
293 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
294 2bac48c4 Adeodato Simo
    self.assertEqual(1, group.serial_no)
295 2bac48c4 Adeodato Simo
    self.assert_(group.ctime > 1200000000)
296 2bac48c4 Adeodato Simo
    self.assert_(group.mtime > 1200000000)
297 2bac48c4 Adeodato Simo
298 2bac48c4 Adeodato Simo
  def testAddGroupCanSkipUUIDCheck(self):
299 2bac48c4 Adeodato Simo
    cfg = self._get_object()
300 2bac48c4 Adeodato Simo
    uuid = cfg.GenerateUniqueID("my-job")
301 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[], uuid=uuid,
302 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
303 2bac48c4 Adeodato Simo
304 2bac48c4 Adeodato Simo
    self.assertRaises(errors.ConfigurationError,
305 2bac48c4 Adeodato Simo
                      cfg.AddNodeGroup, group, "my-job")
306 2bac48c4 Adeodato Simo
307 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job", check_uuid=False) # Does not raise.
308 2bac48c4 Adeodato Simo
    self.assertEqual(uuid, group.uuid)
309 2bac48c4 Adeodato Simo
310 54c31fd3 Michael Hanselmann
  def testAssignGroupNodes(self):
311 54c31fd3 Michael Hanselmann
    me = netutils.Hostname()
312 54c31fd3 Michael Hanselmann
    cfg = self._get_object()
313 54c31fd3 Michael Hanselmann
314 54c31fd3 Michael Hanselmann
    # Create two groups
315 54c31fd3 Michael Hanselmann
    grp1 = objects.NodeGroup(name="grp1", members=[],
316 54c31fd3 Michael Hanselmann
                             uuid="2f2fadf7-2a70-4a23-9ab5-2568c252032c")
317 54c31fd3 Michael Hanselmann
    grp1_serial = 1
318 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp1, "job")
319 54c31fd3 Michael Hanselmann
320 54c31fd3 Michael Hanselmann
    grp2 = objects.NodeGroup(name="grp2", members=[],
321 54c31fd3 Michael Hanselmann
                             uuid="798d0de3-680f-4a0e-b29a-0f54f693b3f1")
322 54c31fd3 Michael Hanselmann
    grp2_serial = 1
323 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp2, "job")
324 54c31fd3 Michael Hanselmann
    self.assertEqual(set(map(operator.attrgetter("name"),
325 54c31fd3 Michael Hanselmann
                             cfg.GetAllNodeGroupsInfo().values())),
326 54c31fd3 Michael Hanselmann
                     set(["grp1", "grp2", constants.INITIAL_NODE_GROUP_NAME]))
327 54c31fd3 Michael Hanselmann
328 54c31fd3 Michael Hanselmann
    # No-op
329 54c31fd3 Michael Hanselmann
    cluster_serial = cfg.GetClusterInfo().serial_no
330 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
331 54c31fd3 Michael Hanselmann
    cluster_serial += 1
332 54c31fd3 Michael Hanselmann
333 54c31fd3 Michael Hanselmann
    # Create two nodes
334 54c31fd3 Michael Hanselmann
    node1 = objects.Node(name="node1", group=grp1.uuid, ndparams={})
335 54c31fd3 Michael Hanselmann
    node1_serial = 1
336 54c31fd3 Michael Hanselmann
    node2 = objects.Node(name="node2", group=grp2.uuid, ndparams={})
337 54c31fd3 Michael Hanselmann
    node2_serial = 1
338 54c31fd3 Michael Hanselmann
    cfg.AddNode(node1, "job")
339 54c31fd3 Michael Hanselmann
    cfg.AddNode(node2, "job")
340 54c31fd3 Michael Hanselmann
    cluster_serial += 2
341 54c31fd3 Michael Hanselmann
    self.assertEqual(set(cfg.GetNodeList()), set(["node1", "node2", me.name]))
342 54c31fd3 Michael Hanselmann
343 54c31fd3 Michael Hanselmann
    def _VerifySerials():
344 54c31fd3 Michael Hanselmann
      self.assertEqual(cfg.GetClusterInfo().serial_no, cluster_serial)
345 54c31fd3 Michael Hanselmann
      self.assertEqual(node1.serial_no, node1_serial)
346 54c31fd3 Michael Hanselmann
      self.assertEqual(node2.serial_no, node2_serial)
347 54c31fd3 Michael Hanselmann
      self.assertEqual(grp1.serial_no, grp1_serial)
348 54c31fd3 Michael Hanselmann
      self.assertEqual(grp2.serial_no, grp2_serial)
349 54c31fd3 Michael Hanselmann
350 54c31fd3 Michael Hanselmann
    _VerifySerials()
351 54c31fd3 Michael Hanselmann
352 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
353 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
354 54c31fd3 Michael Hanselmann
355 54c31fd3 Michael Hanselmann
    # Check invalid nodes and groups
356 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
357 54c31fd3 Michael Hanselmann
      ("unknown.node.example.com", grp2.uuid),
358 54c31fd3 Michael Hanselmann
      ])
359 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
360 54c31fd3 Michael Hanselmann
      (node1.name, "unknown-uuid"),
361 54c31fd3 Michael Hanselmann
      ])
362 54c31fd3 Michael Hanselmann
363 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
364 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
365 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
366 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
367 54c31fd3 Michael Hanselmann
368 54c31fd3 Michael Hanselmann
    # Another no-op
369 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
370 54c31fd3 Michael Hanselmann
    cluster_serial += 1
371 54c31fd3 Michael Hanselmann
    _VerifySerials()
372 54c31fd3 Michael Hanselmann
373 54c31fd3 Michael Hanselmann
    # Assign to the same group (should be a no-op)
374 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
375 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
376 54c31fd3 Michael Hanselmann
      (node2.name, grp2.uuid),
377 54c31fd3 Michael Hanselmann
      ])
378 54c31fd3 Michael Hanselmann
    cluster_serial += 1
379 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
380 54c31fd3 Michael Hanselmann
    _VerifySerials()
381 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
382 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
383 54c31fd3 Michael Hanselmann
384 54c31fd3 Michael Hanselmann
    # Assign node 2 to group 1
385 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
386 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
387 54c31fd3 Michael Hanselmann
      (node2.name, grp1.uuid),
388 54c31fd3 Michael Hanselmann
      ])
389 54c31fd3 Michael Hanselmann
    cluster_serial += 1
390 54c31fd3 Michael Hanselmann
    node2_serial += 1
391 54c31fd3 Michael Hanselmann
    grp1_serial += 1
392 54c31fd3 Michael Hanselmann
    grp2_serial += 1
393 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
394 54c31fd3 Michael Hanselmann
    _VerifySerials()
395 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1", "node2"]))
396 54c31fd3 Michael Hanselmann
    self.assertFalse(grp2.members)
397 54c31fd3 Michael Hanselmann
398 54c31fd3 Michael Hanselmann
    # And assign both nodes to group 2
399 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
400 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
401 54c31fd3 Michael Hanselmann
    self.assertNotEqual(grp1.uuid, grp2.uuid)
402 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
403 54c31fd3 Michael Hanselmann
      (node1.name, grp2.uuid),
404 54c31fd3 Michael Hanselmann
      (node2.name, grp2.uuid),
405 54c31fd3 Michael Hanselmann
      ])
406 54c31fd3 Michael Hanselmann
    cluster_serial += 1
407 54c31fd3 Michael Hanselmann
    node1_serial += 1
408 54c31fd3 Michael Hanselmann
    node2_serial += 1
409 54c31fd3 Michael Hanselmann
    grp1_serial += 1
410 54c31fd3 Michael Hanselmann
    grp2_serial += 1
411 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp2.uuid)
412 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
413 54c31fd3 Michael Hanselmann
    _VerifySerials()
414 54c31fd3 Michael Hanselmann
    self.assertFalse(grp1.members)
415 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node1", "node2"]))
416 54c31fd3 Michael Hanselmann
417 54c31fd3 Michael Hanselmann
    # Destructive tests
418 54c31fd3 Michael Hanselmann
    orig_group = node2.group
419 54c31fd3 Michael Hanselmann
    try:
420 54c31fd3 Michael Hanselmann
      other_uuid = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
421 54c31fd3 Michael Hanselmann
      assert compat.all(node.group != other_uuid
422 54c31fd3 Michael Hanselmann
                        for node in cfg.GetAllNodesInfo().values())
423 54c31fd3 Michael Hanselmann
      node2.group = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
424 54c31fd3 Michael Hanselmann
      self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
425 54c31fd3 Michael Hanselmann
        ("node2", grp2.uuid),
426 54c31fd3 Michael Hanselmann
        ])
427 54c31fd3 Michael Hanselmann
      _VerifySerials()
428 54c31fd3 Michael Hanselmann
    finally:
429 54c31fd3 Michael Hanselmann
      node2.group = orig_group
430 54c31fd3 Michael Hanselmann
431 3697def0 Bernardo Dal Seno
  def testVerifyConfig(self):
432 3697def0 Bernardo Dal Seno
    cfg = self._get_object()
433 3697def0 Bernardo Dal Seno
434 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
435 3697def0 Bernardo Dal Seno
    self.assertFalse(errs)
436 3697def0 Bernardo Dal Seno
437 3697def0 Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
438 3697def0 Bernardo Dal Seno
    key = list(constants.NDC_GLOBALS)[0]
439 3697def0 Bernardo Dal Seno
    node.ndparams[key] = constants.NDC_DEFAULTS[key]
440 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
441 3697def0 Bernardo Dal Seno
    self.assertTrue(len(errs) >= 1)
442 3697def0 Bernardo Dal Seno
    self.assertTrue(_IsErrorInList("has some global parameters set", errs))
443 3697def0 Bernardo Dal Seno
444 3697def0 Bernardo Dal Seno
    del node.ndparams[key]
445 3697def0 Bernardo Dal Seno
    errs = cfg.VerifyConfig()
446 3697def0 Bernardo Dal Seno
    self.assertFalse(errs)
447 3697def0 Bernardo Dal Seno
448 3697def0 Bernardo Dal Seno
449 3697def0 Bernardo Dal Seno
def _IsErrorInList(err_str, err_list):
450 3697def0 Bernardo Dal Seno
  return any(map(lambda e: err_str in e, err_list))
451 3697def0 Bernardo Dal Seno
452 e00fb268 Iustin Pop
453 28a7318f Iustin Pop
class TestTRM(unittest.TestCase):
454 28a7318f Iustin Pop
  EC_ID = 1
455 28a7318f Iustin Pop
456 28a7318f Iustin Pop
  def testEmpty(self):
457 28a7318f Iustin Pop
    t = TemporaryReservationManager()
458 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
459 28a7318f Iustin Pop
    self.assertFalse(t.Reserved(self.EC_ID))
460 28a7318f Iustin Pop
    self.assertTrue(t.Reserved("a"))
461 28a7318f Iustin Pop
    self.assertEqual(len(t.GetReserved()), 1)
462 28a7318f Iustin Pop
463 28a7318f Iustin Pop
  def testDuplicate(self):
464 28a7318f Iustin Pop
    t = TemporaryReservationManager()
465 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
466 28a7318f Iustin Pop
    self.assertRaises(errors.ReservationError, t.Reserve, 2, "a")
467 28a7318f Iustin Pop
    t.DropECReservations(self.EC_ID)
468 28a7318f Iustin Pop
    self.assertFalse(t.Reserved("a"))
469 28a7318f Iustin Pop
470 28a7318f Iustin Pop
471 82c54b5b Michael Hanselmann
class TestCheckInstanceDiskIvNames(unittest.TestCase):
472 82c54b5b Michael Hanselmann
  @staticmethod
473 82c54b5b Michael Hanselmann
  def _MakeDisks(names):
474 82c54b5b Michael Hanselmann
    return [objects.Disk(iv_name=name) for name in names]
475 82c54b5b Michael Hanselmann
476 82c54b5b Michael Hanselmann
  def testNoError(self):
477 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/0", "disk/1"])
478 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
479 82c54b5b Michael Hanselmann
    cmdlib._UpdateIvNames(0, disks)
480 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
481 82c54b5b Michael Hanselmann
482 82c54b5b Michael Hanselmann
  def testWrongNames(self):
483 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/1", "disk/3", "disk/2"])
484 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [
485 82c54b5b Michael Hanselmann
      (0, "disk/0", "disk/1"),
486 82c54b5b Michael Hanselmann
      (1, "disk/1", "disk/3"),
487 82c54b5b Michael Hanselmann
      ])
488 82c54b5b Michael Hanselmann
489 82c54b5b Michael Hanselmann
    # Fix names
490 82c54b5b Michael Hanselmann
    cmdlib._UpdateIvNames(0, disks)
491 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
492 82c54b5b Michael Hanselmann
493 82c54b5b Michael Hanselmann
494 2f96c43c Michael Hanselmann
if __name__ == "__main__":
495 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()