Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.config_unittest.py @ 0ad7f5d8

History | View | Annotate | Download (14.2 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 f6bd6e98 Michael Hanselmann
78 b9eeeb02 Michael Hanselmann
    cluster_config = objects.Cluster(
79 b9eeeb02 Michael Hanselmann
      serial_no=1,
80 b9eeeb02 Michael Hanselmann
      rsahostkeypub="",
81 b9eeeb02 Michael Hanselmann
      highest_used_port=(constants.FIRST_DRBD_PORT - 1),
82 b9eeeb02 Michael Hanselmann
      mac_prefix="aa:00:00",
83 b9eeeb02 Michael Hanselmann
      volume_group_name="xenvg",
84 9e33896b Luca Bigliardi
      drbd_usermode_helper="/bin/true",
85 c66f21a4 Guido Trotter
      nicparams={constants.PP_DEFAULT: constants.NICC_DEFAULTS},
86 5768e6a6 René Nussbaumer
      ndparams=constants.NDC_DEFAULTS,
87 b9eeeb02 Michael Hanselmann
      tcpudp_port_pool=set(),
88 066f465d Guido Trotter
      enabled_hypervisors=[constants.HT_FAKE],
89 f6bd6e98 Michael Hanselmann
      master_node=me.name,
90 f6bd6e98 Michael Hanselmann
      master_ip="127.0.0.1",
91 f6bd6e98 Michael Hanselmann
      master_netdev=constants.DEFAULT_BRIDGE,
92 f6bd6e98 Michael Hanselmann
      cluster_name="cluster.local",
93 f6bd6e98 Michael Hanselmann
      file_storage_dir="/tmp",
94 93be53da Balazs Lecz
      uid_pool=[],
95 b9eeeb02 Michael Hanselmann
      )
96 f6bd6e98 Michael Hanselmann
97 f6bd6e98 Michael Hanselmann
    master_node_config = objects.Node(name=me.name,
98 f6bd6e98 Michael Hanselmann
                                      primary_ip=me.ip,
99 36b8c2c1 Michael Hanselmann
                                      secondary_ip=ip,
100 4a89c54a Iustin Pop
                                      serial_no=1,
101 4a89c54a Iustin Pop
                                      master_candidate=True)
102 f6bd6e98 Michael Hanselmann
103 c666722f Oleksiy Mishchenko
    bootstrap.InitConfig(constants.CONFIG_VERSION,
104 c666722f Oleksiy Mishchenko
                         cluster_config, master_node_config, self.cfg_file)
105 e00fb268 Iustin Pop
106 e00fb268 Iustin Pop
  def _create_instance(self):
107 e00fb268 Iustin Pop
    """Create and return an instance object"""
108 4a89c54a Iustin Pop
    inst = objects.Instance(name="test.example.com", disks=[], nics=[],
109 4a89c54a Iustin Pop
                            disk_template=constants.DT_DISKLESS,
110 4a89c54a Iustin Pop
                            primary_node=self._get_object().GetMasterNode())
111 e00fb268 Iustin Pop
    return inst
112 e00fb268 Iustin Pop
113 e00fb268 Iustin Pop
  def testEmpty(self):
114 e00fb268 Iustin Pop
    """Test instantiate config object"""
115 e00fb268 Iustin Pop
    self._get_object()
116 e00fb268 Iustin Pop
117 e00fb268 Iustin Pop
  def testInit(self):
118 e00fb268 Iustin Pop
    """Test initialize the config file"""
119 e00fb268 Iustin Pop
    cfg = self._get_object()
120 e00fb268 Iustin Pop
    self.failUnlessEqual(1, len(cfg.GetNodeList()))
121 e00fb268 Iustin Pop
    self.failUnlessEqual(0, len(cfg.GetInstanceList()))
122 e00fb268 Iustin Pop
123 e00fb268 Iustin Pop
  def testUpdateCluster(self):
124 e00fb268 Iustin Pop
    """Test updates on the cluster object"""
125 e00fb268 Iustin Pop
    cfg = self._get_object()
126 e00fb268 Iustin Pop
    # construct a fake cluster object
127 e00fb268 Iustin Pop
    fake_cl = objects.Cluster()
128 e00fb268 Iustin Pop
    # fail if we didn't read the config
129 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
130 e00fb268 Iustin Pop
131 e00fb268 Iustin Pop
    cl = cfg.GetClusterInfo()
132 e00fb268 Iustin Pop
    # first pass, must not fail
133 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
134 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
135 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
136 e00fb268 Iustin Pop
    # but the fake_cl update should still fail
137 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
138 e00fb268 Iustin Pop
139 e00fb268 Iustin Pop
  def testUpdateNode(self):
140 e00fb268 Iustin Pop
    """Test updates on one node object"""
141 e00fb268 Iustin Pop
    cfg = self._get_object()
142 e00fb268 Iustin Pop
    # construct a fake node
143 e00fb268 Iustin Pop
    fake_node = objects.Node()
144 e00fb268 Iustin Pop
    # fail if we didn't read the config
145 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
146 a4eae71f Michael Hanselmann
                          None)
147 e00fb268 Iustin Pop
148 e00fb268 Iustin Pop
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
149 e00fb268 Iustin Pop
    # first pass, must not fail
150 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
151 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
152 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
153 e00fb268 Iustin Pop
    # but the fake_node update should still fail
154 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
155 a4eae71f Michael Hanselmann
                          None)
156 e00fb268 Iustin Pop
157 e00fb268 Iustin Pop
  def testUpdateInstance(self):
158 e00fb268 Iustin Pop
    """Test updates on one instance object"""
159 e00fb268 Iustin Pop
    cfg = self._get_object()
160 e00fb268 Iustin Pop
    # construct a fake instance
161 e00fb268 Iustin Pop
    inst = self._create_instance()
162 e00fb268 Iustin Pop
    fake_instance = objects.Instance()
163 e00fb268 Iustin Pop
    # fail if we didn't read the config
164 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
165 a4eae71f Michael Hanselmann
                          None)
166 e00fb268 Iustin Pop
167 0debfb35 Guido Trotter
    cfg.AddInstance(inst, "my-job")
168 e00fb268 Iustin Pop
    instance = cfg.GetInstanceInfo(cfg.GetInstanceList()[0])
169 e00fb268 Iustin Pop
    # first pass, must not fail
170 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
171 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
172 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
173 e00fb268 Iustin Pop
    # but the fake_instance update should still fail
174 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
175 a4eae71f Michael Hanselmann
                          None)
176 e00fb268 Iustin Pop
177 255e19d4 Guido Trotter
  def testNICParameterSyntaxCheck(self):
178 255e19d4 Guido Trotter
    """Test the NIC's CheckParameterSyntax function"""
179 255e19d4 Guido Trotter
    mode = constants.NIC_MODE
180 255e19d4 Guido Trotter
    link = constants.NIC_LINK
181 255e19d4 Guido Trotter
    m_bridged = constants.NIC_MODE_BRIDGED
182 255e19d4 Guido Trotter
    m_routed = constants.NIC_MODE_ROUTED
183 255e19d4 Guido Trotter
    CheckSyntax = objects.NIC.CheckParameterSyntax
184 255e19d4 Guido Trotter
185 255e19d4 Guido Trotter
    CheckSyntax(constants.NICC_DEFAULTS)
186 8c114acd Michael Hanselmann
    CheckSyntax({mode: m_bridged, link: "br1"})
187 8c114acd Michael Hanselmann
    CheckSyntax({mode: m_routed, link: "default"})
188 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
189 8c114acd Michael Hanselmann
                      CheckSyntax, {mode: "000invalid", link: "any"})
190 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
191 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: None})
192 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
193 8c114acd Michael Hanselmann
                      CheckSyntax, {mode: m_bridged, link: ""})
194 255e19d4 Guido Trotter
195 5768e6a6 René Nussbaumer
  def testGetNdParamsDefault(self):
196 5768e6a6 René Nussbaumer
    cfg = self._get_object()
197 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
198 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), constants.NDC_DEFAULTS)
199 5768e6a6 René Nussbaumer
200 5768e6a6 René Nussbaumer
  def testGetNdParamsModifiedNode(self):
201 5768e6a6 René Nussbaumer
    my_ndparams = {
202 5768e6a6 René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
203 432e8e2f Iustin Pop
        constants.ND_SPINDLE_COUNT: 1,
204 0ea11dcb Bernardo Dal Seno
        constants.ND_EXCLUSIVE_STORAGE: False,
205 5768e6a6 René Nussbaumer
        }
206 5768e6a6 René Nussbaumer
207 5768e6a6 René Nussbaumer
    cfg = self._get_object()
208 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
209 5768e6a6 René Nussbaumer
    node.ndparams = my_ndparams
210 5768e6a6 René Nussbaumer
    cfg.Update(node, None)
211 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), my_ndparams)
212 5768e6a6 René Nussbaumer
213 0ea11dcb Bernardo Dal Seno
  def testGetNdParamsInheritance(self):
214 0ea11dcb Bernardo Dal Seno
    node_ndparams = {
215 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
216 0ea11dcb Bernardo Dal Seno
      }
217 0ea11dcb Bernardo Dal Seno
    group_ndparams = {
218 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
219 0ea11dcb Bernardo Dal Seno
      }
220 0ea11dcb Bernardo Dal Seno
    expected_ndparams = {
221 0ea11dcb Bernardo Dal Seno
      constants.ND_OOB_PROGRAM: "/bin/node-oob",
222 0ea11dcb Bernardo Dal Seno
      constants.ND_SPINDLE_COUNT: 10,
223 0ea11dcb Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE:
224 0ea11dcb Bernardo Dal Seno
        constants.NDC_DEFAULTS[constants.ND_EXCLUSIVE_STORAGE],
225 0ea11dcb Bernardo Dal Seno
      }
226 0ea11dcb Bernardo Dal Seno
    cfg = self._get_object()
227 0ea11dcb Bernardo Dal Seno
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
228 0ea11dcb Bernardo Dal Seno
    node.ndparams = node_ndparams
229 0ea11dcb Bernardo Dal Seno
    cfg.Update(node, None)
230 0ea11dcb Bernardo Dal Seno
    group = cfg.GetNodeGroup(node.group)
231 0ea11dcb Bernardo Dal Seno
    group.ndparams = group_ndparams
232 0ea11dcb Bernardo Dal Seno
    cfg.Update(group, None)
233 0ea11dcb Bernardo Dal Seno
    self.assertEqual(cfg.GetNdParams(node), expected_ndparams)
234 0ea11dcb Bernardo Dal Seno
235 2bac48c4 Adeodato Simo
  def testAddGroupFillsFieldsIfMissing(self):
236 2bac48c4 Adeodato Simo
    cfg = self._get_object()
237 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[])
238 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
239 2bac48c4 Adeodato Simo
    self.assert_(utils.UUID_RE.match(group.uuid))
240 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_PREFERRED, group.alloc_policy)
241 2bac48c4 Adeodato Simo
242 2bac48c4 Adeodato Simo
  def testAddGroupPreservesFields(self):
243 2bac48c4 Adeodato Simo
    cfg = self._get_object()
244 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
245 2bac48c4 Adeodato Simo
                              alloc_policy=constants.ALLOC_POLICY_LAST_RESORT)
246 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
247 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_LAST_RESORT, group.alloc_policy)
248 2bac48c4 Adeodato Simo
249 2bac48c4 Adeodato Simo
  def testAddGroupDoesNotPreserveFields(self):
250 2bac48c4 Adeodato Simo
    cfg = self._get_object()
251 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
252 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
253 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
254 2bac48c4 Adeodato Simo
    self.assertEqual(1, group.serial_no)
255 2bac48c4 Adeodato Simo
    self.assert_(group.ctime > 1200000000)
256 2bac48c4 Adeodato Simo
    self.assert_(group.mtime > 1200000000)
257 2bac48c4 Adeodato Simo
258 2bac48c4 Adeodato Simo
  def testAddGroupCanSkipUUIDCheck(self):
259 2bac48c4 Adeodato Simo
    cfg = self._get_object()
260 2bac48c4 Adeodato Simo
    uuid = cfg.GenerateUniqueID("my-job")
261 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[], uuid=uuid,
262 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
263 2bac48c4 Adeodato Simo
264 2bac48c4 Adeodato Simo
    self.assertRaises(errors.ConfigurationError,
265 2bac48c4 Adeodato Simo
                      cfg.AddNodeGroup, group, "my-job")
266 2bac48c4 Adeodato Simo
267 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job", check_uuid=False) # Does not raise.
268 2bac48c4 Adeodato Simo
    self.assertEqual(uuid, group.uuid)
269 2bac48c4 Adeodato Simo
270 54c31fd3 Michael Hanselmann
  def testAssignGroupNodes(self):
271 54c31fd3 Michael Hanselmann
    me = netutils.Hostname()
272 54c31fd3 Michael Hanselmann
    cfg = self._get_object()
273 54c31fd3 Michael Hanselmann
274 54c31fd3 Michael Hanselmann
    # Create two groups
275 54c31fd3 Michael Hanselmann
    grp1 = objects.NodeGroup(name="grp1", members=[],
276 54c31fd3 Michael Hanselmann
                             uuid="2f2fadf7-2a70-4a23-9ab5-2568c252032c")
277 54c31fd3 Michael Hanselmann
    grp1_serial = 1
278 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp1, "job")
279 54c31fd3 Michael Hanselmann
280 54c31fd3 Michael Hanselmann
    grp2 = objects.NodeGroup(name="grp2", members=[],
281 54c31fd3 Michael Hanselmann
                             uuid="798d0de3-680f-4a0e-b29a-0f54f693b3f1")
282 54c31fd3 Michael Hanselmann
    grp2_serial = 1
283 54c31fd3 Michael Hanselmann
    cfg.AddNodeGroup(grp2, "job")
284 54c31fd3 Michael Hanselmann
    self.assertEqual(set(map(operator.attrgetter("name"),
285 54c31fd3 Michael Hanselmann
                             cfg.GetAllNodeGroupsInfo().values())),
286 54c31fd3 Michael Hanselmann
                     set(["grp1", "grp2", constants.INITIAL_NODE_GROUP_NAME]))
287 54c31fd3 Michael Hanselmann
288 54c31fd3 Michael Hanselmann
    # No-op
289 54c31fd3 Michael Hanselmann
    cluster_serial = cfg.GetClusterInfo().serial_no
290 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
291 54c31fd3 Michael Hanselmann
    cluster_serial += 1
292 54c31fd3 Michael Hanselmann
293 54c31fd3 Michael Hanselmann
    # Create two nodes
294 54c31fd3 Michael Hanselmann
    node1 = objects.Node(name="node1", group=grp1.uuid, ndparams={})
295 54c31fd3 Michael Hanselmann
    node1_serial = 1
296 54c31fd3 Michael Hanselmann
    node2 = objects.Node(name="node2", group=grp2.uuid, ndparams={})
297 54c31fd3 Michael Hanselmann
    node2_serial = 1
298 54c31fd3 Michael Hanselmann
    cfg.AddNode(node1, "job")
299 54c31fd3 Michael Hanselmann
    cfg.AddNode(node2, "job")
300 54c31fd3 Michael Hanselmann
    cluster_serial += 2
301 54c31fd3 Michael Hanselmann
    self.assertEqual(set(cfg.GetNodeList()), set(["node1", "node2", me.name]))
302 54c31fd3 Michael Hanselmann
303 54c31fd3 Michael Hanselmann
    def _VerifySerials():
304 54c31fd3 Michael Hanselmann
      self.assertEqual(cfg.GetClusterInfo().serial_no, cluster_serial)
305 54c31fd3 Michael Hanselmann
      self.assertEqual(node1.serial_no, node1_serial)
306 54c31fd3 Michael Hanselmann
      self.assertEqual(node2.serial_no, node2_serial)
307 54c31fd3 Michael Hanselmann
      self.assertEqual(grp1.serial_no, grp1_serial)
308 54c31fd3 Michael Hanselmann
      self.assertEqual(grp2.serial_no, grp2_serial)
309 54c31fd3 Michael Hanselmann
310 54c31fd3 Michael Hanselmann
    _VerifySerials()
311 54c31fd3 Michael Hanselmann
312 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
313 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
314 54c31fd3 Michael Hanselmann
315 54c31fd3 Michael Hanselmann
    # Check invalid nodes and groups
316 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
317 54c31fd3 Michael Hanselmann
      ("unknown.node.example.com", grp2.uuid),
318 54c31fd3 Michael Hanselmann
      ])
319 54c31fd3 Michael Hanselmann
    self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
320 54c31fd3 Michael Hanselmann
      (node1.name, "unknown-uuid"),
321 54c31fd3 Michael Hanselmann
      ])
322 54c31fd3 Michael Hanselmann
323 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
324 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
325 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
326 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
327 54c31fd3 Michael Hanselmann
328 54c31fd3 Michael Hanselmann
    # Another no-op
329 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([])
330 54c31fd3 Michael Hanselmann
    cluster_serial += 1
331 54c31fd3 Michael Hanselmann
    _VerifySerials()
332 54c31fd3 Michael Hanselmann
333 54c31fd3 Michael Hanselmann
    # Assign to the same group (should be a no-op)
334 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
335 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
336 54c31fd3 Michael Hanselmann
      (node2.name, grp2.uuid),
337 54c31fd3 Michael Hanselmann
      ])
338 54c31fd3 Michael Hanselmann
    cluster_serial += 1
339 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
340 54c31fd3 Michael Hanselmann
    _VerifySerials()
341 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1"]))
342 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node2"]))
343 54c31fd3 Michael Hanselmann
344 54c31fd3 Michael Hanselmann
    # Assign node 2 to group 1
345 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
346 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
347 54c31fd3 Michael Hanselmann
      (node2.name, grp1.uuid),
348 54c31fd3 Michael Hanselmann
      ])
349 54c31fd3 Michael Hanselmann
    cluster_serial += 1
350 54c31fd3 Michael Hanselmann
    node2_serial += 1
351 54c31fd3 Michael Hanselmann
    grp1_serial += 1
352 54c31fd3 Michael Hanselmann
    grp2_serial += 1
353 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
354 54c31fd3 Michael Hanselmann
    _VerifySerials()
355 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp1.members), set(["node1", "node2"]))
356 54c31fd3 Michael Hanselmann
    self.assertFalse(grp2.members)
357 54c31fd3 Michael Hanselmann
358 54c31fd3 Michael Hanselmann
    # And assign both nodes to group 2
359 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp1.uuid)
360 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp1.uuid)
361 54c31fd3 Michael Hanselmann
    self.assertNotEqual(grp1.uuid, grp2.uuid)
362 54c31fd3 Michael Hanselmann
    cfg.AssignGroupNodes([
363 54c31fd3 Michael Hanselmann
      (node1.name, grp2.uuid),
364 54c31fd3 Michael Hanselmann
      (node2.name, grp2.uuid),
365 54c31fd3 Michael Hanselmann
      ])
366 54c31fd3 Michael Hanselmann
    cluster_serial += 1
367 54c31fd3 Michael Hanselmann
    node1_serial += 1
368 54c31fd3 Michael Hanselmann
    node2_serial += 1
369 54c31fd3 Michael Hanselmann
    grp1_serial += 1
370 54c31fd3 Michael Hanselmann
    grp2_serial += 1
371 54c31fd3 Michael Hanselmann
    self.assertEqual(node1.group, grp2.uuid)
372 54c31fd3 Michael Hanselmann
    self.assertEqual(node2.group, grp2.uuid)
373 54c31fd3 Michael Hanselmann
    _VerifySerials()
374 54c31fd3 Michael Hanselmann
    self.assertFalse(grp1.members)
375 54c31fd3 Michael Hanselmann
    self.assertEqual(set(grp2.members), set(["node1", "node2"]))
376 54c31fd3 Michael Hanselmann
377 54c31fd3 Michael Hanselmann
    # Destructive tests
378 54c31fd3 Michael Hanselmann
    orig_group = node2.group
379 54c31fd3 Michael Hanselmann
    try:
380 54c31fd3 Michael Hanselmann
      other_uuid = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
381 54c31fd3 Michael Hanselmann
      assert compat.all(node.group != other_uuid
382 54c31fd3 Michael Hanselmann
                        for node in cfg.GetAllNodesInfo().values())
383 54c31fd3 Michael Hanselmann
      node2.group = "68b3d087-6ea5-491c-b81f-0a47d90228c5"
384 54c31fd3 Michael Hanselmann
      self.assertRaises(errors.ConfigurationError, cfg.AssignGroupNodes, [
385 54c31fd3 Michael Hanselmann
        ("node2", grp2.uuid),
386 54c31fd3 Michael Hanselmann
        ])
387 54c31fd3 Michael Hanselmann
      _VerifySerials()
388 54c31fd3 Michael Hanselmann
    finally:
389 54c31fd3 Michael Hanselmann
      node2.group = orig_group
390 54c31fd3 Michael Hanselmann
391 e00fb268 Iustin Pop
392 28a7318f Iustin Pop
class TestTRM(unittest.TestCase):
393 28a7318f Iustin Pop
  EC_ID = 1
394 28a7318f Iustin Pop
395 28a7318f Iustin Pop
  def testEmpty(self):
396 28a7318f Iustin Pop
    t = TemporaryReservationManager()
397 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
398 28a7318f Iustin Pop
    self.assertFalse(t.Reserved(self.EC_ID))
399 28a7318f Iustin Pop
    self.assertTrue(t.Reserved("a"))
400 28a7318f Iustin Pop
    self.assertEqual(len(t.GetReserved()), 1)
401 28a7318f Iustin Pop
402 28a7318f Iustin Pop
  def testDuplicate(self):
403 28a7318f Iustin Pop
    t = TemporaryReservationManager()
404 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
405 28a7318f Iustin Pop
    self.assertRaises(errors.ReservationError, t.Reserve, 2, "a")
406 28a7318f Iustin Pop
    t.DropECReservations(self.EC_ID)
407 28a7318f Iustin Pop
    self.assertFalse(t.Reserved("a"))
408 28a7318f Iustin Pop
409 28a7318f Iustin Pop
410 82c54b5b Michael Hanselmann
class TestCheckInstanceDiskIvNames(unittest.TestCase):
411 82c54b5b Michael Hanselmann
  @staticmethod
412 82c54b5b Michael Hanselmann
  def _MakeDisks(names):
413 82c54b5b Michael Hanselmann
    return [objects.Disk(iv_name=name) for name in names]
414 82c54b5b Michael Hanselmann
415 82c54b5b Michael Hanselmann
  def testNoError(self):
416 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/0", "disk/1"])
417 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
418 82c54b5b Michael Hanselmann
    cmdlib._UpdateIvNames(0, disks)
419 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
420 82c54b5b Michael Hanselmann
421 82c54b5b Michael Hanselmann
  def testWrongNames(self):
422 82c54b5b Michael Hanselmann
    disks = self._MakeDisks(["disk/1", "disk/3", "disk/2"])
423 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [
424 82c54b5b Michael Hanselmann
      (0, "disk/0", "disk/1"),
425 82c54b5b Michael Hanselmann
      (1, "disk/1", "disk/3"),
426 82c54b5b Michael Hanselmann
      ])
427 82c54b5b Michael Hanselmann
428 82c54b5b Michael Hanselmann
    # Fix names
429 82c54b5b Michael Hanselmann
    cmdlib._UpdateIvNames(0, disks)
430 82c54b5b Michael Hanselmann
    self.assertEqual(config._CheckInstanceDiskIvNames(disks), [])
431 82c54b5b Michael Hanselmann
432 82c54b5b Michael Hanselmann
433 2f96c43c Michael Hanselmann
if __name__ == "__main__":
434 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()