Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.tools.ensure_dirs_unittest.py @ 98dfcaff

History | View | Annotate | Download (6.5 kB)

1 0d2bf835 René Nussbaumer
#!/usr/bin/python
2 0d2bf835 René Nussbaumer
#
3 0d2bf835 René Nussbaumer
4 0d2bf835 René Nussbaumer
# Copyright (C) 2011 Google Inc.
5 0d2bf835 René Nussbaumer
#
6 0d2bf835 René Nussbaumer
# This program is free software; you can redistribute it and/or modify
7 0d2bf835 René Nussbaumer
# it under the terms of the GNU General Public License as published by
8 0d2bf835 René Nussbaumer
# the Free Software Foundation; either version 2 of the License, or
9 0d2bf835 René Nussbaumer
# (at your option) any later version.
10 0d2bf835 René Nussbaumer
#
11 0d2bf835 René Nussbaumer
# This program is distributed in the hope that it will be useful, but
12 0d2bf835 René Nussbaumer
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 0d2bf835 René Nussbaumer
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 0d2bf835 René Nussbaumer
# General Public License for more details.
15 0d2bf835 René Nussbaumer
#
16 0d2bf835 René Nussbaumer
# You should have received a copy of the GNU General Public License
17 0d2bf835 René Nussbaumer
# along with this program; if not, write to the Free Software
18 0d2bf835 René Nussbaumer
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 0d2bf835 René Nussbaumer
# 02110-1301, USA.
20 0d2bf835 René Nussbaumer
21 0d2bf835 René Nussbaumer
22 0d2bf835 René Nussbaumer
"""Script for testing ganeti.tools.ensure_dirs"""
23 0d2bf835 René Nussbaumer
24 0d2bf835 René Nussbaumer
import errno
25 0d2bf835 René Nussbaumer
import stat
26 0d2bf835 René Nussbaumer
import unittest
27 0d2bf835 René Nussbaumer
import os.path
28 0d2bf835 René Nussbaumer
29 0d2bf835 René Nussbaumer
from ganeti.tools import ensure_dirs
30 0d2bf835 René Nussbaumer
31 0d2bf835 René Nussbaumer
import testutils
32 0d2bf835 René Nussbaumer
33 0d2bf835 René Nussbaumer
34 c3f54085 Michael Hanselmann
def _MockStatResult(cb, mode, uid, gid):
35 c3f54085 Michael Hanselmann
  def _fn(path):
36 c3f54085 Michael Hanselmann
    if cb:
37 c3f54085 Michael Hanselmann
      cb()
38 c3f54085 Michael Hanselmann
    return {
39 c3f54085 Michael Hanselmann
      stat.ST_MODE: mode,
40 c3f54085 Michael Hanselmann
      stat.ST_UID: uid,
41 c3f54085 Michael Hanselmann
      stat.ST_GID: gid,
42 c3f54085 Michael Hanselmann
      }
43 c3f54085 Michael Hanselmann
  return _fn
44 c3f54085 Michael Hanselmann
45 c3f54085 Michael Hanselmann
46 c3f54085 Michael Hanselmann
def _RaiseNoEntError():
47 c3f54085 Michael Hanselmann
  raise EnvironmentError(errno.ENOENT, "not found")
48 c3f54085 Michael Hanselmann
49 c3f54085 Michael Hanselmann
50 c3f54085 Michael Hanselmann
def _OtherStatRaise():
51 c3f54085 Michael Hanselmann
  raise EnvironmentError()
52 c3f54085 Michael Hanselmann
53 c3f54085 Michael Hanselmann
54 0d2bf835 René Nussbaumer
class TestEnsureDirsFunctions(unittest.TestCase):
55 c3f54085 Michael Hanselmann
  UID_A = 16024
56 c3f54085 Michael Hanselmann
  UID_B = 25850
57 c3f54085 Michael Hanselmann
  GID_A = 14028
58 c3f54085 Michael Hanselmann
  GID_B = 29801
59 0d2bf835 René Nussbaumer
60 c3f54085 Michael Hanselmann
  def setUp(self):
61 c3f54085 Michael Hanselmann
    self._chown_calls = []
62 c3f54085 Michael Hanselmann
    self._chmod_calls = []
63 c3f54085 Michael Hanselmann
    self._mkdir_calls = []
64 c3f54085 Michael Hanselmann
65 c3f54085 Michael Hanselmann
  def tearDown(self):
66 c3f54085 Michael Hanselmann
    self.assertRaises(IndexError, self._mkdir_calls.pop)
67 c3f54085 Michael Hanselmann
    self.assertRaises(IndexError, self._chmod_calls.pop)
68 c3f54085 Michael Hanselmann
    self.assertRaises(IndexError, self._chown_calls.pop)
69 0d2bf835 René Nussbaumer
70 c3f54085 Michael Hanselmann
  def _FakeMkdir(self, path):
71 c3f54085 Michael Hanselmann
    self._mkdir_calls.append(path)
72 0d2bf835 René Nussbaumer
73 c3f54085 Michael Hanselmann
  def _FakeChown(self, path, uid, gid):
74 c3f54085 Michael Hanselmann
    self._chown_calls.append((path, uid, gid))
75 0d2bf835 René Nussbaumer
76 c3f54085 Michael Hanselmann
  def _ChmodWrapper(self, cb):
77 0d2bf835 René Nussbaumer
    def _fn(path, mode):
78 c3f54085 Michael Hanselmann
      self._chmod_calls.append((path, mode))
79 c3f54085 Michael Hanselmann
      if cb:
80 c3f54085 Michael Hanselmann
        cb()
81 0d2bf835 René Nussbaumer
    return _fn
82 0d2bf835 René Nussbaumer
83 c3f54085 Michael Hanselmann
  def _VerifyEnsure(self, path, mode, uid=-1, gid=-1):
84 c3f54085 Michael Hanselmann
    self.assertEqual(path, "/ganeti-qa-non-test")
85 c3f54085 Michael Hanselmann
    self.assertEqual(mode, 0700)
86 c3f54085 Michael Hanselmann
    self.assertEqual(uid, self.UID_A)
87 c3f54085 Michael Hanselmann
    self.assertEqual(gid, self.GID_A)
88 0d2bf835 René Nussbaumer
89 0d2bf835 René Nussbaumer
  def testEnsureDir(self):
90 c3f54085 Michael Hanselmann
    is_dir_stat = _MockStatResult(None, stat.S_IFDIR, 0, 0)
91 c3f54085 Michael Hanselmann
    ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A,
92 c3f54085 Michael Hanselmann
                          _lstat_fn=is_dir_stat, _ensure_fn=self._VerifyEnsure)
93 0d2bf835 René Nussbaumer
94 c3f54085 Michael Hanselmann
  def testEnsureDirErrors(self):
95 0d2bf835 René Nussbaumer
    self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
96 0d2bf835 René Nussbaumer
                      "/ganeti-qa-non-test", 0700, 0, 0,
97 c3f54085 Michael Hanselmann
                      _lstat_fn=_MockStatResult(None, 0, 0, 0))
98 c3f54085 Michael Hanselmann
    self.assertRaises(IndexError, self._mkdir_calls.pop)
99 c3f54085 Michael Hanselmann
100 c3f54085 Michael Hanselmann
    other_stat_raise = _MockStatResult(_OtherStatRaise, stat.S_IFDIR, 0, 0)
101 0d2bf835 René Nussbaumer
    self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsureDir,
102 0d2bf835 René Nussbaumer
                      "/ganeti-qa-non-test", 0700, 0, 0,
103 d00a730d Michael Hanselmann
                      _lstat_fn=other_stat_raise)
104 c3f54085 Michael Hanselmann
    self.assertRaises(IndexError, self._mkdir_calls.pop)
105 c3f54085 Michael Hanselmann
106 c3f54085 Michael Hanselmann
    non_exist_stat = _MockStatResult(_RaiseNoEntError, stat.S_IFDIR, 0, 0)
107 c3f54085 Michael Hanselmann
    ensure_dirs.EnsureDir("/ganeti-qa-non-test", 0700, self.UID_A, self.GID_A,
108 c3f54085 Michael Hanselmann
                          _lstat_fn=non_exist_stat, _mkdir_fn=self._FakeMkdir,
109 0d2bf835 René Nussbaumer
                          _ensure_fn=self._VerifyEnsure)
110 c3f54085 Michael Hanselmann
    self.assertEqual(self._mkdir_calls.pop(0), "/ganeti-qa-non-test")
111 0d2bf835 René Nussbaumer
112 c3f54085 Michael Hanselmann
  def testEnsurePermissionNoEnt(self):
113 0d2bf835 René Nussbaumer
    self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
114 0d2bf835 René Nussbaumer
                      "/ganeti-qa-non-test", 0600,
115 c3f54085 Michael Hanselmann
                      _chmod_fn=NotImplemented, _chown_fn=NotImplemented,
116 c3f54085 Michael Hanselmann
                      _stat_fn=_MockStatResult(_RaiseNoEntError, 0, 0, 0))
117 c3f54085 Michael Hanselmann
118 c3f54085 Michael Hanselmann
  def testEnsurePermissionNoEntMustNotExist(self):
119 0d2bf835 René Nussbaumer
    ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600, must_exist=False,
120 c3f54085 Michael Hanselmann
                                 _chmod_fn=NotImplemented,
121 c3f54085 Michael Hanselmann
                                 _chown_fn=NotImplemented,
122 c3f54085 Michael Hanselmann
                                 _stat_fn=_MockStatResult(_RaiseNoEntError,
123 c3f54085 Michael Hanselmann
                                                          0, 0, 0))
124 c3f54085 Michael Hanselmann
125 c3f54085 Michael Hanselmann
  def testEnsurePermissionOtherErrorMustNotExist(self):
126 0d2bf835 René Nussbaumer
    self.assertRaises(ensure_dirs.EnsureError, ensure_dirs.EnsurePermission,
127 0d2bf835 René Nussbaumer
                      "/ganeti-qa-non-test", 0600, must_exist=False,
128 c3f54085 Michael Hanselmann
                      _chmod_fn=NotImplemented, _chown_fn=NotImplemented,
129 c3f54085 Michael Hanselmann
                      _stat_fn=_MockStatResult(_OtherStatRaise, 0, 0, 0))
130 c3f54085 Michael Hanselmann
131 c3f54085 Michael Hanselmann
  def testEnsurePermissionNoChanges(self):
132 c3f54085 Michael Hanselmann
    ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600,
133 c3f54085 Michael Hanselmann
                                 _stat_fn=_MockStatResult(None, 0600, 0, 0),
134 c3f54085 Michael Hanselmann
                                 _chmod_fn=self._ChmodWrapper(None),
135 c3f54085 Michael Hanselmann
                                 _chown_fn=self._FakeChown)
136 c3f54085 Michael Hanselmann
137 c3f54085 Michael Hanselmann
  def testEnsurePermissionChangeMode(self):
138 c3f54085 Michael Hanselmann
    ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0444,
139 c3f54085 Michael Hanselmann
                                 _stat_fn=_MockStatResult(None, 0600, 0, 0),
140 c3f54085 Michael Hanselmann
                                 _chmod_fn=self._ChmodWrapper(None),
141 c3f54085 Michael Hanselmann
                                 _chown_fn=self._FakeChown)
142 c3f54085 Michael Hanselmann
    self.assertEqual(self._chmod_calls.pop(0), ("/ganeti-qa-non-test", 0444))
143 c3f54085 Michael Hanselmann
144 c3f54085 Michael Hanselmann
  def testEnsurePermissionSetUidGid(self):
145 0d2bf835 René Nussbaumer
    ensure_dirs.EnsurePermission("/ganeti-qa-non-test", 0600,
146 c3f54085 Michael Hanselmann
                                 uid=self.UID_B, gid=self.GID_B,
147 c3f54085 Michael Hanselmann
                                 _stat_fn=_MockStatResult(None, 0600,
148 c3f54085 Michael Hanselmann
                                                          self.UID_A,
149 c3f54085 Michael Hanselmann
                                                          self.GID_A),
150 c3f54085 Michael Hanselmann
                                 _chmod_fn=self._ChmodWrapper(None),
151 c3f54085 Michael Hanselmann
                                 _chown_fn=self._FakeChown)
152 c3f54085 Michael Hanselmann
    self.assertEqual(self._chown_calls.pop(0),
153 c3f54085 Michael Hanselmann
                     ("/ganeti-qa-non-test", self.UID_B, self.GID_B))
154 0d2bf835 René Nussbaumer
155 0d2bf835 René Nussbaumer
  def testPaths(self):
156 0d2bf835 René Nussbaumer
    paths = [(path[0], path[1]) for path in ensure_dirs.GetPaths()]
157 0d2bf835 René Nussbaumer
158 0d2bf835 René Nussbaumer
    seen = []
159 0d2bf835 René Nussbaumer
    last_dirname = ""
160 0d2bf835 René Nussbaumer
    for path, pathtype in paths:
161 0d2bf835 René Nussbaumer
      self.assertTrue(pathtype in ensure_dirs.ALL_TYPES)
162 0d2bf835 René Nussbaumer
      dirname = os.path.dirname(path)
163 0d2bf835 René Nussbaumer
      if dirname != last_dirname or pathtype == ensure_dirs.DIR:
164 0d2bf835 René Nussbaumer
        if pathtype == ensure_dirs.FILE:
165 0d2bf835 René Nussbaumer
          self.assertFalse(dirname in seen,
166 0d2bf835 René Nussbaumer
                           msg="path %s; dirname %s seen in %s" % (path,
167 0d2bf835 René Nussbaumer
                                                                   dirname,
168 0d2bf835 René Nussbaumer
                                                                   seen))
169 0d2bf835 René Nussbaumer
          last_dirname = dirname
170 0d2bf835 René Nussbaumer
          seen.append(dirname)
171 0d2bf835 René Nussbaumer
        elif pathtype == ensure_dirs.DIR:
172 0d2bf835 René Nussbaumer
          self.assertFalse(path in seen)
173 0d2bf835 René Nussbaumer
          last_dirname = path
174 0d2bf835 René Nussbaumer
          seen.append(path)
175 0d2bf835 René Nussbaumer
176 0d2bf835 René Nussbaumer
177 0d2bf835 René Nussbaumer
if __name__ == "__main__":
178 0d2bf835 René Nussbaumer
  testutils.GanetiTestProgram()