Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.config_unittest.py @ 850c53f1

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