Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.config_unittest.py @ 18215385

History | View | Annotate | Download (6 kB)

1 e00fb268 Iustin Pop
#!/usr/bin/python
2 e00fb268 Iustin Pop
#
3 e00fb268 Iustin Pop
4 e00fb268 Iustin Pop
# Copyright (C) 2006, 2007 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 e00fb268 Iustin Pop
39 25231ec5 Michael Hanselmann
import testutils
40 25231ec5 Michael Hanselmann
41 e00fb268 Iustin Pop
42 e00fb268 Iustin Pop
class TestConfigRunner(unittest.TestCase):
43 e00fb268 Iustin Pop
  """Testing case for HooksRunner"""
44 e00fb268 Iustin Pop
  def setUp(self):
45 e00fb268 Iustin Pop
    fd, self.cfg_file = tempfile.mkstemp()
46 e00fb268 Iustin Pop
    os.close(fd)
47 c666722f Oleksiy Mishchenko
    self._init_cluster(self.cfg_file)
48 e00fb268 Iustin Pop
49 e00fb268 Iustin Pop
  def tearDown(self):
50 e00fb268 Iustin Pop
    try:
51 e00fb268 Iustin Pop
      os.unlink(self.cfg_file)
52 e00fb268 Iustin Pop
    except OSError:
53 e00fb268 Iustin Pop
      pass
54 e00fb268 Iustin Pop
55 e00fb268 Iustin Pop
  def _get_object(self):
56 e00fb268 Iustin Pop
    """Returns a instance of ConfigWriter"""
57 e00fb268 Iustin Pop
    cfg = config.ConfigWriter(cfg_file=self.cfg_file, offline=True)
58 e00fb268 Iustin Pop
    return cfg
59 e00fb268 Iustin Pop
60 e00fb268 Iustin Pop
  def _init_cluster(self, cfg):
61 e00fb268 Iustin Pop
    """Initializes the cfg object"""
62 f6bd6e98 Michael Hanselmann
    me = utils.HostInfo()
63 f6bd6e98 Michael Hanselmann
    ip = constants.LOCALHOST_IP_ADDRESS
64 f6bd6e98 Michael Hanselmann
65 b9eeeb02 Michael Hanselmann
    cluster_config = objects.Cluster(
66 b9eeeb02 Michael Hanselmann
      serial_no=1,
67 b9eeeb02 Michael Hanselmann
      rsahostkeypub="",
68 b9eeeb02 Michael Hanselmann
      highest_used_port=(constants.FIRST_DRBD_PORT - 1),
69 b9eeeb02 Michael Hanselmann
      mac_prefix="aa:00:00",
70 b9eeeb02 Michael Hanselmann
      volume_group_name="xenvg",
71 c66f21a4 Guido Trotter
      nicparams={constants.PP_DEFAULT: constants.NICC_DEFAULTS},
72 b9eeeb02 Michael Hanselmann
      tcpudp_port_pool=set(),
73 066f465d Guido Trotter
      enabled_hypervisors=[constants.HT_FAKE],
74 f6bd6e98 Michael Hanselmann
      master_node=me.name,
75 f6bd6e98 Michael Hanselmann
      master_ip="127.0.0.1",
76 f6bd6e98 Michael Hanselmann
      master_netdev=constants.DEFAULT_BRIDGE,
77 f6bd6e98 Michael Hanselmann
      cluster_name="cluster.local",
78 f6bd6e98 Michael Hanselmann
      file_storage_dir="/tmp",
79 93be53da Balazs Lecz
      uid_pool=[],
80 b9eeeb02 Michael Hanselmann
      )
81 f6bd6e98 Michael Hanselmann
82 f6bd6e98 Michael Hanselmann
    master_node_config = objects.Node(name=me.name,
83 f6bd6e98 Michael Hanselmann
                                      primary_ip=me.ip,
84 36b8c2c1 Michael Hanselmann
                                      secondary_ip=ip,
85 4a89c54a Iustin Pop
                                      serial_no=1,
86 4a89c54a Iustin Pop
                                      master_candidate=True)
87 f6bd6e98 Michael Hanselmann
88 c666722f Oleksiy Mishchenko
    bootstrap.InitConfig(constants.CONFIG_VERSION,
89 c666722f Oleksiy Mishchenko
                         cluster_config, master_node_config, self.cfg_file)
90 e00fb268 Iustin Pop
91 e00fb268 Iustin Pop
  def _create_instance(self):
92 e00fb268 Iustin Pop
    """Create and return an instance object"""
93 4a89c54a Iustin Pop
    inst = objects.Instance(name="test.example.com", disks=[], nics=[],
94 4a89c54a Iustin Pop
                            disk_template=constants.DT_DISKLESS,
95 4a89c54a Iustin Pop
                            primary_node=self._get_object().GetMasterNode())
96 e00fb268 Iustin Pop
    return inst
97 e00fb268 Iustin Pop
98 e00fb268 Iustin Pop
  def testEmpty(self):
99 e00fb268 Iustin Pop
    """Test instantiate config object"""
100 e00fb268 Iustin Pop
    self._get_object()
101 e00fb268 Iustin Pop
102 e00fb268 Iustin Pop
  def testInit(self):
103 e00fb268 Iustin Pop
    """Test initialize the config file"""
104 e00fb268 Iustin Pop
    cfg = self._get_object()
105 e00fb268 Iustin Pop
    self.failUnlessEqual(1, len(cfg.GetNodeList()))
106 e00fb268 Iustin Pop
    self.failUnlessEqual(0, len(cfg.GetInstanceList()))
107 e00fb268 Iustin Pop
108 e00fb268 Iustin Pop
  def testUpdateCluster(self):
109 e00fb268 Iustin Pop
    """Test updates on the cluster object"""
110 e00fb268 Iustin Pop
    cfg = self._get_object()
111 e00fb268 Iustin Pop
    # construct a fake cluster object
112 e00fb268 Iustin Pop
    fake_cl = objects.Cluster()
113 e00fb268 Iustin Pop
    # fail if we didn't read the config
114 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
115 e00fb268 Iustin Pop
116 e00fb268 Iustin Pop
    cl = cfg.GetClusterInfo()
117 e00fb268 Iustin Pop
    # first pass, must not fail
118 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
119 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
120 a4eae71f Michael Hanselmann
    cfg.Update(cl, None)
121 e00fb268 Iustin Pop
    # but the fake_cl update should still fail
122 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_cl, None)
123 e00fb268 Iustin Pop
124 e00fb268 Iustin Pop
  def testUpdateNode(self):
125 e00fb268 Iustin Pop
    """Test updates on one node object"""
126 e00fb268 Iustin Pop
    cfg = self._get_object()
127 e00fb268 Iustin Pop
    # construct a fake node
128 e00fb268 Iustin Pop
    fake_node = objects.Node()
129 e00fb268 Iustin Pop
    # fail if we didn't read the config
130 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
131 a4eae71f Michael Hanselmann
                          None)
132 e00fb268 Iustin Pop
133 e00fb268 Iustin Pop
    node = cfg.GetNodeInfo(cfg.GetNodeList()[0])
134 e00fb268 Iustin Pop
    # first pass, must not fail
135 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
136 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
137 a4eae71f Michael Hanselmann
    cfg.Update(node, None)
138 e00fb268 Iustin Pop
    # but the fake_node update should still fail
139 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_node,
140 a4eae71f Michael Hanselmann
                          None)
141 e00fb268 Iustin Pop
142 e00fb268 Iustin Pop
  def testUpdateInstance(self):
143 e00fb268 Iustin Pop
    """Test updates on one instance object"""
144 e00fb268 Iustin Pop
    cfg = self._get_object()
145 e00fb268 Iustin Pop
    # construct a fake instance
146 e00fb268 Iustin Pop
    inst = self._create_instance()
147 e00fb268 Iustin Pop
    fake_instance = objects.Instance()
148 e00fb268 Iustin Pop
    # fail if we didn't read the config
149 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
150 a4eae71f Michael Hanselmann
                          None)
151 e00fb268 Iustin Pop
152 0debfb35 Guido Trotter
    cfg.AddInstance(inst, "my-job")
153 e00fb268 Iustin Pop
    instance = cfg.GetInstanceInfo(cfg.GetInstanceList()[0])
154 e00fb268 Iustin Pop
    # first pass, must not fail
155 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
156 e00fb268 Iustin Pop
    # second pass, also must not fail (after the config has been written)
157 a4eae71f Michael Hanselmann
    cfg.Update(instance, None)
158 e00fb268 Iustin Pop
    # but the fake_instance update should still fail
159 a4eae71f Michael Hanselmann
    self.failUnlessRaises(errors.ConfigurationError, cfg.Update, fake_instance,
160 a4eae71f Michael Hanselmann
                          None)
161 e00fb268 Iustin Pop
162 255e19d4 Guido Trotter
  def testNICParameterSyntaxCheck(self):
163 255e19d4 Guido Trotter
    """Test the NIC's CheckParameterSyntax function"""
164 255e19d4 Guido Trotter
    mode = constants.NIC_MODE
165 255e19d4 Guido Trotter
    link = constants.NIC_LINK
166 255e19d4 Guido Trotter
    m_bridged = constants.NIC_MODE_BRIDGED
167 255e19d4 Guido Trotter
    m_routed = constants.NIC_MODE_ROUTED
168 255e19d4 Guido Trotter
    CheckSyntax = objects.NIC.CheckParameterSyntax
169 255e19d4 Guido Trotter
170 255e19d4 Guido Trotter
    CheckSyntax(constants.NICC_DEFAULTS)
171 255e19d4 Guido Trotter
    CheckSyntax({mode: m_bridged, link: 'br1'})
172 255e19d4 Guido Trotter
    CheckSyntax({mode: m_routed, link: 'default'})
173 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
174 255e19d4 Guido Trotter
                      CheckSyntax, {mode: '000invalid', link: 'any'})
175 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
176 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: None})
177 255e19d4 Guido Trotter
    self.assertRaises(errors.ConfigurationError,
178 255e19d4 Guido Trotter
                      CheckSyntax, {mode: m_bridged, link: ''})
179 255e19d4 Guido Trotter
180 e00fb268 Iustin Pop
181 e00fb268 Iustin Pop
if __name__ == '__main__':
182 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()