bash_completion: Enable extglob while parsing file
[ganeti-local] / test / ganeti.runtime_unittest.py
1 #!/usr/bin/python
2 #
3
4 # Copyright (C) 2010 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 """Script for testing ganeti.runtime"""
22
23 from ganeti import constants
24 from ganeti import errors
25 from ganeti import runtime
26 from ganeti import ht
27
28 import testutils
29 import unittest
30
31
32 class _EntStub:
33   def __init__(self, uid=None, gid=None):
34     self.pw_uid = uid
35     self.gr_gid = gid
36
37
38 def _StubGetpwnam(user):
39   users = {
40     constants.MASTERD_USER: _EntStub(uid=0),
41     constants.CONFD_USER: _EntStub(uid=1),
42     constants.RAPI_USER: _EntStub(uid=2),
43     constants.NODED_USER: _EntStub(uid=3),
44     }
45   return users[user]
46
47
48 def _StubGetgrnam(group):
49   groups = {
50     constants.MASTERD_GROUP: _EntStub(gid=0),
51     constants.CONFD_GROUP: _EntStub(gid=1),
52     constants.RAPI_GROUP: _EntStub(gid=2),
53     constants.DAEMONS_GROUP: _EntStub(gid=3),
54     constants.ADMIN_GROUP: _EntStub(gid=4),
55     constants.NODED_GROUP: _EntStub(gid=5),
56     }
57   return groups[group]
58
59
60 def _RaisingStubGetpwnam(user):
61   raise KeyError("user not found")
62
63
64 def _RaisingStubGetgrnam(group):
65   raise KeyError("group not found")
66
67
68 class ResolverStubRaising(object):
69   def __init__(self):
70     raise errors.ConfigurationError("No entries")
71
72
73 class TestErrors(unittest.TestCase):
74   def setUp(self):
75     self.resolver = runtime.GetentResolver(_getpwnam=_StubGetpwnam,
76                                            _getgrnam=_StubGetgrnam)
77
78   def testEverythingSuccessful(self):
79     self.assertEqual(self.resolver.masterd_uid,
80                      _StubGetpwnam(constants.MASTERD_USER).pw_uid)
81     self.assertEqual(self.resolver.masterd_gid,
82                      _StubGetgrnam(constants.MASTERD_GROUP).gr_gid)
83     self.assertEqual(self.resolver.confd_uid,
84                      _StubGetpwnam(constants.CONFD_USER).pw_uid)
85     self.assertEqual(self.resolver.confd_gid,
86                      _StubGetgrnam(constants.CONFD_GROUP).gr_gid)
87     self.assertEqual(self.resolver.rapi_uid,
88                      _StubGetpwnam(constants.RAPI_USER).pw_uid)
89     self.assertEqual(self.resolver.rapi_gid,
90                      _StubGetgrnam(constants.RAPI_GROUP).gr_gid)
91     self.assertEqual(self.resolver.noded_uid,
92                      _StubGetpwnam(constants.NODED_USER).pw_uid)
93
94     self.assertEqual(self.resolver.daemons_gid,
95                      _StubGetgrnam(constants.DAEMONS_GROUP).gr_gid)
96     self.assertEqual(self.resolver.admin_gid,
97                      _StubGetgrnam(constants.ADMIN_GROUP).gr_gid)
98
99   def testUserNotFound(self):
100     self.assertRaises(errors.ConfigurationError, runtime.GetentResolver,
101                       _getpwnam=_RaisingStubGetpwnam, _getgrnam=_StubGetgrnam)
102
103   def testGroupNotFound(self):
104     self.assertRaises(errors.ConfigurationError, runtime.GetentResolver,
105                       _getpwnam=_StubGetpwnam, _getgrnam=_RaisingStubGetgrnam)
106
107   def testUserNotFoundGetEnts(self):
108     self.assertRaises(errors.ConfigurationError, runtime.GetEnts,
109                       resolver=ResolverStubRaising)
110
111   def testLookupForUser(self):
112     master_stub = _StubGetpwnam(constants.MASTERD_USER)
113     rapi_stub = _StubGetpwnam(constants.RAPI_USER)
114     self.assertEqual(self.resolver.LookupUid(master_stub.pw_uid),
115                      constants.MASTERD_USER)
116     self.assertEqual(self.resolver.LookupUid(rapi_stub.pw_uid),
117                      constants.RAPI_USER)
118     self.assertEqual(self.resolver.LookupUser(constants.MASTERD_USER),
119                      master_stub.pw_uid)
120     self.assertEqual(self.resolver.LookupUser(constants.RAPI_USER),
121                      rapi_stub.pw_uid)
122
123   def testLookupForGroup(self):
124     master_stub = _StubGetgrnam(constants.MASTERD_GROUP)
125     rapi_stub = _StubGetgrnam(constants.RAPI_GROUP)
126     self.assertEqual(self.resolver.LookupGid(master_stub.gr_gid),
127                      constants.MASTERD_GROUP)
128     self.assertEqual(self.resolver.LookupGid(rapi_stub.gr_gid),
129                      constants.RAPI_GROUP)
130
131   def testLookupForUserNotFound(self):
132     self.assertRaises(errors.ConfigurationError, self.resolver.LookupUid, 9999)
133     self.assertRaises(errors.ConfigurationError,
134                       self.resolver.LookupUser, "does-not-exist-foo")
135
136   def testLookupForGroupNotFound(self):
137     self.assertRaises(errors.ConfigurationError, self.resolver.LookupGid, 9999)
138     self.assertRaises(errors.ConfigurationError,
139                       self.resolver.LookupGroup, "does-not-exist-foo")
140
141
142 class TestArchInfo(unittest.TestCase):
143   EXP_TYPES = \
144     ht.TAnd(ht.TIsLength(2),
145             ht.TItems([
146               ht.TNonEmptyString,
147               ht.TNonEmptyString,
148               ]))
149
150   def setUp(self):
151     self.assertTrue(runtime._arch is None)
152
153   def tearDown(self):
154     runtime._arch = None
155
156   def testNotInitialized(self):
157     self.assertRaises(errors.ProgrammerError, runtime.GetArchInfo)
158
159   def testInitializeMultiple(self):
160     runtime.InitArchInfo()
161
162     self.assertRaises(errors.ProgrammerError, runtime.InitArchInfo)
163
164   def testNormal(self):
165     runtime.InitArchInfo()
166
167     info = runtime.GetArchInfo()
168
169     self.assertTrue(self.EXP_TYPES(info),
170                     msg=("Doesn't match expected type description: %s" %
171                          self.EXP_TYPES))
172
173
174 if __name__ == "__main__":
175   testutils.GanetiTestProgram()