Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.config_unittest.py @ 06c2fb4a

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