4 # Copyright (C) 2006, 2007, 2008 Google Inc.
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.
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.
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
22 """Script for unittesting the constants module"""
29 from ganeti import constants
30 from ganeti import locking
31 from ganeti import utils
36 class TestConstants(unittest.TestCase):
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)
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)
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))
62 def testDiskStatus(self):
63 self.failUnless(constants.LDS_OKAY < constants.LDS_UNKNOWN)
64 self.failUnless(constants.LDS_UNKNOWN < constants.LDS_FAULTY)
66 def testClockSkew(self):
67 self.failUnless(constants.NODE_MAX_CLOCK_SKEW <
68 (0.8 * constants.CONFD_MAX_CLOCK_SKEW))
70 def testSslCertExpiration(self):
71 self.failUnless(constants.SSL_CERT_EXPIRATION_ERROR <
72 constants.SSL_CERT_EXPIRATION_WARN)
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)
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)
88 def testJobStatus(self):
89 self.assertFalse(constants.JOBS_PENDING & constants.JOBS_FINALIZED)
90 self.assertFalse(constants.JOBS_PENDING - constants.JOB_STATUS_ALL)
91 self.assertFalse(constants.JOBS_FINALIZED - constants.JOB_STATUS_ALL)
94 class TestExportedNames(unittest.TestCase):
95 _VALID_NAME_RE = re.compile(r"^[A-Z][A-Z0-9_]+$")
96 _BUILTIN_NAME_RE = re.compile(r"^__\w+__$")
97 _EXCEPTIONS = frozenset([
104 set(itertools.ifilterfalse(self._BUILTIN_NAME_RE.match,
105 itertools.ifilterfalse(self._VALID_NAME_RE.match,
107 wrong -= self._EXCEPTIONS
108 self.assertFalse(wrong,
109 msg=("Invalid names exported from constants module: %s" %
110 utils.CommaJoin(sorted(wrong))))
113 class TestParameterNames(unittest.TestCase):
114 """HV/BE parameter tests"""
115 VALID_NAME = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$")
117 def testNoDashes(self):
118 for kind, source in [("hypervisor", constants.HVS_PARAMETER_TYPES),
119 ("backend", constants.BES_PARAMETER_TYPES),
120 ("nic", constants.NICS_PARAMETER_TYPES),
121 ("instdisk", constants.IDISK_PARAMS_TYPES),
122 ("instnic", constants.INIC_PARAMS_TYPES),
125 self.failUnless(self.VALID_NAME.match(key),
126 "The %s parameter '%s' contains invalid characters" %
130 class TestConfdConstants(unittest.TestCase):
131 """Test the confd constants"""
133 def testFourCc(self):
134 self.assertEqual(len(constants.CONFD_MAGIC_FOURCC), 4,
135 msg="Invalid fourcc len, should be 4")
138 self.assertFalse(utils.FindDuplicates(constants.CONFD_REQS),
139 msg="Duplicated confd request code")
141 def testReplStatuses(self):
142 self.assertFalse(utils.FindDuplicates(constants.CONFD_REPL_STATUSES),
143 msg="Duplicated confd reply status code")
146 if __name__ == "__main__":
147 testutils.GanetiTestProgram()