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