Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.config_unittest.py @ 8572f1fe

History | View | Annotate | Download (8.7 kB)

1 e00fb268 Iustin Pop
#!/usr/bin/python
2 e00fb268 Iustin Pop
#
3 e00fb268 Iustin Pop
4 b705c7a6 Manuel Franceschini
# Copyright (C) 2006, 2007, 2010 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 e00fb268 Iustin Pop
32 c666722f Oleksiy Mishchenko
from ganeti import bootstrap
33 e00fb268 Iustin Pop
from ganeti import config
34 c666722f Oleksiy Mishchenko
from ganeti import constants
35 c666722f Oleksiy Mishchenko
from ganeti import errors
36 e00fb268 Iustin Pop
from ganeti import objects
37 6f1bebf9 Michael Hanselmann
from ganeti import utils
38 a744b676 Manuel Franceschini
from ganeti import netutils
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 e00fb268 Iustin Pop
    """Returns a 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 f6bd6e98 Michael Hanselmann
74 b9eeeb02 Michael Hanselmann
    cluster_config = objects.Cluster(
75 b9eeeb02 Michael Hanselmann
      serial_no=1,
76 b9eeeb02 Michael Hanselmann
      rsahostkeypub="",
77 b9eeeb02 Michael Hanselmann
      highest_used_port=(constants.FIRST_DRBD_PORT - 1),
78 b9eeeb02 Michael Hanselmann
      mac_prefix="aa:00:00",
79 b9eeeb02 Michael Hanselmann
      volume_group_name="xenvg",
80 9e33896b Luca Bigliardi
      drbd_usermode_helper="/bin/true",
81 c66f21a4 Guido Trotter
      nicparams={constants.PP_DEFAULT: constants.NICC_DEFAULTS},
82 5768e6a6 René Nussbaumer
      ndparams=constants.NDC_DEFAULTS,
83 b9eeeb02 Michael Hanselmann
      tcpudp_port_pool=set(),
84 066f465d Guido Trotter
      enabled_hypervisors=[constants.HT_FAKE],
85 f6bd6e98 Michael Hanselmann
      master_node=me.name,
86 f6bd6e98 Michael Hanselmann
      master_ip="127.0.0.1",
87 f6bd6e98 Michael Hanselmann
      master_netdev=constants.DEFAULT_BRIDGE,
88 f6bd6e98 Michael Hanselmann
      cluster_name="cluster.local",
89 f6bd6e98 Michael Hanselmann
      file_storage_dir="/tmp",
90 93be53da Balazs Lecz
      uid_pool=[],
91 b9eeeb02 Michael Hanselmann
      )
92 f6bd6e98 Michael Hanselmann
93 f6bd6e98 Michael Hanselmann
    master_node_config = objects.Node(name=me.name,
94 f6bd6e98 Michael Hanselmann
                                      primary_ip=me.ip,
95 36b8c2c1 Michael Hanselmann
                                      secondary_ip=ip,
96 4a89c54a Iustin Pop
                                      serial_no=1,
97 4a89c54a Iustin Pop
                                      master_candidate=True)
98 f6bd6e98 Michael Hanselmann
99 c666722f Oleksiy Mishchenko
    bootstrap.InitConfig(constants.CONFIG_VERSION,
100 c666722f Oleksiy Mishchenko
                         cluster_config, master_node_config, self.cfg_file)
101 e00fb268 Iustin Pop
102 e00fb268 Iustin Pop
  def _create_instance(self):
103 e00fb268 Iustin Pop
    """Create and return an instance object"""
104 4a89c54a Iustin Pop
    inst = objects.Instance(name="test.example.com", disks=[], nics=[],
105 4a89c54a Iustin Pop
                            disk_template=constants.DT_DISKLESS,
106 4a89c54a Iustin Pop
                            primary_node=self._get_object().GetMasterNode())
107 e00fb268 Iustin Pop
    return inst
108 e00fb268 Iustin Pop
109 e00fb268 Iustin Pop
  def testEmpty(self):
110 e00fb268 Iustin Pop
    """Test instantiate config object"""
111 e00fb268 Iustin Pop
    self._get_object()
112 e00fb268 Iustin Pop
113 e00fb268 Iustin Pop
  def testInit(self):
114 e00fb268 Iustin Pop
    """Test initialize the config file"""
115 e00fb268 Iustin Pop
    cfg = self._get_object()
116 e00fb268 Iustin Pop
    self.failUnlessEqual(1, len(cfg.GetNodeList()))
117 e00fb268 Iustin Pop
    self.failUnlessEqual(0, len(cfg.GetInstanceList()))
118 e00fb268 Iustin Pop
119 e00fb268 Iustin Pop
  def testUpdateCluster(self):
120 e00fb268 Iustin Pop
    """Test updates on the cluster object"""
121 e00fb268 Iustin Pop
    cfg = self._get_object()
122 e00fb268 Iustin Pop
    # construct a fake cluster object
123 e00fb268 Iustin Pop
    fake_cl = objects.Cluster()
124 e00fb268 Iustin Pop
    # fail if we didn't read the config
125 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
126 e00fb268 Iustin Pop
127 e00fb268 Iustin Pop
    cl = cfg.GetClusterInfo()
128 e00fb268 Iustin Pop
    # first pass, must not fail
129 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
130 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
131 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
132 e00fb268 Iustin Pop
    # but the fake_cl update should still fail
133 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
134 e00fb268 Iustin Pop
135 e00fb268 Iustin Pop
  def testUpdateNode(self):
136 e00fb268 Iustin Pop
    """Test updates on one node object"""
137 e00fb268 Iustin Pop
    cfg = self._get_object()
138 e00fb268 Iustin Pop
    # construct a fake node
139 e00fb268 Iustin Pop
    fake_node = objects.Node()
140 e00fb268 Iustin Pop
    # fail if we didn't read the config
141 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
142 a4eae71f Michael Hanselmann
                          None)
143 e00fb268 Iustin Pop
144 e00fb268 Iustin Pop
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
145 e00fb268 Iustin Pop
    # first pass, must not fail
146 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
147 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
148 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
149 e00fb268 Iustin Pop
    # but the fake_node update should still fail
150 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
151 a4eae71f Michael Hanselmann
                          None)
152 e00fb268 Iustin Pop
153 e00fb268 Iustin Pop
  def testUpdateInstance(self):
154 e00fb268 Iustin Pop
    """Test updates on one instance object"""
155 e00fb268 Iustin Pop
    cfg = self._get_object()
156 e00fb268 Iustin Pop
    # construct a fake instance
157 e00fb268 Iustin Pop
    inst = self._create_instance()
158 e00fb268 Iustin Pop
    fake_instance = objects.Instance()
159 e00fb268 Iustin Pop
    # fail if we didn't read the config
160 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
161 a4eae71f Michael Hanselmann
                          None)
162 e00fb268 Iustin Pop
163 0debfb35 Guido Trotter
    cfg.AddInstance(inst, "my-job")
164 e00fb268 Iustin Pop
    instance = cfg.GetInstanceInfo(cfg.GetInstanceList()[0])
165 e00fb268 Iustin Pop
    # first pass, must not fail
166 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
167 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
168 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
169 e00fb268 Iustin Pop
    # but the fake_instance update should still fail
170 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
171 a4eae71f Michael Hanselmann
                          None)
172 e00fb268 Iustin Pop
173 255e19d4 Guido Trotter
  def testNICParameterSyntaxCheck(self):
174 255e19d4 Guido Trotter
    """Test the NIC's CheckParameterSyntax function"""
175 255e19d4 Guido Trotter
    mode = constants.NIC_MODE
176 255e19d4 Guido Trotter
    link = constants.NIC_LINK
177 255e19d4 Guido Trotter
    m_bridged = constants.NIC_MODE_BRIDGED
178 255e19d4 Guido Trotter
    m_routed = constants.NIC_MODE_ROUTED
179 255e19d4 Guido Trotter
    CheckSyntax = objects.NIC.CheckParameterSyntax
180 255e19d4 Guido Trotter
181 255e19d4 Guido Trotter
    CheckSyntax(constants.NICC_DEFAULTS)
182 255e19d4 Guido Trotter
    CheckSyntax({mode: m_bridged, link: 'br1'})
183 255e19d4 Guido Trotter
    CheckSyntax({mode: m_routed, link: 'default'})
184 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
185 255e19d4 Guido Trotter
                      CheckSyntax, {mode: '000invalid', link: 'any'})
186 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
187 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: None})
188 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
189 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: ''})
190 255e19d4 Guido Trotter
191 5768e6a6 René Nussbaumer
  def testGetNdParamsDefault(self):
192 5768e6a6 René Nussbaumer
    cfg = self._get_object()
193 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
194 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), constants.NDC_DEFAULTS)
195 5768e6a6 René Nussbaumer
196 5768e6a6 René Nussbaumer
  def testGetNdParamsModifiedNode(self):
197 5768e6a6 René Nussbaumer
    my_ndparams = {
198 5768e6a6 René Nussbaumer
        constants.ND_OOB_PROGRAM: "/bin/node-oob",
199 5768e6a6 René Nussbaumer
        }
200 5768e6a6 René Nussbaumer
201 5768e6a6 René Nussbaumer
    cfg = self._get_object()
202 5768e6a6 René Nussbaumer
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
203 5768e6a6 René Nussbaumer
    node.ndparams = my_ndparams
204 5768e6a6 René Nussbaumer
    cfg.Update(node, None)
205 5768e6a6 René Nussbaumer
    self.assertEqual(cfg.GetNdParams(node), my_ndparams)
206 5768e6a6 René Nussbaumer
207 2bac48c4 Adeodato Simo
  def testAddGroupFillsFieldsIfMissing(self):
208 2bac48c4 Adeodato Simo
    cfg = self._get_object()
209 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[])
210 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
211 2bac48c4 Adeodato Simo
    self.assert_(utils.UUID_RE.match(group.uuid))
212 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_PREFERRED, group.alloc_policy)
213 2bac48c4 Adeodato Simo
214 2bac48c4 Adeodato Simo
  def testAddGroupPreservesFields(self):
215 2bac48c4 Adeodato Simo
    cfg = self._get_object()
216 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
217 2bac48c4 Adeodato Simo
                              alloc_policy=constants.ALLOC_POLICY_LAST_RESORT)
218 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
219 2bac48c4 Adeodato Simo
    self.assertEqual(constants.ALLOC_POLICY_LAST_RESORT, group.alloc_policy)
220 2bac48c4 Adeodato Simo
221 2bac48c4 Adeodato Simo
  def testAddGroupDoesNotPreserveFields(self):
222 2bac48c4 Adeodato Simo
    cfg = self._get_object()
223 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[],
224 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
225 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job")
226 2bac48c4 Adeodato Simo
    self.assertEqual(1, group.serial_no)
227 2bac48c4 Adeodato Simo
    self.assert_(group.ctime > 1200000000)
228 2bac48c4 Adeodato Simo
    self.assert_(group.mtime > 1200000000)
229 2bac48c4 Adeodato Simo
230 2bac48c4 Adeodato Simo
  def testAddGroupCanSkipUUIDCheck(self):
231 2bac48c4 Adeodato Simo
    cfg = self._get_object()
232 2bac48c4 Adeodato Simo
    uuid = cfg.GenerateUniqueID("my-job")
233 2bac48c4 Adeodato Simo
    group = objects.NodeGroup(name="test", members=[], uuid=uuid,
234 2bac48c4 Adeodato Simo
                              serial_no=17, ctime=123, mtime=456)
235 2bac48c4 Adeodato Simo
236 2bac48c4 Adeodato Simo
    self.assertRaises(errors.ConfigurationError,
237 2bac48c4 Adeodato Simo
                      cfg.AddNodeGroup, group, "my-job")
238 2bac48c4 Adeodato Simo
239 2bac48c4 Adeodato Simo
    cfg.AddNodeGroup(group, "my-job", check_uuid=False) # Does not raise.
240 2bac48c4 Adeodato Simo
    self.assertEqual(uuid, group.uuid)
241 2bac48c4 Adeodato Simo
242 e00fb268 Iustin Pop
243 28a7318f Iustin Pop
class TestTRM(unittest.TestCase):
244 28a7318f Iustin Pop
  EC_ID = 1
245 28a7318f Iustin Pop
246 28a7318f Iustin Pop
  def testEmpty(self):
247 28a7318f Iustin Pop
    t = TemporaryReservationManager()
248 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
249 28a7318f Iustin Pop
    self.assertFalse(t.Reserved(self.EC_ID))
250 28a7318f Iustin Pop
    self.assertTrue(t.Reserved("a"))
251 28a7318f Iustin Pop
    self.assertEqual(len(t.GetReserved()), 1)
252 28a7318f Iustin Pop
253 28a7318f Iustin Pop
  def testDuplicate(self):
254 28a7318f Iustin Pop
    t = TemporaryReservationManager()
255 28a7318f Iustin Pop
    t.Reserve(self.EC_ID, "a")
256 28a7318f Iustin Pop
    self.assertRaises(errors.ReservationError, t.Reserve, 2, "a")
257 28a7318f Iustin Pop
    t.DropECReservations(self.EC_ID)
258 28a7318f Iustin Pop
    self.assertFalse(t.Reserved("a"))
259 28a7318f Iustin Pop
260 28a7318f Iustin Pop
261 e00fb268 Iustin Pop
if __name__ == '__main__':
262 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()