Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.storage.filestorage_unittest.py @ cd3b4ff4

History | View | Annotate | Download (7.1 kB)

1 820bade9 Helga Velroyen
#!/usr/bin/python
2 820bade9 Helga Velroyen
#
3 820bade9 Helga Velroyen
4 820bade9 Helga Velroyen
# Copyright (C) 2013 Google Inc.
5 820bade9 Helga Velroyen
#
6 820bade9 Helga Velroyen
# This program is free software; you can redistribute it and/or modify
7 820bade9 Helga Velroyen
# it under the terms of the GNU General Public License as published by
8 820bade9 Helga Velroyen
# the Free Software Foundation; either version 2 of the License, or
9 820bade9 Helga Velroyen
# (at your option) any later version.
10 820bade9 Helga Velroyen
#
11 820bade9 Helga Velroyen
# This program is distributed in the hope that it will be useful, but
12 820bade9 Helga Velroyen
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 820bade9 Helga Velroyen
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 820bade9 Helga Velroyen
# General Public License for more details.
15 820bade9 Helga Velroyen
#
16 820bade9 Helga Velroyen
# You should have received a copy of the GNU General Public License
17 820bade9 Helga Velroyen
# along with this program; if not, write to the Free Software
18 820bade9 Helga Velroyen
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 820bade9 Helga Velroyen
# 02110-1301, USA.
20 820bade9 Helga Velroyen
21 820bade9 Helga Velroyen
22 820bade9 Helga Velroyen
"""Script for unittesting the ganeti.storage.file module"""
23 820bade9 Helga Velroyen
24 9c1c3c19 Helga Velroyen
import os
25 9c1c3c19 Helga Velroyen
import shutil
26 9c1c3c19 Helga Velroyen
import tempfile
27 820bade9 Helga Velroyen
import unittest
28 820bade9 Helga Velroyen
29 820bade9 Helga Velroyen
from ganeti import errors
30 820bade9 Helga Velroyen
from ganeti.storage import filestorage
31 f3ebe73e Helga Velroyen
from ganeti import utils
32 820bade9 Helga Velroyen
33 820bade9 Helga Velroyen
import testutils
34 820bade9 Helga Velroyen
35 820bade9 Helga Velroyen
36 820bade9 Helga Velroyen
class TestFileStorageSpaceInfo(unittest.TestCase):
37 820bade9 Helga Velroyen
38 820bade9 Helga Velroyen
  def testSpaceInfoPathInvalid(self):
39 e798d484 Helga Velroyen
    """Tests that an error is raised when the given path is not existing.
40 820bade9 Helga Velroyen

41 820bade9 Helga Velroyen
    """
42 e798d484 Helga Velroyen
    self.assertRaises(errors.CommandError, filestorage.GetFileStorageSpaceInfo,
43 820bade9 Helga Velroyen
                      "/path/does/not/exist/")
44 820bade9 Helga Velroyen
45 820bade9 Helga Velroyen
  def testSpaceInfoPathValid(self):
46 e798d484 Helga Velroyen
    """Smoke test run on a directory that exists for sure.
47 820bade9 Helga Velroyen

48 820bade9 Helga Velroyen
    """
49 9c1c3c19 Helga Velroyen
    filestorage.GetFileStorageSpaceInfo("/")
50 9c1c3c19 Helga Velroyen
51 9c1c3c19 Helga Velroyen
52 9c1c3c19 Helga Velroyen
class TestCheckFileStoragePath(unittest.TestCase):
53 9c1c3c19 Helga Velroyen
  def _WriteAllowedFile(self, allowed_paths_filename, allowed_paths):
54 9c1c3c19 Helga Velroyen
    allowed_paths_file = open(allowed_paths_filename, 'w')
55 9c1c3c19 Helga Velroyen
    allowed_paths_file.write('\n'.join(allowed_paths))
56 9c1c3c19 Helga Velroyen
    allowed_paths_file.close()
57 9c1c3c19 Helga Velroyen
58 9c1c3c19 Helga Velroyen
  def setUp(self):
59 9c1c3c19 Helga Velroyen
    self.tmpdir = tempfile.mkdtemp()
60 9c1c3c19 Helga Velroyen
    self.allowed_paths = [os.path.join(self.tmpdir, "allowed")]
61 9c1c3c19 Helga Velroyen
    for path in self.allowed_paths:
62 9c1c3c19 Helga Velroyen
      os.mkdir(path)
63 9c1c3c19 Helga Velroyen
    self.allowed_paths_filename = os.path.join(self.tmpdir, "allowed-path-file")
64 9c1c3c19 Helga Velroyen
    self._WriteAllowedFile(self.allowed_paths_filename, self.allowed_paths)
65 9c1c3c19 Helga Velroyen
66 9c1c3c19 Helga Velroyen
  def tearDown(self):
67 9c1c3c19 Helga Velroyen
    shutil.rmtree(self.tmpdir)
68 9c1c3c19 Helga Velroyen
69 9c1c3c19 Helga Velroyen
  def testCheckFileStoragePathExistance(self):
70 9c1c3c19 Helga Velroyen
    filestorage._CheckFileStoragePathExistance(self.tmpdir)
71 9c1c3c19 Helga Velroyen
72 9c1c3c19 Helga Velroyen
  def testCheckFileStoragePathExistanceFail(self):
73 9c1c3c19 Helga Velroyen
    path = os.path.join(self.tmpdir, "does/not/exist")
74 9c1c3c19 Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
75 9c1c3c19 Helga Velroyen
        filestorage._CheckFileStoragePathExistance, path)
76 9c1c3c19 Helga Velroyen
77 9c1c3c19 Helga Velroyen
  def testCheckFileStoragePathNotWritable(self):
78 9c1c3c19 Helga Velroyen
    path = os.path.join(self.tmpdir, "isnotwritable/")
79 9c1c3c19 Helga Velroyen
    os.mkdir(path)
80 9c1c3c19 Helga Velroyen
    os.chmod(path, 0)
81 9c1c3c19 Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
82 9c1c3c19 Helga Velroyen
        filestorage._CheckFileStoragePathExistance, path)
83 9c1c3c19 Helga Velroyen
    os.chmod(path, 777)
84 9c1c3c19 Helga Velroyen
85 9c1c3c19 Helga Velroyen
  def testCheckFileStoragePath(self):
86 9c1c3c19 Helga Velroyen
    path = os.path.join(self.allowed_paths[0], "allowedsubdir")
87 9c1c3c19 Helga Velroyen
    os.mkdir(path)
88 9c1c3c19 Helga Velroyen
    result = filestorage.CheckFileStoragePath(
89 9c1c3c19 Helga Velroyen
        path, _allowed_paths_file=self.allowed_paths_filename)
90 9c1c3c19 Helga Velroyen
    self.assertEqual(None, result)
91 9c1c3c19 Helga Velroyen
92 9c1c3c19 Helga Velroyen
  def testCheckFileStoragePathNotAllowed(self):
93 9c1c3c19 Helga Velroyen
    path = os.path.join(self.tmpdir, "notallowed")
94 9c1c3c19 Helga Velroyen
    result = filestorage.CheckFileStoragePath(
95 9c1c3c19 Helga Velroyen
        path, _allowed_paths_file=self.allowed_paths_filename)
96 9c1c3c19 Helga Velroyen
    self.assertTrue("not acceptable" in result)
97 820bade9 Helga Velroyen
98 820bade9 Helga Velroyen
99 f3ebe73e Helga Velroyen
class TestLoadAllowedFileStoragePaths(testutils.GanetiTestCase):
100 f3ebe73e Helga Velroyen
  def testDevNull(self):
101 f3ebe73e Helga Velroyen
    self.assertEqual(filestorage._LoadAllowedFileStoragePaths("/dev/null"), [])
102 f3ebe73e Helga Velroyen
103 f3ebe73e Helga Velroyen
  def testNonExistantFile(self):
104 f3ebe73e Helga Velroyen
    filename = "/tmp/this/file/does/not/exist"
105 f3ebe73e Helga Velroyen
    assert not os.path.exists(filename)
106 f3ebe73e Helga Velroyen
    self.assertEqual(filestorage._LoadAllowedFileStoragePaths(filename), [])
107 f3ebe73e Helga Velroyen
108 f3ebe73e Helga Velroyen
  def test(self):
109 f3ebe73e Helga Velroyen
    tmpfile = self._CreateTempFile()
110 f3ebe73e Helga Velroyen
111 f3ebe73e Helga Velroyen
    utils.WriteFile(tmpfile, data="""
112 f3ebe73e Helga Velroyen
      # This is a test file
113 f3ebe73e Helga Velroyen
      /tmp
114 f3ebe73e Helga Velroyen
      /srv/storage
115 f3ebe73e Helga Velroyen
      relative/path
116 f3ebe73e Helga Velroyen
      """)
117 f3ebe73e Helga Velroyen
118 f3ebe73e Helga Velroyen
    self.assertEqual(filestorage._LoadAllowedFileStoragePaths(tmpfile), [
119 f3ebe73e Helga Velroyen
      "/tmp",
120 f3ebe73e Helga Velroyen
      "/srv/storage",
121 f3ebe73e Helga Velroyen
      "relative/path",
122 f3ebe73e Helga Velroyen
      ])
123 f3ebe73e Helga Velroyen
124 f3ebe73e Helga Velroyen
125 f3ebe73e Helga Velroyen
class TestComputeWrongFileStoragePathsInternal(unittest.TestCase):
126 f3ebe73e Helga Velroyen
  def testPaths(self):
127 f3ebe73e Helga Velroyen
    paths = filestorage._GetForbiddenFileStoragePaths()
128 f3ebe73e Helga Velroyen
129 f3ebe73e Helga Velroyen
    for path in ["/bin", "/usr/local/sbin", "/lib64", "/etc", "/sys"]:
130 f3ebe73e Helga Velroyen
      self.assertTrue(path in paths)
131 f3ebe73e Helga Velroyen
132 f3ebe73e Helga Velroyen
    self.assertEqual(set(map(os.path.normpath, paths)), paths)
133 f3ebe73e Helga Velroyen
134 f3ebe73e Helga Velroyen
  def test(self):
135 f3ebe73e Helga Velroyen
    vfsp = filestorage._ComputeWrongFileStoragePaths
136 f3ebe73e Helga Velroyen
    self.assertEqual(vfsp([]), [])
137 f3ebe73e Helga Velroyen
    self.assertEqual(vfsp(["/tmp"]), [])
138 f3ebe73e Helga Velroyen
    self.assertEqual(vfsp(["/bin/ls"]), ["/bin/ls"])
139 f3ebe73e Helga Velroyen
    self.assertEqual(vfsp(["/bin"]), ["/bin"])
140 f3ebe73e Helga Velroyen
    self.assertEqual(vfsp(["/usr/sbin/vim", "/srv/file-storage"]),
141 f3ebe73e Helga Velroyen
                     ["/usr/sbin/vim"])
142 f3ebe73e Helga Velroyen
143 f3ebe73e Helga Velroyen
144 f3ebe73e Helga Velroyen
class TestComputeWrongFileStoragePaths(testutils.GanetiTestCase):
145 f3ebe73e Helga Velroyen
  def test(self):
146 f3ebe73e Helga Velroyen
    tmpfile = self._CreateTempFile()
147 f3ebe73e Helga Velroyen
148 f3ebe73e Helga Velroyen
    utils.WriteFile(tmpfile, data="""
149 f3ebe73e Helga Velroyen
      /tmp
150 f3ebe73e Helga Velroyen
      x/y///z/relative
151 f3ebe73e Helga Velroyen
      # This is a test file
152 f3ebe73e Helga Velroyen
      /srv/storage
153 f3ebe73e Helga Velroyen
      /bin
154 f3ebe73e Helga Velroyen
      /usr/local/lib32/
155 f3ebe73e Helga Velroyen
      relative/path
156 f3ebe73e Helga Velroyen
      """)
157 f3ebe73e Helga Velroyen
158 f3ebe73e Helga Velroyen
    self.assertEqual(
159 f3ebe73e Helga Velroyen
        filestorage.ComputeWrongFileStoragePaths(_filename=tmpfile),
160 f3ebe73e Helga Velroyen
        ["/bin",
161 f3ebe73e Helga Velroyen
         "/usr/local/lib32",
162 f3ebe73e Helga Velroyen
         "relative/path",
163 f3ebe73e Helga Velroyen
         "x/y/z/relative",
164 f3ebe73e Helga Velroyen
        ])
165 f3ebe73e Helga Velroyen
166 f3ebe73e Helga Velroyen
167 f3ebe73e Helga Velroyen
class TestCheckFileStoragePathInternal(unittest.TestCase):
168 f3ebe73e Helga Velroyen
  def testNonAbsolute(self):
169 f3ebe73e Helga Velroyen
    for i in ["", "tmp", "foo/bar/baz"]:
170 f3ebe73e Helga Velroyen
      self.assertRaises(errors.FileStoragePathError,
171 f3ebe73e Helga Velroyen
                        filestorage._CheckFileStoragePath, i, ["/tmp"])
172 f3ebe73e Helga Velroyen
173 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
174 f3ebe73e Helga Velroyen
                      filestorage._CheckFileStoragePath, "/tmp", ["tmp", "xyz"])
175 f3ebe73e Helga Velroyen
176 f3ebe73e Helga Velroyen
  def testNoAllowed(self):
177 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
178 f3ebe73e Helga Velroyen
                      filestorage._CheckFileStoragePath, "/tmp", [])
179 f3ebe73e Helga Velroyen
180 f3ebe73e Helga Velroyen
  def testNoAdditionalPathComponent(self):
181 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
182 f3ebe73e Helga Velroyen
                      filestorage._CheckFileStoragePath, "/tmp/foo",
183 f3ebe73e Helga Velroyen
                      ["/tmp/foo"])
184 f3ebe73e Helga Velroyen
185 f3ebe73e Helga Velroyen
  def testAllowed(self):
186 f3ebe73e Helga Velroyen
    filestorage._CheckFileStoragePath("/tmp/foo/a", ["/tmp/foo"])
187 f3ebe73e Helga Velroyen
    filestorage._CheckFileStoragePath("/tmp/foo/a/x", ["/tmp/foo"])
188 f3ebe73e Helga Velroyen
189 f3ebe73e Helga Velroyen
190 f3ebe73e Helga Velroyen
class TestCheckFileStoragePathExistance(testutils.GanetiTestCase):
191 f3ebe73e Helga Velroyen
  def testNonExistantFile(self):
192 f3ebe73e Helga Velroyen
    filename = "/tmp/this/file/does/not/exist"
193 f3ebe73e Helga Velroyen
    assert not os.path.exists(filename)
194 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
195 f3ebe73e Helga Velroyen
                      filestorage.CheckFileStoragePathAcceptance, "/bin/",
196 f3ebe73e Helga Velroyen
                      _filename=filename)
197 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
198 f3ebe73e Helga Velroyen
                      filestorage.CheckFileStoragePathAcceptance,
199 f3ebe73e Helga Velroyen
                      "/srv/file-storage", _filename=filename)
200 f3ebe73e Helga Velroyen
201 f3ebe73e Helga Velroyen
  def testAllowedPath(self):
202 f3ebe73e Helga Velroyen
    tmpfile = self._CreateTempFile()
203 f3ebe73e Helga Velroyen
204 f3ebe73e Helga Velroyen
    utils.WriteFile(tmpfile, data="""
205 f3ebe73e Helga Velroyen
      /srv/storage
206 f3ebe73e Helga Velroyen
      """)
207 f3ebe73e Helga Velroyen
208 f3ebe73e Helga Velroyen
    filestorage.CheckFileStoragePathAcceptance(
209 f3ebe73e Helga Velroyen
        "/srv/storage/inst1", _filename=tmpfile)
210 f3ebe73e Helga Velroyen
211 f3ebe73e Helga Velroyen
    # No additional path component
212 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
213 f3ebe73e Helga Velroyen
                      filestorage.CheckFileStoragePathAcceptance,
214 f3ebe73e Helga Velroyen
                      "/srv/storage", _filename=tmpfile)
215 f3ebe73e Helga Velroyen
216 f3ebe73e Helga Velroyen
    # Forbidden path
217 f3ebe73e Helga Velroyen
    self.assertRaises(errors.FileStoragePathError,
218 f3ebe73e Helga Velroyen
                      filestorage.CheckFileStoragePathAcceptance,
219 f3ebe73e Helga Velroyen
                      "/usr/lib64/xyz", _filename=tmpfile)
220 f3ebe73e Helga Velroyen
221 f3ebe73e Helga Velroyen
222 820bade9 Helga Velroyen
if __name__ == "__main__":
223 820bade9 Helga Velroyen
  testutils.GanetiTestProgram()