Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.bdev_unittest.py @ fe4f6dca

History | View | Annotate | Download (15.4 kB)

1 3840729d Iustin Pop
#!/usr/bin/python
2 3840729d Iustin Pop
#
3 3840729d Iustin Pop
4 fcee765d Manuel Franceschini
# Copyright (C) 2006, 2007, 2010 Google Inc.
5 3840729d Iustin Pop
#
6 3840729d Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 3840729d Iustin Pop
# it under the terms of the GNU General Public License as published by
8 3840729d Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 3840729d Iustin Pop
# (at your option) any later version.
10 3840729d Iustin Pop
#
11 3840729d Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 3840729d Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 3840729d Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 3840729d Iustin Pop
# General Public License for more details.
15 3840729d Iustin Pop
#
16 3840729d Iustin Pop
# You should have received a copy of the GNU General Public License
17 3840729d Iustin Pop
# along with this program; if not, write to the Free Software
18 3840729d Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 3840729d Iustin Pop
# 02110-1301, USA.
20 3840729d Iustin Pop
21 3840729d Iustin Pop
22 3840729d Iustin Pop
"""Script for unittesting the bdev module"""
23 3840729d Iustin Pop
24 3840729d Iustin Pop
25 6634816b Iustin Pop
import os
26 3840729d Iustin Pop
import unittest
27 3840729d Iustin Pop
28 3840729d Iustin Pop
from ganeti import bdev
29 6b90c22e Iustin Pop
from ganeti import errors
30 8a69b3a8 Andrea Spadaccini
from ganeti import constants
31 fbdac0d9 Michael Hanselmann
from ganeti import utils
32 3840729d Iustin Pop
33 25231ec5 Michael Hanselmann
import testutils
34 25231ec5 Michael Hanselmann
35 3840729d Iustin Pop
36 fcee765d Manuel Franceschini
class TestBaseDRBD(testutils.GanetiTestCase):
37 fcee765d Manuel Franceschini
  def testGetVersion(self):
38 fcee765d Manuel Franceschini
    data = [
39 fcee765d Manuel Franceschini
      ["version: 8.0.12 (api:76/proto:86-91)"],
40 fcee765d Manuel Franceschini
      ["version: 8.2.7 (api:88/proto:0-100)"],
41 fcee765d Manuel Franceschini
      ["version: 8.3.7.49 (api:188/proto:13-191)"],
42 fcee765d Manuel Franceschini
    ]
43 fcee765d Manuel Franceschini
    result = [
44 fcee765d Manuel Franceschini
      {
45 fcee765d Manuel Franceschini
      "k_major": 8,
46 fcee765d Manuel Franceschini
      "k_minor": 0,
47 fcee765d Manuel Franceschini
      "k_point": 12,
48 fcee765d Manuel Franceschini
      "api": 76,
49 fcee765d Manuel Franceschini
      "proto": 86,
50 fcee765d Manuel Franceschini
      "proto2": "91",
51 fcee765d Manuel Franceschini
      },
52 fcee765d Manuel Franceschini
      {
53 fcee765d Manuel Franceschini
      "k_major": 8,
54 fcee765d Manuel Franceschini
      "k_minor": 2,
55 fcee765d Manuel Franceschini
      "k_point": 7,
56 fcee765d Manuel Franceschini
      "api": 88,
57 fcee765d Manuel Franceschini
      "proto": 0,
58 fcee765d Manuel Franceschini
      "proto2": "100",
59 fcee765d Manuel Franceschini
      },
60 fcee765d Manuel Franceschini
      {
61 fcee765d Manuel Franceschini
      "k_major": 8,
62 fcee765d Manuel Franceschini
      "k_minor": 3,
63 fcee765d Manuel Franceschini
      "k_point": 7,
64 fcee765d Manuel Franceschini
      "api": 188,
65 fcee765d Manuel Franceschini
      "proto": 13,
66 fcee765d Manuel Franceschini
      "proto2": "191",
67 fcee765d Manuel Franceschini
      }
68 fcee765d Manuel Franceschini
    ]
69 fcee765d Manuel Franceschini
    for d,r in zip(data, result):
70 fcee765d Manuel Franceschini
      self.assertEqual(bdev.BaseDRBD._GetVersion(d), r)
71 fcee765d Manuel Franceschini
72 fcee765d Manuel Franceschini
73 149a5439 Iustin Pop
class TestDRBD8Runner(testutils.GanetiTestCase):
74 3840729d Iustin Pop
  """Testing case for DRBD8"""
75 3840729d Iustin Pop
76 3840729d Iustin Pop
  @staticmethod
77 3840729d Iustin Pop
  def _has_disk(data, dname, mname):
78 3840729d Iustin Pop
    """Check local disk corectness"""
79 3840729d Iustin Pop
    retval = (
80 3840729d Iustin Pop
      "local_dev" in data and
81 3840729d Iustin Pop
      data["local_dev"] == dname and
82 3840729d Iustin Pop
      "meta_dev" in data and
83 3840729d Iustin Pop
      data["meta_dev"] == mname and
84 3840729d Iustin Pop
      "meta_index" in data and
85 3840729d Iustin Pop
      data["meta_index"] == 0
86 3840729d Iustin Pop
      )
87 3840729d Iustin Pop
    return retval
88 3840729d Iustin Pop
89 3840729d Iustin Pop
  @staticmethod
90 3840729d Iustin Pop
  def _has_net(data, local, remote):
91 3840729d Iustin Pop
    """Check network connection parameters"""
92 3840729d Iustin Pop
    retval = (
93 3840729d Iustin Pop
      "local_addr" in data and
94 3840729d Iustin Pop
      data["local_addr"] == local and
95 3840729d Iustin Pop
      "remote_addr" in data and
96 3840729d Iustin Pop
      data["remote_addr"] == remote
97 3840729d Iustin Pop
      )
98 3840729d Iustin Pop
    return retval
99 3840729d Iustin Pop
100 3840729d Iustin Pop
  def testParserCreation(self):
101 3840729d Iustin Pop
    """Test drbdsetup show parser creation"""
102 3840729d Iustin Pop
    bdev.DRBD8._GetShowParser()
103 3840729d Iustin Pop
104 5a672c30 Manuel Franceschini
  def testParser80(self):
105 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk and network version 8.0"""
106 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-8.0.txt")
107 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
108 3840729d Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
109 3840729d Iustin Pop
                                   "/dev/xenvg/test.meta"),
110 3840729d Iustin Pop
                    "Wrong local disk info")
111 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11000),
112 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11000)),
113 01e2ce3a Iustin Pop
                    "Wrong network info (8.0.x)")
114 01e2ce3a Iustin Pop
115 5a672c30 Manuel Franceschini
  def testParser83(self):
116 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk and network version 8.3"""
117 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-8.3.txt")
118 01e2ce3a Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
119 01e2ce3a Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
120 01e2ce3a Iustin Pop
                                   "/dev/xenvg/test.meta"),
121 01e2ce3a Iustin Pop
                    "Wrong local disk info")
122 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11000),
123 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11000)),
124 5a672c30 Manuel Franceschini
                    "Wrong network info (8.0.x)")
125 3840729d Iustin Pop
126 5a672c30 Manuel Franceschini
  def testParserNetIP4(self):
127 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for IPv4 network"""
128 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-net-ip4.txt")
129 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
130 3840729d Iustin Pop
    self.failUnless(("local_dev" not in result and
131 3840729d Iustin Pop
                     "meta_dev" not in result and
132 3840729d Iustin Pop
                     "meta_index" not in result),
133 3840729d Iustin Pop
                    "Should not find local disk info")
134 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11002),
135 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11002)),
136 5a672c30 Manuel Franceschini
                    "Wrong network info (IPv4)")
137 5a672c30 Manuel Franceschini
138 5a672c30 Manuel Franceschini
  def testParserNetIP6(self):
139 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for IPv6 network"""
140 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-net-ip6.txt")
141 5a672c30 Manuel Franceschini
    result = bdev.DRBD8._GetDevInfo(data)
142 5a672c30 Manuel Franceschini
    self.failUnless(("local_dev" not in result and
143 5a672c30 Manuel Franceschini
                     "meta_dev" not in result and
144 5a672c30 Manuel Franceschini
                     "meta_index" not in result),
145 5a672c30 Manuel Franceschini
                    "Should not find local disk info")
146 5a672c30 Manuel Franceschini
    self.failUnless(self._has_net(result, ("2001:db8:65::1", 11048),
147 5a672c30 Manuel Franceschini
                                  ("2001:db8:66::1", 11048)),
148 5a672c30 Manuel Franceschini
                    "Wrong network info (IPv6)")
149 3840729d Iustin Pop
150 3840729d Iustin Pop
  def testParserDisk(self):
151 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk"""
152 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-disk.txt")
153 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
154 3840729d Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
155 3840729d Iustin Pop
                                   "/dev/xenvg/test.meta"),
156 3840729d Iustin Pop
                    "Wrong local disk info")
157 3840729d Iustin Pop
    self.failUnless(("local_addr" not in result and
158 3840729d Iustin Pop
                     "remote_addr" not in result),
159 3840729d Iustin Pop
                    "Should not find network info")
160 3840729d Iustin Pop
161 8a69b3a8 Andrea Spadaccini
  def testBarriersOptions(self):
162 8a69b3a8 Andrea Spadaccini
    """Test class method that generates drbdsetup options for disk barriers"""
163 8a69b3a8 Andrea Spadaccini
    # Tests that should fail because of wrong version/options combinations
164 8a69b3a8 Andrea Spadaccini
    should_fail = [
165 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "bfd", True),
166 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "fd", False),
167 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "b", True),
168 8a69b3a8 Andrea Spadaccini
      (8, 2, 7, "bfd", True),
169 8a69b3a8 Andrea Spadaccini
      (8, 2, 7, "b", True)
170 8a69b3a8 Andrea Spadaccini
    ]
171 8a69b3a8 Andrea Spadaccini
172 8a69b3a8 Andrea Spadaccini
    for vmaj, vmin, vrel, opts, meta in should_fail:
173 8a69b3a8 Andrea Spadaccini
      self.assertRaises(errors.BlockDeviceError,
174 8a69b3a8 Andrea Spadaccini
                        bdev.DRBD8._ComputeDiskBarrierArgs,
175 8a69b3a8 Andrea Spadaccini
                        vmaj, vmin, vrel, opts, meta)
176 8a69b3a8 Andrea Spadaccini
177 8a69b3a8 Andrea Spadaccini
    # get the valid options from the frozenset(frozenset()) in constants.
178 8a69b3a8 Andrea Spadaccini
    valid_options = [list(x)[0] for x in constants.DRBD_VALID_BARRIER_OPT]
179 8a69b3a8 Andrea Spadaccini
180 8a69b3a8 Andrea Spadaccini
    # Versions that do not support anything
181 8a69b3a8 Andrea Spadaccini
    for vmaj, vmin, vrel in ((8, 0, 0), (8, 0, 11), (8, 2, 6)):
182 8a69b3a8 Andrea Spadaccini
      for opts in valid_options:
183 8a69b3a8 Andrea Spadaccini
        self.assertRaises(errors.BlockDeviceError,
184 8a69b3a8 Andrea Spadaccini
                          bdev.DRBD8._ComputeDiskBarrierArgs,
185 8a69b3a8 Andrea Spadaccini
                          vmaj, vmin, vrel, opts, True)
186 8a69b3a8 Andrea Spadaccini
187 8a69b3a8 Andrea Spadaccini
    # Versions with partial support (testing only options that are supported)
188 8a69b3a8 Andrea Spadaccini
    tests = [
189 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "n", False, []),
190 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "n", True, ["--no-md-flushes"]),
191 8a69b3a8 Andrea Spadaccini
      (8, 2, 7, "n", False, []),
192 8a69b3a8 Andrea Spadaccini
      (8, 2, 7, "fd", False, ["--no-disk-flushes", "--no-disk-drain"]),
193 8a69b3a8 Andrea Spadaccini
      (8, 0, 12, "n", True, ["--no-md-flushes"]),
194 8a69b3a8 Andrea Spadaccini
      ]
195 8a69b3a8 Andrea Spadaccini
196 8a69b3a8 Andrea Spadaccini
    # Versions that support everything
197 8a69b3a8 Andrea Spadaccini
    for vmaj, vmin, vrel in ((8, 3, 0), (8, 3, 12)):
198 8a69b3a8 Andrea Spadaccini
      tests.append((vmaj, vmin, vrel, "bfd", True,
199 8a69b3a8 Andrea Spadaccini
                    ["--no-disk-barrier", "--no-disk-drain",
200 8a69b3a8 Andrea Spadaccini
                     "--no-disk-flushes", "--no-md-flushes"]))
201 8a69b3a8 Andrea Spadaccini
      tests.append((vmaj, vmin, vrel, "n", False, []))
202 8a69b3a8 Andrea Spadaccini
      tests.append((vmaj, vmin, vrel, "b", True,
203 8a69b3a8 Andrea Spadaccini
                    ["--no-disk-barrier", "--no-md-flushes"]))
204 8a69b3a8 Andrea Spadaccini
      tests.append((vmaj, vmin, vrel, "fd", False,
205 8a69b3a8 Andrea Spadaccini
                    ["--no-disk-flushes", "--no-disk-drain"]))
206 8a69b3a8 Andrea Spadaccini
      tests.append((vmaj, vmin, vrel, "n", True, ["--no-md-flushes"]))
207 8a69b3a8 Andrea Spadaccini
208 8a69b3a8 Andrea Spadaccini
    # Test execution
209 8a69b3a8 Andrea Spadaccini
    for test in tests:
210 8a69b3a8 Andrea Spadaccini
      vmaj, vmin, vrel, disabled_barriers, disable_meta_flush, expected = test
211 8a69b3a8 Andrea Spadaccini
      args = \
212 8a69b3a8 Andrea Spadaccini
        bdev.DRBD8._ComputeDiskBarrierArgs(vmaj, vmin, vrel,
213 8a69b3a8 Andrea Spadaccini
                                           disabled_barriers,
214 8a69b3a8 Andrea Spadaccini
                                           disable_meta_flush)
215 8a69b3a8 Andrea Spadaccini
      self.failUnless(set(args) == set(expected),
216 8a69b3a8 Andrea Spadaccini
                      "For test %s, got wrong results %s" % (test, args))
217 8a69b3a8 Andrea Spadaccini
218 8a69b3a8 Andrea Spadaccini
    # Unsupported or invalid versions
219 8a69b3a8 Andrea Spadaccini
    for vmaj, vmin, vrel in ((0, 7, 25), (9, 0, 0), (7, 0, 0), (8, 4, 0)):
220 8a69b3a8 Andrea Spadaccini
      self.assertRaises(errors.BlockDeviceError,
221 8a69b3a8 Andrea Spadaccini
                        bdev.DRBD8._ComputeDiskBarrierArgs,
222 8a69b3a8 Andrea Spadaccini
                        vmaj, vmin, vrel, "n", True)
223 8a69b3a8 Andrea Spadaccini
224 8a69b3a8 Andrea Spadaccini
    # Invalid options
225 8a69b3a8 Andrea Spadaccini
    for option in ("", "c", "whatever", "nbdfc", "nf"):
226 8a69b3a8 Andrea Spadaccini
      self.assertRaises(errors.BlockDeviceError,
227 8a69b3a8 Andrea Spadaccini
                        bdev.DRBD8._ComputeDiskBarrierArgs,
228 8a69b3a8 Andrea Spadaccini
                        8, 3, 11, option, True)
229 8a69b3a8 Andrea Spadaccini
230 6b90c22e Iustin Pop
231 149a5439 Iustin Pop
class TestDRBD8Status(testutils.GanetiTestCase):
232 6b90c22e Iustin Pop
  """Testing case for DRBD8 /proc status"""
233 6b90c22e Iustin Pop
234 6b90c22e Iustin Pop
  def setUp(self):
235 6b90c22e Iustin Pop
    """Read in txt data"""
236 51596eb2 Iustin Pop
    testutils.GanetiTestCase.setUp(self)
237 149a5439 Iustin Pop
    proc_data = self._TestDataFilename("proc_drbd8.txt")
238 67d101d4 Iustin Pop
    proc80e_data = self._TestDataFilename("proc_drbd80-emptyline.txt")
239 01e2ce3a Iustin Pop
    proc83_data = self._TestDataFilename("proc_drbd83.txt")
240 7a380ddf René Nussbaumer
    proc83_sync_data = self._TestDataFilename("proc_drbd83_sync.txt")
241 7a380ddf René Nussbaumer
    proc83_sync_krnl_data = \
242 7a380ddf René Nussbaumer
      self._TestDataFilename("proc_drbd83_sync_krnl2.6.39.txt")
243 ae9da390 Iustin Pop
    self.proc_data = bdev.DRBD8._GetProcData(filename=proc_data)
244 67d101d4 Iustin Pop
    self.proc80e_data = bdev.DRBD8._GetProcData(filename=proc80e_data)
245 01e2ce3a Iustin Pop
    self.proc83_data = bdev.DRBD8._GetProcData(filename=proc83_data)
246 7a380ddf René Nussbaumer
    self.proc83_sync_data = bdev.DRBD8._GetProcData(filename=proc83_sync_data)
247 7a380ddf René Nussbaumer
    self.proc83_sync_krnl_data = \
248 7a380ddf René Nussbaumer
      bdev.DRBD8._GetProcData(filename=proc83_sync_krnl_data)
249 6b90c22e Iustin Pop
    self.mass_data = bdev.DRBD8._MassageProcData(self.proc_data)
250 67d101d4 Iustin Pop
    self.mass80e_data = bdev.DRBD8._MassageProcData(self.proc80e_data)
251 01e2ce3a Iustin Pop
    self.mass83_data = bdev.DRBD8._MassageProcData(self.proc83_data)
252 7a380ddf René Nussbaumer
    self.mass83_sync_data = bdev.DRBD8._MassageProcData(self.proc83_sync_data)
253 7a380ddf René Nussbaumer
    self.mass83_sync_krnl_data = \
254 7a380ddf René Nussbaumer
      bdev.DRBD8._MassageProcData(self.proc83_sync_krnl_data)
255 6b90c22e Iustin Pop
256 f6eaed12 Iustin Pop
  def testIOErrors(self):
257 f6eaed12 Iustin Pop
    """Test handling of errors while reading the proc file."""
258 f6eaed12 Iustin Pop
    temp_file = self._CreateTempFile()
259 f6eaed12 Iustin Pop
    os.unlink(temp_file)
260 f6eaed12 Iustin Pop
    self.failUnlessRaises(errors.BlockDeviceError,
261 f6eaed12 Iustin Pop
                          bdev.DRBD8._GetProcData, filename=temp_file)
262 f6eaed12 Iustin Pop
263 549071a0 Luca Bigliardi
  def testHelper(self):
264 549071a0 Luca Bigliardi
    """Test reading usermode_helper in /sys."""
265 549071a0 Luca Bigliardi
    sys_drbd_helper = self._TestDataFilename("sys_drbd_usermode_helper.txt")
266 549071a0 Luca Bigliardi
    drbd_helper = bdev.DRBD8.GetUsermodeHelper(filename=sys_drbd_helper)
267 549071a0 Luca Bigliardi
    self.failUnlessEqual(drbd_helper, "/bin/true")
268 549071a0 Luca Bigliardi
269 549071a0 Luca Bigliardi
  def testHelperIOErrors(self):
270 549071a0 Luca Bigliardi
    """Test handling of errors while reading usermode_helper in /sys."""
271 549071a0 Luca Bigliardi
    temp_file = self._CreateTempFile()
272 549071a0 Luca Bigliardi
    os.unlink(temp_file)
273 549071a0 Luca Bigliardi
    self.failUnlessRaises(errors.BlockDeviceError,
274 549071a0 Luca Bigliardi
                          bdev.DRBD8.GetUsermodeHelper, filename=temp_file)
275 549071a0 Luca Bigliardi
276 6b90c22e Iustin Pop
  def testMinorNotFound(self):
277 6b90c22e Iustin Pop
    """Test not-found-minor in /proc"""
278 6b90c22e Iustin Pop
    self.failUnless(9 not in self.mass_data)
279 01e2ce3a Iustin Pop
    self.failUnless(9 not in self.mass83_data)
280 67d101d4 Iustin Pop
    self.failUnless(3 not in self.mass80e_data)
281 6b90c22e Iustin Pop
282 6b90c22e Iustin Pop
  def testLineNotMatch(self):
283 6b90c22e Iustin Pop
    """Test wrong line passed to DRBD8Status"""
284 6b90c22e Iustin Pop
    self.assertRaises(errors.BlockDeviceError, bdev.DRBD8Status, "foo")
285 6b90c22e Iustin Pop
286 6b90c22e Iustin Pop
  def testMinor0(self):
287 6b90c22e Iustin Pop
    """Test connected, primary device"""
288 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
289 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[0])
290 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
291 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_primary and
292 01e2ce3a Iustin Pop
                      stats.peer_secondary and stats.is_disk_uptodate)
293 6b90c22e Iustin Pop
294 6b90c22e Iustin Pop
  def testMinor1(self):
295 6b90c22e Iustin Pop
    """Test connected, secondary device"""
296 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
297 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[1])
298 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
299 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_secondary and
300 01e2ce3a Iustin Pop
                      stats.peer_primary and stats.is_disk_uptodate)
301 6b90c22e Iustin Pop
302 767d52d3 Iustin Pop
  def testMinor2(self):
303 767d52d3 Iustin Pop
    """Test unconfigured device"""
304 67d101d4 Iustin Pop
    for data in [self.mass_data, self.mass83_data, self.mass80e_data]:
305 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[2])
306 01e2ce3a Iustin Pop
      self.failIf(stats.is_in_use)
307 767d52d3 Iustin Pop
308 6b90c22e Iustin Pop
  def testMinor4(self):
309 6b90c22e Iustin Pop
    """Test WFconn device"""
310 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
311 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[4])
312 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
313 01e2ce3a Iustin Pop
      self.failUnless(stats.is_wfconn and stats.is_primary and
314 01e2ce3a Iustin Pop
                      stats.rrole == 'Unknown' and
315 01e2ce3a Iustin Pop
                      stats.is_disk_uptodate)
316 6b90c22e Iustin Pop
317 6b90c22e Iustin Pop
  def testMinor6(self):
318 6b90c22e Iustin Pop
    """Test diskless device"""
319 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
320 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[6])
321 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
322 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_secondary and
323 01e2ce3a Iustin Pop
                      stats.peer_primary and stats.is_diskless)
324 6b90c22e Iustin Pop
325 6b90c22e Iustin Pop
  def testMinor8(self):
326 6b90c22e Iustin Pop
    """Test standalone device"""
327 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
328 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[8])
329 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
330 01e2ce3a Iustin Pop
      self.failUnless(stats.is_standalone and
331 01e2ce3a Iustin Pop
                      stats.rrole == 'Unknown' and
332 01e2ce3a Iustin Pop
                      stats.is_disk_uptodate)
333 6b90c22e Iustin Pop
334 7a380ddf René Nussbaumer
  def testDRBD83SyncFine(self):
335 7a380ddf René Nussbaumer
    stats = bdev.DRBD8Status(self.mass83_sync_data[3])
336 7a380ddf René Nussbaumer
    self.failUnless(stats.is_in_resync)
337 7a380ddf René Nussbaumer
    self.failUnless(stats.sync_percent is not None)
338 7a380ddf René Nussbaumer
339 7a380ddf René Nussbaumer
  def testDRBD83SyncBroken(self):
340 7a380ddf René Nussbaumer
    stats = bdev.DRBD8Status(self.mass83_sync_krnl_data[3])
341 7a380ddf René Nussbaumer
    self.failUnless(stats.is_in_resync)
342 7a380ddf René Nussbaumer
    self.failUnless(stats.sync_percent is not None)
343 7a380ddf René Nussbaumer
344 7181fba0 Constantinos Venetsanopoulos
345 7181fba0 Constantinos Venetsanopoulos
class TestRADOSBlockDevice(testutils.GanetiTestCase):
346 7181fba0 Constantinos Venetsanopoulos
  def test_ParseRbdShowmappedOutput(self):
347 7181fba0 Constantinos Venetsanopoulos
    volume_name = "abc9778-8e8ace5b.rbd.disk0"
348 7181fba0 Constantinos Venetsanopoulos
    output_ok = \
349 7181fba0 Constantinos Venetsanopoulos
      ("0\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
350 7181fba0 Constantinos Venetsanopoulos
       "1\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd16\n"
351 7181fba0 Constantinos Venetsanopoulos
       "line\twith\tfewer\tfields\n"
352 7181fba0 Constantinos Venetsanopoulos
       "")
353 7181fba0 Constantinos Venetsanopoulos
    output_empty = ""
354 7181fba0 Constantinos Venetsanopoulos
    output_no_matches = \
355 7181fba0 Constantinos Venetsanopoulos
      ("0\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
356 7181fba0 Constantinos Venetsanopoulos
       "1\trbd\tabcdef01-9817.rbd.disk0\t-\t/dev/rbd10\n"
357 7181fba0 Constantinos Venetsanopoulos
       "2\trbd\tcdef0123-9817.rbd.disk0\t-\t/dev/rbd12\n"
358 7181fba0 Constantinos Venetsanopoulos
       "something\twith\tfewer\tfields"
359 7181fba0 Constantinos Venetsanopoulos
       "")
360 7181fba0 Constantinos Venetsanopoulos
    output_extra_matches = \
361 7181fba0 Constantinos Venetsanopoulos
      ("0\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd11\n"
362 7181fba0 Constantinos Venetsanopoulos
       "1\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
363 7181fba0 Constantinos Venetsanopoulos
       "2\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd16\n"
364 7181fba0 Constantinos Venetsanopoulos
       "something\twith\tfewer\tfields"
365 7181fba0 Constantinos Venetsanopoulos
       "")
366 7181fba0 Constantinos Venetsanopoulos
367 7181fba0 Constantinos Venetsanopoulos
    parse_function = bdev.RADOSBlockDevice._ParseRbdShowmappedOutput
368 7181fba0 Constantinos Venetsanopoulos
    self.assertEqual(parse_function(output_ok, volume_name), "/dev/rbd16")
369 7181fba0 Constantinos Venetsanopoulos
    self.assertRaises(errors.BlockDeviceError, parse_function,
370 7181fba0 Constantinos Venetsanopoulos
                      output_empty, volume_name)
371 7181fba0 Constantinos Venetsanopoulos
    self.assertEqual(parse_function(output_no_matches, volume_name), None)
372 7181fba0 Constantinos Venetsanopoulos
    self.assertRaises(errors.BlockDeviceError, parse_function,
373 7181fba0 Constantinos Venetsanopoulos
                      output_extra_matches, volume_name)
374 7181fba0 Constantinos Venetsanopoulos
375 7181fba0 Constantinos Venetsanopoulos
376 fbdac0d9 Michael Hanselmann
class TestCheckFileStoragePath(unittest.TestCase):
377 fbdac0d9 Michael Hanselmann
  def testNonAbsolute(self):
378 fbdac0d9 Michael Hanselmann
    for i in ["", "tmp", "foo/bar/baz"]:
379 fbdac0d9 Michael Hanselmann
      self.assertRaises(errors.FileStoragePathError,
380 fbdac0d9 Michael Hanselmann
                        bdev._CheckFileStoragePath, i, ["/tmp"])
381 fbdac0d9 Michael Hanselmann
382 fbdac0d9 Michael Hanselmann
    self.assertRaises(errors.FileStoragePathError,
383 fbdac0d9 Michael Hanselmann
                      bdev._CheckFileStoragePath, "/tmp", ["tmp", "xyz"])
384 fbdac0d9 Michael Hanselmann
385 fbdac0d9 Michael Hanselmann
  def testNoAllowed(self):
386 fbdac0d9 Michael Hanselmann
    self.assertRaises(errors.FileStoragePathError,
387 fbdac0d9 Michael Hanselmann
                      bdev._CheckFileStoragePath, "/tmp", [])
388 fbdac0d9 Michael Hanselmann
389 fbdac0d9 Michael Hanselmann
  def testNoAdditionalPathComponent(self):
390 fbdac0d9 Michael Hanselmann
    self.assertRaises(errors.FileStoragePathError,
391 fbdac0d9 Michael Hanselmann
                      bdev._CheckFileStoragePath, "/tmp/foo", ["/tmp/foo"])
392 fbdac0d9 Michael Hanselmann
393 fbdac0d9 Michael Hanselmann
  def testAllowed(self):
394 fbdac0d9 Michael Hanselmann
    bdev._CheckFileStoragePath("/tmp/foo/a", ["/tmp/foo"])
395 fbdac0d9 Michael Hanselmann
    bdev._CheckFileStoragePath("/tmp/foo/a/x", ["/tmp/foo"])
396 fbdac0d9 Michael Hanselmann
397 fbdac0d9 Michael Hanselmann
398 fbdac0d9 Michael Hanselmann
class TestLoadAllowedFileStoragePaths(testutils.GanetiTestCase):
399 fbdac0d9 Michael Hanselmann
  def testDevNull(self):
400 fbdac0d9 Michael Hanselmann
    self.assertEqual(bdev.LoadAllowedFileStoragePaths("/dev/null"), [])
401 fbdac0d9 Michael Hanselmann
402 fbdac0d9 Michael Hanselmann
  def testNonExistantFile(self):
403 fbdac0d9 Michael Hanselmann
    filename = "/tmp/this/file/does/not/exist"
404 fbdac0d9 Michael Hanselmann
    assert not os.path.exists(filename)
405 fbdac0d9 Michael Hanselmann
    self.assertEqual(bdev.LoadAllowedFileStoragePaths(filename), [])
406 fbdac0d9 Michael Hanselmann
407 fbdac0d9 Michael Hanselmann
  def test(self):
408 fbdac0d9 Michael Hanselmann
    tmpfile = self._CreateTempFile()
409 fbdac0d9 Michael Hanselmann
410 fbdac0d9 Michael Hanselmann
    utils.WriteFile(tmpfile, data="""
411 fbdac0d9 Michael Hanselmann
      # This is a test file
412 fbdac0d9 Michael Hanselmann
      /tmp
413 fbdac0d9 Michael Hanselmann
      /srv/storage
414 fbdac0d9 Michael Hanselmann
      relative/path
415 fbdac0d9 Michael Hanselmann
      """)
416 fbdac0d9 Michael Hanselmann
417 fbdac0d9 Michael Hanselmann
    self.assertEqual(bdev.LoadAllowedFileStoragePaths(tmpfile), [
418 fbdac0d9 Michael Hanselmann
      "/tmp",
419 fbdac0d9 Michael Hanselmann
      "/srv/storage",
420 fbdac0d9 Michael Hanselmann
      "relative/path",
421 fbdac0d9 Michael Hanselmann
      ])
422 fbdac0d9 Michael Hanselmann
423 fbdac0d9 Michael Hanselmann
424 fbdac0d9 Michael Hanselmann
if __name__ == "__main__":
425 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()