Refactor storage of runtime exclusive storage flag in QA
[ganeti-local] / test / py / 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   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)
92
93   def testDefaultsForAllHypervisors(self):
94     self.assertEqual(frozenset(constants.HVC_DEFAULTS.keys()),
95                      constants.HYPER_TYPES)
96
97   def testDefaultHypervisor(self):
98     self.assertTrue(constants.DEFAULT_ENABLED_HYPERVISOR in
99                     constants.HYPER_TYPES)
100
101
102 class TestExportedNames(unittest.TestCase):
103   _VALID_NAME_RE = re.compile(r"^[A-Z][A-Z0-9_]+$")
104   _BUILTIN_NAME_RE = re.compile(r"^__\w+__$")
105   _EXCEPTIONS = frozenset([
106     "SplitVersion",
107     "BuildVersion",
108     ])
109
110   def test(self):
111     wrong = \
112       set(itertools.ifilterfalse(self._BUILTIN_NAME_RE.match,
113             itertools.ifilterfalse(self._VALID_NAME_RE.match,
114                                    dir(constants))))
115     wrong -= self._EXCEPTIONS
116     self.assertFalse(wrong,
117                      msg=("Invalid names exported from constants module: %s" %
118                           utils.CommaJoin(sorted(wrong))))
119
120
121 class TestParameterNames(unittest.TestCase):
122   """HV/BE parameter tests"""
123   VALID_NAME = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$")
124
125   def testNoDashes(self):
126     for kind, source in [("hypervisor", constants.HVS_PARAMETER_TYPES),
127                          ("backend", constants.BES_PARAMETER_TYPES),
128                          ("nic", constants.NICS_PARAMETER_TYPES),
129                          ("instdisk", constants.IDISK_PARAMS_TYPES),
130                          ("instnic", constants.INIC_PARAMS_TYPES),
131                         ]:
132       for key in source:
133         self.failUnless(self.VALID_NAME.match(key),
134                         "The %s parameter '%s' contains invalid characters" %
135                         (kind, key))
136
137
138 class TestConfdConstants(unittest.TestCase):
139   """Test the confd constants"""
140
141   def testFourCc(self):
142     self.assertEqual(len(constants.CONFD_MAGIC_FOURCC), 4,
143                      msg="Invalid fourcc len, should be 4")
144
145   def testReqs(self):
146     self.assertFalse(utils.FindDuplicates(constants.CONFD_REQS),
147                      msg="Duplicated confd request code")
148
149   def testReplStatuses(self):
150     self.assertFalse(utils.FindDuplicates(constants.CONFD_REPL_STATUSES),
151                      msg="Duplicated confd reply status code")
152
153
154 if __name__ == "__main__":
155   testutils.GanetiTestProgram()