Revision 5a672c30
b/Makefile.am | ||
---|---|---|
348 | 348 |
$(patsubst %.html,%.html.in,$(manhtml)) |
349 | 349 |
|
350 | 350 |
TEST_FILES = \ |
351 |
test/data/bdev-both.txt \ |
|
352 |
test/data/bdev-8.3-both.txt \ |
|
353 |
test/data/bdev-disk.txt \ |
|
354 |
test/data/bdev-net.txt \ |
|
351 |
test/data/bdev-drbd-8.0.txt \ |
|
352 |
test/data/bdev-drbd-8.3.txt \ |
|
353 |
test/data/bdev-drbd-disk.txt \ |
|
354 |
test/data/bdev-drbd-net-ip4.txt \ |
|
355 |
test/data/bdev-drbd-net-ip6.txt \ |
|
355 | 356 |
test/data/cert1.pem \ |
356 | 357 |
test/data/proc_drbd8.txt \ |
357 | 358 |
test/data/proc_drbd80-emptyline.txt \ |
b/lib/bdev.py | ||
---|---|---|
1079 | 1079 |
# pyparsing setup |
1080 | 1080 |
lbrace = pyp.Literal("{").suppress() |
1081 | 1081 |
rbrace = pyp.Literal("}").suppress() |
1082 |
lbracket = pyp.Literal("[").suppress() |
|
1083 |
rbracket = pyp.Literal("]").suppress() |
|
1082 | 1084 |
semi = pyp.Literal(";").suppress() |
1085 |
colon = pyp.Literal(":").suppress() |
|
1083 | 1086 |
# this also converts the value to an int |
1084 | 1087 |
number = pyp.Word(pyp.nums).setParseAction(lambda s, l, t: int(t[0])) |
1085 | 1088 |
|
... | ... | |
1092 | 1095 |
# value types |
1093 | 1096 |
value = pyp.Word(pyp.alphanums + '_-/.:') |
1094 | 1097 |
quoted = dbl_quote + pyp.CharsNotIn('"') + dbl_quote |
1095 |
addr_type = (pyp.Optional(pyp.Literal("ipv4")).suppress() + |
|
1096 |
pyp.Optional(pyp.Literal("ipv6")).suppress()) |
|
1097 |
addr_port = (addr_type + pyp.Word(pyp.nums + '.') + |
|
1098 |
pyp.Literal(':').suppress() + number) |
|
1098 |
ipv4_addr = (pyp.Optional(pyp.Literal("ipv4")).suppress() + |
|
1099 |
pyp.Word(pyp.nums + ".") + colon + number) |
|
1100 |
ipv6_addr = (pyp.Optional(pyp.Literal("ipv6")).suppress() + |
|
1101 |
pyp.Optional(lbracket) + pyp.Word(pyp.hexnums + ":") + |
|
1102 |
pyp.Optional(rbracket) + colon + number) |
|
1099 | 1103 |
# meta device, extended syntax |
1100 |
meta_value = ((value ^ quoted) + pyp.Literal('[').suppress() + |
|
1101 |
number + pyp.Word(']').suppress()) |
|
1104 |
meta_value = ((value ^ quoted) + lbracket + number + rbracket) |
|
1102 | 1105 |
# device name, extended syntax |
1103 | 1106 |
device_value = pyp.Literal("minor").suppress() + number |
1104 | 1107 |
|
1105 | 1108 |
# a statement |
1106 | 1109 |
stmt = (~rbrace + keyword + ~lbrace + |
1107 |
pyp.Optional(addr_port ^ value ^ quoted ^ meta_value ^
|
|
1110 |
pyp.Optional(ipv4_addr ^ ipv6_addr ^ value ^ quoted ^ meta_value ^
|
|
1108 | 1111 |
device_value) + |
1109 | 1112 |
pyp.Optional(defa) + semi + |
1110 | 1113 |
pyp.Optional(pyp.restOfLine).suppress()) |
... | ... | |
1280 | 1283 |
# about its peer. |
1281 | 1284 |
cls._SetMinorSyncSpeed(minor, constants.SYNC_SPEED) |
1282 | 1285 |
|
1286 |
if utils.IsValidIP6(lhost): |
|
1287 |
if not utils.IsValidIP6(rhost): |
|
1288 |
_ThrowError("drbd%d: can't connect ip %s to ip %s" % |
|
1289 |
(minor, lhost, rhost)) |
|
1290 |
family = "ipv6" |
|
1291 |
elif utils.IsValidIP4(lhost): |
|
1292 |
if not utils.IsValidIP4(rhost): |
|
1293 |
_ThrowError("drbd%d: can't connect ip %s to ip %s" % |
|
1294 |
(minor, lhost, rhost)) |
|
1295 |
family = "ipv4" |
|
1296 |
else: |
|
1297 |
_ThrowError("drbd%d: Invalid ip %s" % (minor, lhost)) |
|
1298 |
|
|
1283 | 1299 |
args = ["drbdsetup", cls._DevPath(minor), "net", |
1284 |
"%s:%s" % (lhost, lport), "%s:%s" % (rhost, rport), protocol, |
|
1300 |
"%s:%s:%s" % (family, lhost, lport), |
|
1301 |
"%s:%s:%s" % (family, rhost, rport), protocol, |
|
1285 | 1302 |
"-A", "discard-zero-changes", |
1286 | 1303 |
"-B", "consensus", |
1287 | 1304 |
"--create-device", |
/dev/null | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
max-bio-bvecs 0 _is_default; |
|
6 |
} |
|
7 |
net { |
|
8 |
timeout 60 _is_default; # 1/10 seconds |
|
9 |
max-epoch-size 2048 _is_default; |
|
10 |
max-buffers 2048 _is_default; |
|
11 |
unplug-watermark 128 _is_default; |
|
12 |
connect-int 10 _is_default; # seconds |
|
13 |
ping-int 10 _is_default; # seconds |
|
14 |
sndbuf-size 131070 _is_default; # bytes |
|
15 |
ko-count 0 _is_default; |
|
16 |
after-sb-0pri discard-zero-changes; |
|
17 |
after-sb-1pri consensus; |
|
18 |
after-sb-2pri disconnect _is_default; |
|
19 |
rr-conflict disconnect _is_default; |
|
20 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
21 |
} |
|
22 |
syncer { |
|
23 |
rate 61440k; # bytes/second |
|
24 |
after -1 _is_default; |
|
25 |
al-extents 257; |
|
26 |
} |
|
27 |
protocol C; |
|
28 |
_this_host { |
|
29 |
device minor 0; |
|
30 |
disk "/dev/xenvg/test.data"; |
|
31 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
32 |
address ipv4 192.168.1.1:11000; |
|
33 |
} |
|
34 |
_remote_host { |
|
35 |
address ipv4 192.168.1.2:11000; |
|
36 |
} |
/dev/null | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
} |
|
6 |
net { |
|
7 |
timeout 60 _is_default; # 1/10 seconds |
|
8 |
max-epoch-size 16384; |
|
9 |
max-buffers 16384; |
|
10 |
unplug-watermark 128 _is_default; |
|
11 |
connect-int 10 _is_default; # seconds |
|
12 |
ping-int 10 _is_default; # seconds |
|
13 |
sndbuf-size 8388608; # bytes |
|
14 |
ko-count 0 _is_default; |
|
15 |
after-sb-0pri disconnect _is_default; |
|
16 |
after-sb-1pri disconnect _is_default; |
|
17 |
after-sb-2pri disconnect _is_default; |
|
18 |
rr-conflict disconnect _is_default; |
|
19 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
20 |
} |
|
21 |
syncer { |
|
22 |
rate 30720k; # bytes/second |
|
23 |
after -1 _is_default; |
|
24 |
al-extents 257; |
|
25 |
} |
|
26 |
protocol A; |
|
27 |
_this_host { |
|
28 |
device "/dev/drbd63"; |
|
29 |
disk "/dev/xenvg/test.data"; |
|
30 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
31 |
address 192.168.1.1:11000; |
|
32 |
} |
|
33 |
_remote_host { |
|
34 |
address 192.168.1.2:11000; |
|
35 |
} |
/dev/null | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
} |
|
6 |
syncer { |
|
7 |
rate 250k _is_default; # bytes/second |
|
8 |
after -1 _is_default; |
|
9 |
al-extents 257; |
|
10 |
} |
|
11 |
_this_host { |
|
12 |
device "/dev/drbd58"; |
|
13 |
disk "/dev/xenvg/test.data"; |
|
14 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
15 |
} |
b/test/data/bdev-drbd-8.0.txt | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
} |
|
6 |
net { |
|
7 |
timeout 60 _is_default; # 1/10 seconds |
|
8 |
max-epoch-size 16384; |
|
9 |
max-buffers 16384; |
|
10 |
unplug-watermark 128 _is_default; |
|
11 |
connect-int 10 _is_default; # seconds |
|
12 |
ping-int 10 _is_default; # seconds |
|
13 |
sndbuf-size 8388608; # bytes |
|
14 |
ko-count 0 _is_default; |
|
15 |
after-sb-0pri disconnect _is_default; |
|
16 |
after-sb-1pri disconnect _is_default; |
|
17 |
after-sb-2pri disconnect _is_default; |
|
18 |
rr-conflict disconnect _is_default; |
|
19 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
20 |
} |
|
21 |
syncer { |
|
22 |
rate 30720k; # bytes/second |
|
23 |
after -1 _is_default; |
|
24 |
al-extents 257; |
|
25 |
} |
|
26 |
protocol A; |
|
27 |
_this_host { |
|
28 |
device "/dev/drbd63"; |
|
29 |
disk "/dev/xenvg/test.data"; |
|
30 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
31 |
address 192.168.1.1:11000; |
|
32 |
} |
|
33 |
_remote_host { |
|
34 |
address 192.168.1.2:11000; |
|
35 |
} |
b/test/data/bdev-drbd-8.3.txt | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
max-bio-bvecs 0 _is_default; |
|
6 |
} |
|
7 |
net { |
|
8 |
timeout 60 _is_default; # 1/10 seconds |
|
9 |
max-epoch-size 2048 _is_default; |
|
10 |
max-buffers 2048 _is_default; |
|
11 |
unplug-watermark 128 _is_default; |
|
12 |
connect-int 10 _is_default; # seconds |
|
13 |
ping-int 10 _is_default; # seconds |
|
14 |
sndbuf-size 131070 _is_default; # bytes |
|
15 |
ko-count 0 _is_default; |
|
16 |
after-sb-0pri discard-zero-changes; |
|
17 |
after-sb-1pri consensus; |
|
18 |
after-sb-2pri disconnect _is_default; |
|
19 |
rr-conflict disconnect _is_default; |
|
20 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
21 |
} |
|
22 |
syncer { |
|
23 |
rate 61440k; # bytes/second |
|
24 |
after -1 _is_default; |
|
25 |
al-extents 257; |
|
26 |
} |
|
27 |
protocol C; |
|
28 |
_this_host { |
|
29 |
device minor 0; |
|
30 |
disk "/dev/xenvg/test.data"; |
|
31 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
32 |
address ipv4 192.168.1.1:11000; |
|
33 |
} |
|
34 |
_remote_host { |
|
35 |
address ipv4 192.168.1.2:11000; |
|
36 |
} |
b/test/data/bdev-drbd-disk.txt | ||
---|---|---|
1 |
disk { |
|
2 |
size 0s _is_default; # bytes |
|
3 |
on-io-error detach; |
|
4 |
fencing dont-care _is_default; |
|
5 |
} |
|
6 |
syncer { |
|
7 |
rate 250k _is_default; # bytes/second |
|
8 |
after -1 _is_default; |
|
9 |
al-extents 257; |
|
10 |
} |
|
11 |
_this_host { |
|
12 |
device "/dev/drbd58"; |
|
13 |
disk "/dev/xenvg/test.data"; |
|
14 |
meta-disk "/dev/xenvg/test.meta" [ 0 ]; |
|
15 |
} |
b/test/data/bdev-drbd-net-ip4.txt | ||
---|---|---|
1 |
net { |
|
2 |
timeout 60 _is_default; # 1/10 seconds |
|
3 |
max-epoch-size 2048 _is_default; |
|
4 |
max-buffers 2048 _is_default; |
|
5 |
unplug-watermark 128 _is_default; |
|
6 |
connect-int 10 _is_default; # seconds |
|
7 |
ping-int 10 _is_default; # seconds |
|
8 |
sndbuf-size 131070 _is_default; # bytes |
|
9 |
ko-count 0 _is_default; |
|
10 |
after-sb-0pri disconnect _is_default; |
|
11 |
after-sb-1pri disconnect _is_default; |
|
12 |
after-sb-2pri disconnect _is_default; |
|
13 |
rr-conflict disconnect _is_default; |
|
14 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
15 |
} |
|
16 |
syncer { |
|
17 |
rate 250k _is_default; # bytes/second |
|
18 |
after -1 _is_default; |
|
19 |
al-extents 127 _is_default; |
|
20 |
} |
|
21 |
protocol C; |
|
22 |
_this_host { |
|
23 |
device "/dev/drbd59"; |
|
24 |
address 192.168.1.1:11002; |
|
25 |
} |
|
26 |
_remote_host { |
|
27 |
address 192.168.1.2:11002; |
|
28 |
} |
b/test/data/bdev-drbd-net-ip6.txt | ||
---|---|---|
1 |
net { |
|
2 |
timeout 60 _is_default; # 1/10 seconds |
|
3 |
max-epoch-size 2048 _is_default; |
|
4 |
max-buffers 2048 _is_default; |
|
5 |
unplug-watermark 128 _is_default; |
|
6 |
connect-int 10 _is_default; # seconds |
|
7 |
ping-int 10 _is_default; # seconds |
|
8 |
sndbuf-size 0 _is_default; # bytes |
|
9 |
rcvbuf-size 0 _is_default; # bytes |
|
10 |
ko-count 0 _is_default; |
|
11 |
cram-hmac-alg "md5"; |
|
12 |
shared-secret "a6526cb6118297c9c82c7003924e236ceac0d867"; |
|
13 |
after-sb-0pri discard-zero-changes; |
|
14 |
after-sb-1pri consensus; |
|
15 |
after-sb-2pri disconnect _is_default; |
|
16 |
rr-conflict disconnect _is_default; |
|
17 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
18 |
} |
|
19 |
syncer { |
|
20 |
rate 61440k; # bytes/second |
|
21 |
after -1 _is_default; |
|
22 |
al-extents 257; |
|
23 |
} |
|
24 |
protocol C; |
|
25 |
_this_host { |
|
26 |
device minor 0; |
|
27 |
address ipv6 [2001:db8:65::1]:11048; |
|
28 |
} |
|
29 |
_remote_host { |
|
30 |
address ipv6 [2001:db8:66::1]:11048; |
|
31 |
} |
/dev/null | ||
---|---|---|
1 |
net { |
|
2 |
timeout 60 _is_default; # 1/10 seconds |
|
3 |
max-epoch-size 2048 _is_default; |
|
4 |
max-buffers 2048 _is_default; |
|
5 |
unplug-watermark 128 _is_default; |
|
6 |
connect-int 10 _is_default; # seconds |
|
7 |
ping-int 10 _is_default; # seconds |
|
8 |
sndbuf-size 131070 _is_default; # bytes |
|
9 |
ko-count 0 _is_default; |
|
10 |
after-sb-0pri disconnect _is_default; |
|
11 |
after-sb-1pri disconnect _is_default; |
|
12 |
after-sb-2pri disconnect _is_default; |
|
13 |
rr-conflict disconnect _is_default; |
|
14 |
ping-timeout 5 _is_default; # 1/10 seconds |
|
15 |
} |
|
16 |
syncer { |
|
17 |
rate 250k _is_default; # bytes/second |
|
18 |
after -1 _is_default; |
|
19 |
al-extents 127 _is_default; |
|
20 |
} |
|
21 |
protocol C; |
|
22 |
_this_host { |
|
23 |
device "/dev/drbd59"; |
|
24 |
address 192.168.1.1:11002; |
|
25 |
} |
|
26 |
_remote_host { |
|
27 |
address 192.168.1.2:11002; |
|
28 |
} |
b/test/ganeti.bdev_unittest.py | ||
---|---|---|
62 | 62 |
"""Test drbdsetup show parser creation""" |
63 | 63 |
bdev.DRBD8._GetShowParser() |
64 | 64 |
|
65 |
def testParserBoth80(self):
|
|
66 |
"""Test drbdsetup show parser for disk and network""" |
|
67 |
data = self._ReadTestData("bdev-both.txt")
|
|
65 |
def testParser80(self): |
|
66 |
"""Test drbdsetup show parser for disk and network version 8.0"""
|
|
67 |
data = self._ReadTestData("bdev-drbd-8.0.txt")
|
|
68 | 68 |
result = bdev.DRBD8._GetDevInfo(data) |
69 | 69 |
self.failUnless(self._has_disk(result, "/dev/xenvg/test.data", |
70 | 70 |
"/dev/xenvg/test.meta"), |
... | ... | |
73 | 73 |
("192.168.1.2", 11000)), |
74 | 74 |
"Wrong network info (8.0.x)") |
75 | 75 |
|
76 |
def testParserBoth83(self):
|
|
77 |
"""Test drbdsetup show parser for disk and network""" |
|
78 |
data = self._ReadTestData("bdev-8.3-both.txt")
|
|
76 |
def testParser83(self): |
|
77 |
"""Test drbdsetup show parser for disk and network version 8.3"""
|
|
78 |
data = self._ReadTestData("bdev-drbd-8.3.txt")
|
|
79 | 79 |
result = bdev.DRBD8._GetDevInfo(data) |
80 | 80 |
self.failUnless(self._has_disk(result, "/dev/xenvg/test.data", |
81 | 81 |
"/dev/xenvg/test.meta"), |
82 | 82 |
"Wrong local disk info") |
83 | 83 |
self.failUnless(self._has_net(result, ("192.168.1.1", 11000), |
84 | 84 |
("192.168.1.2", 11000)), |
85 |
"Wrong network info (8.2.x)")
|
|
85 |
"Wrong network info (8.0.x)")
|
|
86 | 86 |
|
87 |
def testParserNet(self): |
|
88 |
"""Test drbdsetup show parser for disk and network"""
|
|
89 |
data = self._ReadTestData("bdev-net.txt")
|
|
87 |
def testParserNetIP4(self):
|
|
88 |
"""Test drbdsetup show parser for IPv4 network"""
|
|
89 |
data = self._ReadTestData("bdev-drbd-net-ip4.txt")
|
|
90 | 90 |
result = bdev.DRBD8._GetDevInfo(data) |
91 | 91 |
self.failUnless(("local_dev" not in result and |
92 | 92 |
"meta_dev" not in result and |
... | ... | |
94 | 94 |
"Should not find local disk info") |
95 | 95 |
self.failUnless(self._has_net(result, ("192.168.1.1", 11002), |
96 | 96 |
("192.168.1.2", 11002)), |
97 |
"Wrong network info") |
|
97 |
"Wrong network info (IPv4)") |
|
98 |
|
|
99 |
def testParserNetIP6(self): |
|
100 |
"""Test drbdsetup show parser for IPv6 network""" |
|
101 |
data = self._ReadTestData("bdev-drbd-net-ip6.txt") |
|
102 |
result = bdev.DRBD8._GetDevInfo(data) |
|
103 |
self.failUnless(("local_dev" not in result and |
|
104 |
"meta_dev" not in result and |
|
105 |
"meta_index" not in result), |
|
106 |
"Should not find local disk info") |
|
107 |
self.failUnless(self._has_net(result, ("2001:db8:65::1", 11048), |
|
108 |
("2001:db8:66::1", 11048)), |
|
109 |
"Wrong network info (IPv6)") |
|
98 | 110 |
|
99 | 111 |
def testParserDisk(self): |
100 |
"""Test drbdsetup show parser for disk and network"""
|
|
101 |
data = self._ReadTestData("bdev-disk.txt") |
|
112 |
"""Test drbdsetup show parser for disk""" |
|
113 |
data = self._ReadTestData("bdev-drbd-disk.txt")
|
|
102 | 114 |
result = bdev.DRBD8._GetDevInfo(data) |
103 | 115 |
self.failUnless(self._has_disk(result, "/dev/xenvg/test.data", |
104 | 116 |
"/dev/xenvg/test.meta"), |
Also available in: Unified diff