Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.bdev_unittest.py @ 42d4d8b9

History | View | Annotate | Download (9.7 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 3840729d Iustin Pop
31 25231ec5 Michael Hanselmann
import testutils
32 25231ec5 Michael Hanselmann
33 3840729d Iustin Pop
34 fcee765d Manuel Franceschini
class TestBaseDRBD(testutils.GanetiTestCase):
35 fcee765d Manuel Franceschini
  def testGetVersion(self):
36 fcee765d Manuel Franceschini
    data = [
37 fcee765d Manuel Franceschini
      ["version: 8.0.12 (api:76/proto:86-91)"],
38 fcee765d Manuel Franceschini
      ["version: 8.2.7 (api:88/proto:0-100)"],
39 fcee765d Manuel Franceschini
      ["version: 8.3.7.49 (api:188/proto:13-191)"],
40 fcee765d Manuel Franceschini
    ]
41 fcee765d Manuel Franceschini
    result = [
42 fcee765d Manuel Franceschini
      {
43 fcee765d Manuel Franceschini
      "k_major": 8,
44 fcee765d Manuel Franceschini
      "k_minor": 0,
45 fcee765d Manuel Franceschini
      "k_point": 12,
46 fcee765d Manuel Franceschini
      "api": 76,
47 fcee765d Manuel Franceschini
      "proto": 86,
48 fcee765d Manuel Franceschini
      "proto2": "91",
49 fcee765d Manuel Franceschini
      },
50 fcee765d Manuel Franceschini
      {
51 fcee765d Manuel Franceschini
      "k_major": 8,
52 fcee765d Manuel Franceschini
      "k_minor": 2,
53 fcee765d Manuel Franceschini
      "k_point": 7,
54 fcee765d Manuel Franceschini
      "api": 88,
55 fcee765d Manuel Franceschini
      "proto": 0,
56 fcee765d Manuel Franceschini
      "proto2": "100",
57 fcee765d Manuel Franceschini
      },
58 fcee765d Manuel Franceschini
      {
59 fcee765d Manuel Franceschini
      "k_major": 8,
60 fcee765d Manuel Franceschini
      "k_minor": 3,
61 fcee765d Manuel Franceschini
      "k_point": 7,
62 fcee765d Manuel Franceschini
      "api": 188,
63 fcee765d Manuel Franceschini
      "proto": 13,
64 fcee765d Manuel Franceschini
      "proto2": "191",
65 fcee765d Manuel Franceschini
      }
66 fcee765d Manuel Franceschini
    ]
67 fcee765d Manuel Franceschini
    for d,r in zip(data, result):
68 fcee765d Manuel Franceschini
      self.assertEqual(bdev.BaseDRBD._GetVersion(d), r)
69 fcee765d Manuel Franceschini
70 fcee765d Manuel Franceschini
71 149a5439 Iustin Pop
class TestDRBD8Runner(testutils.GanetiTestCase):
72 3840729d Iustin Pop
  """Testing case for DRBD8"""
73 3840729d Iustin Pop
74 3840729d Iustin Pop
  @staticmethod
75 3840729d Iustin Pop
  def _has_disk(data, dname, mname):
76 3840729d Iustin Pop
    """Check local disk corectness"""
77 3840729d Iustin Pop
    retval = (
78 3840729d Iustin Pop
      "local_dev" in data and
79 3840729d Iustin Pop
      data["local_dev"] == dname and
80 3840729d Iustin Pop
      "meta_dev" in data and
81 3840729d Iustin Pop
      data["meta_dev"] == mname and
82 3840729d Iustin Pop
      "meta_index" in data and
83 3840729d Iustin Pop
      data["meta_index"] == 0
84 3840729d Iustin Pop
      )
85 3840729d Iustin Pop
    return retval
86 3840729d Iustin Pop
87 3840729d Iustin Pop
  @staticmethod
88 3840729d Iustin Pop
  def _has_net(data, local, remote):
89 3840729d Iustin Pop
    """Check network connection parameters"""
90 3840729d Iustin Pop
    retval = (
91 3840729d Iustin Pop
      "local_addr" in data and
92 3840729d Iustin Pop
      data["local_addr"] == local and
93 3840729d Iustin Pop
      "remote_addr" in data and
94 3840729d Iustin Pop
      data["remote_addr"] == remote
95 3840729d Iustin Pop
      )
96 3840729d Iustin Pop
    return retval
97 3840729d Iustin Pop
98 3840729d Iustin Pop
  def testParserCreation(self):
99 3840729d Iustin Pop
    """Test drbdsetup show parser creation"""
100 3840729d Iustin Pop
    bdev.DRBD8._GetShowParser()
101 3840729d Iustin Pop
102 5a672c30 Manuel Franceschini
  def testParser80(self):
103 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk and network version 8.0"""
104 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-8.0.txt")
105 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
106 3840729d Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
107 3840729d Iustin Pop
                                   "/dev/xenvg/test.meta"),
108 3840729d Iustin Pop
                    "Wrong local disk info")
109 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11000),
110 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11000)),
111 01e2ce3a Iustin Pop
                    "Wrong network info (8.0.x)")
112 01e2ce3a Iustin Pop
113 5a672c30 Manuel Franceschini
  def testParser83(self):
114 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk and network version 8.3"""
115 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-8.3.txt")
116 01e2ce3a Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
117 01e2ce3a Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
118 01e2ce3a Iustin Pop
                                   "/dev/xenvg/test.meta"),
119 01e2ce3a Iustin Pop
                    "Wrong local disk info")
120 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11000),
121 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11000)),
122 5a672c30 Manuel Franceschini
                    "Wrong network info (8.0.x)")
123 3840729d Iustin Pop
124 5a672c30 Manuel Franceschini
  def testParserNetIP4(self):
125 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for IPv4 network"""
126 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-net-ip4.txt")
127 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
128 3840729d Iustin Pop
    self.failUnless(("local_dev" not in result and
129 3840729d Iustin Pop
                     "meta_dev" not in result and
130 3840729d Iustin Pop
                     "meta_index" not in result),
131 3840729d Iustin Pop
                    "Should not find local disk info")
132 926feaf1 Manuel Franceschini
    self.failUnless(self._has_net(result, ("192.0.2.1", 11002),
133 926feaf1 Manuel Franceschini
                                  ("192.0.2.2", 11002)),
134 5a672c30 Manuel Franceschini
                    "Wrong network info (IPv4)")
135 5a672c30 Manuel Franceschini
136 5a672c30 Manuel Franceschini
  def testParserNetIP6(self):
137 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for IPv6 network"""
138 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-net-ip6.txt")
139 5a672c30 Manuel Franceschini
    result = bdev.DRBD8._GetDevInfo(data)
140 5a672c30 Manuel Franceschini
    self.failUnless(("local_dev" not in result and
141 5a672c30 Manuel Franceschini
                     "meta_dev" not in result and
142 5a672c30 Manuel Franceschini
                     "meta_index" not in result),
143 5a672c30 Manuel Franceschini
                    "Should not find local disk info")
144 5a672c30 Manuel Franceschini
    self.failUnless(self._has_net(result, ("2001:db8:65::1", 11048),
145 5a672c30 Manuel Franceschini
                                  ("2001:db8:66::1", 11048)),
146 5a672c30 Manuel Franceschini
                    "Wrong network info (IPv6)")
147 3840729d Iustin Pop
148 3840729d Iustin Pop
  def testParserDisk(self):
149 5a672c30 Manuel Franceschini
    """Test drbdsetup show parser for disk"""
150 5a672c30 Manuel Franceschini
    data = self._ReadTestData("bdev-drbd-disk.txt")
151 3840729d Iustin Pop
    result = bdev.DRBD8._GetDevInfo(data)
152 3840729d Iustin Pop
    self.failUnless(self._has_disk(result, "/dev/xenvg/test.data",
153 3840729d Iustin Pop
                                   "/dev/xenvg/test.meta"),
154 3840729d Iustin Pop
                    "Wrong local disk info")
155 3840729d Iustin Pop
    self.failUnless(("local_addr" not in result and
156 3840729d Iustin Pop
                     "remote_addr" not in result),
157 3840729d Iustin Pop
                    "Should not find network info")
158 3840729d Iustin Pop
159 6b90c22e Iustin Pop
160 149a5439 Iustin Pop
class TestDRBD8Status(testutils.GanetiTestCase):
161 6b90c22e Iustin Pop
  """Testing case for DRBD8 /proc status"""
162 6b90c22e Iustin Pop
163 6b90c22e Iustin Pop
  def setUp(self):
164 6b90c22e Iustin Pop
    """Read in txt data"""
165 51596eb2 Iustin Pop
    testutils.GanetiTestCase.setUp(self)
166 149a5439 Iustin Pop
    proc_data = self._TestDataFilename("proc_drbd8.txt")
167 67d101d4 Iustin Pop
    proc80e_data = self._TestDataFilename("proc_drbd80-emptyline.txt")
168 01e2ce3a Iustin Pop
    proc83_data = self._TestDataFilename("proc_drbd83.txt")
169 7a380ddf René Nussbaumer
    proc83_sync_data = self._TestDataFilename("proc_drbd83_sync.txt")
170 7a380ddf René Nussbaumer
    proc83_sync_krnl_data = \
171 7a380ddf René Nussbaumer
      self._TestDataFilename("proc_drbd83_sync_krnl2.6.39.txt")
172 ae9da390 Iustin Pop
    self.proc_data = bdev.DRBD8._GetProcData(filename=proc_data)
173 67d101d4 Iustin Pop
    self.proc80e_data = bdev.DRBD8._GetProcData(filename=proc80e_data)
174 01e2ce3a Iustin Pop
    self.proc83_data = bdev.DRBD8._GetProcData(filename=proc83_data)
175 7a380ddf René Nussbaumer
    self.proc83_sync_data = bdev.DRBD8._GetProcData(filename=proc83_sync_data)
176 7a380ddf René Nussbaumer
    self.proc83_sync_krnl_data = \
177 7a380ddf René Nussbaumer
      bdev.DRBD8._GetProcData(filename=proc83_sync_krnl_data)
178 6b90c22e Iustin Pop
    self.mass_data = bdev.DRBD8._MassageProcData(self.proc_data)
179 67d101d4 Iustin Pop
    self.mass80e_data = bdev.DRBD8._MassageProcData(self.proc80e_data)
180 01e2ce3a Iustin Pop
    self.mass83_data = bdev.DRBD8._MassageProcData(self.proc83_data)
181 7a380ddf René Nussbaumer
    self.mass83_sync_data = bdev.DRBD8._MassageProcData(self.proc83_sync_data)
182 7a380ddf René Nussbaumer
    self.mass83_sync_krnl_data = \
183 7a380ddf René Nussbaumer
      bdev.DRBD8._MassageProcData(self.proc83_sync_krnl_data)
184 6b90c22e Iustin Pop
185 f6eaed12 Iustin Pop
  def testIOErrors(self):
186 f6eaed12 Iustin Pop
    """Test handling of errors while reading the proc file."""
187 f6eaed12 Iustin Pop
    temp_file = self._CreateTempFile()
188 f6eaed12 Iustin Pop
    os.unlink(temp_file)
189 f6eaed12 Iustin Pop
    self.failUnlessRaises(errors.BlockDeviceError,
190 f6eaed12 Iustin Pop
                          bdev.DRBD8._GetProcData, filename=temp_file)
191 f6eaed12 Iustin Pop
192 549071a0 Luca Bigliardi
  def testHelper(self):
193 549071a0 Luca Bigliardi
    """Test reading usermode_helper in /sys."""
194 549071a0 Luca Bigliardi
    sys_drbd_helper = self._TestDataFilename("sys_drbd_usermode_helper.txt")
195 549071a0 Luca Bigliardi
    drbd_helper = bdev.DRBD8.GetUsermodeHelper(filename=sys_drbd_helper)
196 549071a0 Luca Bigliardi
    self.failUnlessEqual(drbd_helper, "/bin/true")
197 549071a0 Luca Bigliardi
198 549071a0 Luca Bigliardi
  def testHelperIOErrors(self):
199 549071a0 Luca Bigliardi
    """Test handling of errors while reading usermode_helper in /sys."""
200 549071a0 Luca Bigliardi
    temp_file = self._CreateTempFile()
201 549071a0 Luca Bigliardi
    os.unlink(temp_file)
202 549071a0 Luca Bigliardi
    self.failUnlessRaises(errors.BlockDeviceError,
203 549071a0 Luca Bigliardi
                          bdev.DRBD8.GetUsermodeHelper, filename=temp_file)
204 549071a0 Luca Bigliardi
205 6b90c22e Iustin Pop
  def testMinorNotFound(self):
206 6b90c22e Iustin Pop
    """Test not-found-minor in /proc"""
207 6b90c22e Iustin Pop
    self.failUnless(9 not in self.mass_data)
208 01e2ce3a Iustin Pop
    self.failUnless(9 not in self.mass83_data)
209 67d101d4 Iustin Pop
    self.failUnless(3 not in self.mass80e_data)
210 6b90c22e Iustin Pop
211 6b90c22e Iustin Pop
  def testLineNotMatch(self):
212 6b90c22e Iustin Pop
    """Test wrong line passed to DRBD8Status"""
213 6b90c22e Iustin Pop
    self.assertRaises(errors.BlockDeviceError, bdev.DRBD8Status, "foo")
214 6b90c22e Iustin Pop
215 6b90c22e Iustin Pop
  def testMinor0(self):
216 6b90c22e Iustin Pop
    """Test connected, primary device"""
217 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
218 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[0])
219 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
220 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_primary and
221 01e2ce3a Iustin Pop
                      stats.peer_secondary and stats.is_disk_uptodate)
222 6b90c22e Iustin Pop
223 6b90c22e Iustin Pop
  def testMinor1(self):
224 6b90c22e Iustin Pop
    """Test connected, secondary device"""
225 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
226 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[1])
227 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
228 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_secondary and
229 01e2ce3a Iustin Pop
                      stats.peer_primary and stats.is_disk_uptodate)
230 6b90c22e Iustin Pop
231 767d52d3 Iustin Pop
  def testMinor2(self):
232 767d52d3 Iustin Pop
    """Test unconfigured device"""
233 67d101d4 Iustin Pop
    for data in [self.mass_data, self.mass83_data, self.mass80e_data]:
234 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[2])
235 01e2ce3a Iustin Pop
      self.failIf(stats.is_in_use)
236 767d52d3 Iustin Pop
237 6b90c22e Iustin Pop
  def testMinor4(self):
238 6b90c22e Iustin Pop
    """Test WFconn device"""
239 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
240 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[4])
241 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
242 01e2ce3a Iustin Pop
      self.failUnless(stats.is_wfconn and stats.is_primary and
243 01e2ce3a Iustin Pop
                      stats.rrole == 'Unknown' and
244 01e2ce3a Iustin Pop
                      stats.is_disk_uptodate)
245 6b90c22e Iustin Pop
246 6b90c22e Iustin Pop
  def testMinor6(self):
247 6b90c22e Iustin Pop
    """Test diskless device"""
248 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
249 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[6])
250 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
251 01e2ce3a Iustin Pop
      self.failUnless(stats.is_connected and stats.is_secondary and
252 01e2ce3a Iustin Pop
                      stats.peer_primary and stats.is_diskless)
253 6b90c22e Iustin Pop
254 6b90c22e Iustin Pop
  def testMinor8(self):
255 6b90c22e Iustin Pop
    """Test standalone device"""
256 01e2ce3a Iustin Pop
    for data in [self.mass_data, self.mass83_data]:
257 01e2ce3a Iustin Pop
      stats = bdev.DRBD8Status(data[8])
258 01e2ce3a Iustin Pop
      self.failUnless(stats.is_in_use)
259 01e2ce3a Iustin Pop
      self.failUnless(stats.is_standalone and
260 01e2ce3a Iustin Pop
                      stats.rrole == 'Unknown' and
261 01e2ce3a Iustin Pop
                      stats.is_disk_uptodate)
262 6b90c22e Iustin Pop
263 7a380ddf René Nussbaumer
  def testDRBD83SyncFine(self):
264 7a380ddf René Nussbaumer
    stats = bdev.DRBD8Status(self.mass83_sync_data[3])
265 7a380ddf René Nussbaumer
    self.failUnless(stats.is_in_resync)
266 7a380ddf René Nussbaumer
    self.failUnless(stats.sync_percent is not None)
267 7a380ddf René Nussbaumer
268 7a380ddf René Nussbaumer
  def testDRBD83SyncBroken(self):
269 7a380ddf René Nussbaumer
    stats = bdev.DRBD8Status(self.mass83_sync_krnl_data[3])
270 7a380ddf René Nussbaumer
    self.failUnless(stats.is_in_resync)
271 7a380ddf René Nussbaumer
    self.failUnless(stats.sync_percent is not None)
272 7a380ddf René Nussbaumer
273 3840729d Iustin Pop
if __name__ == '__main__':
274 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()