Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.runtime_unittest.py @ 90066780

History | View | Annotate | Download (5.8 kB)

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()