Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.constants_unittest.py @ 880ab678

History | View | Annotate | Download (6.4 kB)

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(
84
        set(constants.DISK_LD_DEFAULTS.keys()) ==
85
        set(constants.DISK_TEMPLATES) - set([constants.DT_DISKLESS]))
86
    self.failUnless(set(constants.DISK_DT_DEFAULTS.keys()) ==
87
                    constants.DISK_TEMPLATES)
88

    
89
  def testJobStatus(self):
90
    self.assertFalse(constants.JOBS_PENDING & constants.JOBS_FINALIZED)
91
    self.assertFalse(constants.JOBS_PENDING - constants.JOB_STATUS_ALL)
92
    self.assertFalse(constants.JOBS_FINALIZED - constants.JOB_STATUS_ALL)
93

    
94
  def testDefaultsForAllHypervisors(self):
95
    self.assertEqual(frozenset(constants.HVC_DEFAULTS.keys()),
96
                     constants.HYPER_TYPES)
97

    
98
  def testDefaultHypervisor(self):
99
    self.assertTrue(constants.DEFAULT_ENABLED_HYPERVISOR in
100
                    constants.HYPER_TYPES)
101

    
102
  def testExtraLogfiles(self):
103
    for daemon in constants.DAEMONS_EXTRA_LOGBASE:
104
      self.assertTrue(daemon in constants.DAEMONS)
105
      for log_reason in constants.DAEMONS_EXTRA_LOGBASE[daemon]:
106
        self.assertTrue(log_reason in constants.VALID_EXTRA_LOGREASONS)
107

    
108

    
109
class TestExportedNames(unittest.TestCase):
110
  _VALID_NAME_RE = re.compile(r"^[A-Z][A-Z0-9_]+$")
111
  _BUILTIN_NAME_RE = re.compile(r"^__\w+__$")
112
  _EXCEPTIONS = frozenset([
113
    "SplitVersion",
114
    "BuildVersion",
115
    ])
116

    
117
  def test(self):
118
    wrong = \
119
      set(itertools.ifilterfalse(self._BUILTIN_NAME_RE.match,
120
            itertools.ifilterfalse(self._VALID_NAME_RE.match,
121
                                   dir(constants))))
122
    wrong -= self._EXCEPTIONS
123
    self.assertFalse(wrong,
124
                     msg=("Invalid names exported from constants module: %s" %
125
                          utils.CommaJoin(sorted(wrong))))
126

    
127

    
128
class TestParameterNames(unittest.TestCase):
129
  """HV/BE parameter tests"""
130
  VALID_NAME = re.compile("^[a-zA-Z_][a-zA-Z0-9_]*$")
131

    
132
  def testNoDashes(self):
133
    for kind, source in [("hypervisor", constants.HVS_PARAMETER_TYPES),
134
                         ("backend", constants.BES_PARAMETER_TYPES),
135
                         ("nic", constants.NICS_PARAMETER_TYPES),
136
                         ("instdisk", constants.IDISK_PARAMS_TYPES),
137
                         ("instnic", constants.INIC_PARAMS_TYPES),
138
                        ]:
139
      for key in source:
140
        self.failUnless(self.VALID_NAME.match(key),
141
                        "The %s parameter '%s' contains invalid characters" %
142
                        (kind, key))
143

    
144

    
145
class TestConfdConstants(unittest.TestCase):
146
  """Test the confd constants"""
147

    
148
  def testFourCc(self):
149
    self.assertEqual(len(constants.CONFD_MAGIC_FOURCC), 4,
150
                     msg="Invalid fourcc len, should be 4")
151

    
152
  def testReqs(self):
153
    self.assertFalse(utils.FindDuplicates(constants.CONFD_REQS),
154
                     msg="Duplicated confd request code")
155

    
156
  def testReplStatuses(self):
157
    self.assertFalse(utils.FindDuplicates(constants.CONFD_REPL_STATUSES),
158
                     msg="Duplicated confd reply status code")
159

    
160
class TestDiskTemplateConstants(unittest.TestCase):
161

    
162
  def testPreference(self):
163
    self.assertEqual(set(constants.DISK_TEMPLATE_PREFERENCE),
164
                     set(constants.DISK_TEMPLATES))
165

    
166
  def testMapToStorageTypes(self):
167
    for disk_template in constants.DISK_TEMPLATES:
168
      self.assertTrue(
169
          constants.MAP_DISK_TEMPLATE_STORAGE_TYPE[disk_template] is not None)
170

    
171

    
172
if __name__ == "__main__":
173
  testutils.GanetiTestProgram()