Merge branch 'stable-2.6-esi' into stable-2.6-ippool-hotplug-esi
[ganeti-local] / test / ganeti.constants_unittest.py
1 #!/usr/bin/python
2 #
3
4 # Copyright (C) 2006, 2007, 2008 Google Inc.
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful, but
12 # WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 # General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 # 02110-1301, USA.
20
21
22 """Script for unittesting the constants module"""
23
24
25 import unittest
26 import re
27 import itertools
28
29 from ganeti import constants
30 from ganeti import locking
31 from ganeti import utils
32
33 import testutils
34
35
36 class TestConstants(unittest.TestCase):
37   """Constants tests"""
38
39   def testConfigVersion(self):
40     self.failUnless(constants.CONFIG_MAJOR >= 0 and
41                     constants.CONFIG_MAJOR <= 99)
42     self.failUnless(constants.CONFIG_MINOR >= 0 and
43                     constants.CONFIG_MINOR <= 99)
44     self.failUnless(constants.CONFIG_REVISION >= 0 and
45                     constants.CONFIG_REVISION <= 9999)
46     self.failUnless(constants.CONFIG_VERSION >= 0 and
47                     constants.CONFIG_VERSION <= 99999999)
48
49     self.failUnless(constants.BuildVersion(0, 0, 0) == 0)
50     self.failUnless(constants.BuildVersion(10, 10, 1010) == 10101010)
51     self.failUnless(constants.BuildVersion(12, 34, 5678) == 12345678)
52     self.failUnless(constants.BuildVersion(99, 99, 9999) == 99999999)
53
54     self.failUnless(constants.SplitVersion(00000000) == (0, 0, 0))
55     self.failUnless(constants.SplitVersion(10101010) == (10, 10, 1010))
56     self.failUnless(constants.SplitVersion(12345678) == (12, 34, 5678))
57     self.failUnless(constants.SplitVersion(99999999) == (99, 99, 9999))
58     self.failUnless(constants.SplitVersion(constants.CONFIG_VERSION) ==
59                     (constants.CONFIG_MAJOR, constants.CONFIG_MINOR,
60                      constants.CONFIG_REVISION))
61
62   def testDiskStatus(self):
63     self.failUnless(constants.LDS_OKAY < constants.LDS_UNKNOWN)
64     self.failUnless(constants.LDS_UNKNOWN < constants.LDS_FAULTY)
65
66   def testClockSkew(self):
67     self.failUnless(constants.NODE_MAX_CLOCK_SKEW <
68                     (0.8 * constants.CONFD_MAX_CLOCK_SKEW))
69
70   def testSslCertExpiration(self):
71     self.failUnless(constants.SSL_CERT_EXPIRATION_ERROR <
72                     constants.SSL_CERT_EXPIRATION_WARN)
73
74   def testOpCodePriority(self):
75     self.failUnless(constants.OP_PRIO_LOWEST > constants.OP_PRIO_LOW)
76     self.failUnless(constants.OP_PRIO_LOW > constants.OP_PRIO_NORMAL)
77     self.failUnlessEqual(constants.OP_PRIO_NORMAL, locking._DEFAULT_PRIORITY)
78     self.failUnlessEqual(constants.OP_PRIO_DEFAULT, locking._DEFAULT_PRIORITY)
79     self.failUnless(constants.OP_PRIO_NORMAL > constants.OP_PRIO_HIGH)
80     self.failUnless(constants.OP_PRIO_HIGH > constants.OP_PRIO_HIGHEST)
81
82   def testDiskDefaults(self):
83     self.failUnless(set(constants.DISK_LD_DEFAULTS.keys()) ==
84                     constants.LOGICAL_DISK_TYPES)
85     self.failUnless(set(constants.DISK_DT_DEFAULTS.keys()) ==
86                     constants.DISK_TEMPLATES)
87
88
89 class TestExportedNames(unittest.TestCase):
90   _VALID_NAME_RE = re.compile(r"^[A-Z][A-Z0-9_]+$")
91   _BUILTIN_NAME_RE = re.compile(r"^__\w+__$")
92   _EXCEPTIONS = frozenset([
93     "SplitVersion",
94     "BuildVersion",
95     ])
96
97   def test(self):
98     wrong = \
99       set(itertools.ifilterfalse(self._BUILTIN_NAME_RE.match,
100             itertools.ifilterfalse(self._VALID_NAME_RE.match,
101                                    dir(constants))))
102     wrong -= self._EXCEPTIONS
103     self.assertFalse(wrong,
104                      msg=("Invalid names exported from constants module: %s" %
105                           utils.CommaJoin(sorted(wrong))))
106
107
108 class TestParameterNames(unittest.TestCase):
109   """HV/BE parameter tests"""
110   VALID_NAME = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$")
111
112   def testNoDashes(self):
113     for kind, source in [('hypervisor', constants.HVS_PARAMETER_TYPES),
114                          ('backend', constants.BES_PARAMETER_TYPES),
115                          ('nic', constants.NICS_PARAMETER_TYPES),
116                          ("instdisk", constants.IDISK_PARAMS_TYPES),
117                          ("instnic", constants.INIC_PARAMS_TYPES),
118                         ]:
119       for key in source:
120         self.failUnless(self.VALID_NAME.match(key),
121                         "The %s parameter '%s' contains invalid characters" %
122                         (kind, key))
123
124
125 class TestConfdConstants(unittest.TestCase):
126   """Test the confd constants"""
127
128   def testFourCc(self):
129     self.failUnlessEqual(len(constants.CONFD_MAGIC_FOURCC), 4,
130                          "Invalid fourcc len, should be 4")
131
132   def _IsUniqueSequence(self, sequence):
133     seen = set()
134     for member in sequence:
135       if member in seen:
136         return False
137       seen.add(member)
138     return True
139
140   def testReqs(self):
141     self.failUnless(self._IsUniqueSequence(constants.CONFD_REQS),
142                     "Duplicated confd request code")
143
144   def testReplStatuses(self):
145     self.failUnless(self._IsUniqueSequence(constants.CONFD_REPL_STATUSES),
146                     "Duplicated confd reply status code")
147
148
149 if __name__ == '__main__':
150   testutils.GanetiTestProgram()