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