From efa6dd08645adae441b319bd2c4d4b8bc5549a91 Mon Sep 17 00:00:00 2001
From: Thomas Thrainer <thomasth@google.com>
Date: Mon, 29 Apr 2013 13:51:21 +0200
Subject: [PATCH] Add test for DRBD 8.4 /proc/drbd parsing

The current parser already supports the output of DRBD 8.4 /proc/drbd,
so add tests which actually verify this behaviour.
Note that the empty lines in proc_drbd84.txt are actually present in the
output of DRBD 8.4, they always appear when minors are not contiguous.

Signed-off-by: Thomas Thrainer <thomasth@google.com>
Signed-off-by: Michele Tartara <mtartara@google.com>
Reviewed-by: Michele Tartara <mtartara@google.com>
---
 Makefile.am                              |  2 +
 test/data/proc_drbd84.txt                | 16 +++++
 test/data/proc_drbd84_sync.txt           | 11 ++++
 test/hs/Test/Ganeti/Block/Drbd/Parser.hs | 81 ++++++++++++++++++++++++
 test/py/ganeti.block.bdev_unittest.py    | 23 +++++--
 5 files changed, 127 insertions(+), 6 deletions(-)
 create mode 100644 test/data/proc_drbd84.txt
 create mode 100644 test/data/proc_drbd84_sync.txt

diff --git a/Makefile.am b/Makefile.am
index aa61abb7d..61f2adacc 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1098,6 +1098,8 @@ TEST_FILES = \
 	test/data/proc_drbd83_sync.txt \
 	test/data/proc_drbd83_sync_want.txt \
 	test/data/proc_drbd83_sync_krnl2.6.39.txt \
+	test/data/proc_drbd84.txt \
+	test/data/proc_drbd84_sync.txt \
 	test/data/qa-minimal-nodes-instances-only.json \
 	test/data/sys_drbd_usermode_helper.txt \
 	test/data/vgreduce-removemissing-2.02.02.txt \
diff --git a/test/data/proc_drbd84.txt b/test/data/proc_drbd84.txt
new file mode 100644
index 000000000..a8b3cbfb9
--- /dev/null
+++ b/test/data/proc_drbd84.txt
@@ -0,0 +1,16 @@
+version: 8.4.2 (api:1/proto:86-101)
+GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@example.com, 2013-04-10 07:45:25
+ 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
+    ns:1048576 nr:0 dw:0 dr:1048776 al:0 bm:64 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
+ 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
+    ns:0 nr:1048576 dw:1048576 dr:0 al:0 bm:64 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
+ 2: cs:Unconfigured
+
+ 4: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
+    ns:0 nr:0 dw:0 dr:200 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048320
+
+ 6: cs:Connected ro:Secondary/Primary ds:Diskless/UpToDate C r-----
+    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
+
+ 8: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown   r-----
+    ns:0 nr:0 dw:0 dr:200 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048320
diff --git a/test/data/proc_drbd84_sync.txt b/test/data/proc_drbd84_sync.txt
new file mode 100644
index 000000000..20971ba15
--- /dev/null
+++ b/test/data/proc_drbd84_sync.txt
@@ -0,0 +1,11 @@
+version: 8.4.2 (api:1/proto:86-101)
+GIT-hash: 7ad5f850d711223713d6dcadc3dd48860321070c build by root@example.com, 2013-04-10 07:45:25
+ 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown   r-----
+    ns:0 nr:0 dw:33318 dr:730 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:1048320
+
+ 3: cs:Unconfigured
+
+ 5: cs:SyncSource ro:Secondary/Secondary ds:UpToDate/Inconsistent C r---n-
+    ns:716992 nr:0 dw:0 dr:719432 al:0 bm:43 lo:0 pe:33 ua:18 ap:0 ep:1 wo:f oos:335744
+        [============>.......] sync'ed: 68.5% (335744/1048576)K
+        finish: 0:00:05 speed: 64,800 (64,800) K/sec
diff --git a/test/hs/Test/Ganeti/Block/Drbd/Parser.hs b/test/hs/Test/Ganeti/Block/Drbd/Parser.hs
index 3b3b74fcf..9ca748582 100644
--- a/test/hs/Test/Ganeti/Block/Drbd/Parser.hs
+++ b/test/hs/Test/Ganeti/Block/Drbd/Parser.hs
@@ -92,6 +92,85 @@ case_drbd80_emptyversion = testFile "proc_drbd80-emptyversion.txt" $
       UnconfiguredDevice 6
     ]
 
+-- | Test a DRBD 8.4 file with an ongoing synchronization.
+case_drbd84_sync :: Assertion
+case_drbd84_sync = testFile "proc_drbd84_sync.txt" $
+  DRBDStatus
+    ( VersionInfo (Just "8.4.2") (Just "1") (Just "86-101") Nothing
+        (Just "7ad5f850d711223713d6dcadc3dd48860321070c")
+        (Just "root@example.com, 2013-04-10 07:45:25")
+    )
+    [ DeviceInfo 0 StandAlone (LocalRemote Primary Unknown)
+        (LocalRemote UpToDate DUnknown) ' ' "r-----"
+        (PerfIndicators 0 0 33318 730 15 0 0 0 0 0 (Just 1)
+          (Just 'd') (Just 1048320))
+        Nothing
+        Nothing
+        Nothing
+        Nothing,
+      UnconfiguredDevice 3,
+      DeviceInfo 5 SyncSource (LocalRemote Secondary Secondary)
+        (LocalRemote UpToDate Inconsistent) 'C' "r---n-"
+        (PerfIndicators 716992 0 0 719432 0 43 0 33 18 0 (Just 1)
+          (Just 'f') (Just 335744))
+        (Just $ SyncStatus 68.5 335744 1048576 KiloByte (Time 0 0 5) 64800
+          Nothing KiloByte Second)
+        Nothing
+        Nothing
+        Nothing
+    ]
+
+-- | Test a DRBD 8.4 file.
+case_drbd84 :: Assertion
+case_drbd84 = testFile "proc_drbd84.txt" $
+  DRBDStatus
+    ( VersionInfo (Just "8.4.2") (Just "1") (Just "86-101") Nothing
+      (Just "7ad5f850d711223713d6dcadc3dd48860321070c")
+      (Just "root@example.com, 2013-04-10 07:45:25")
+    )
+    [ DeviceInfo 0 Connected (LocalRemote Primary Secondary)
+        (LocalRemote UpToDate UpToDate) 'C' "r-----"
+        (PerfIndicators 1048576 0 0 1048776 0 64 0 0 0 0 (Just 1)
+          (Just 'f') (Just 0))
+        Nothing
+        Nothing
+        Nothing
+        Nothing,
+      DeviceInfo 1 Connected (LocalRemote Secondary Primary)
+        (LocalRemote UpToDate UpToDate) 'C' "r-----"
+        (PerfIndicators 0 1048576 1048576 0 0 64 0 0 0 0 (Just 1)
+          (Just 'f') (Just 0))
+        Nothing
+        Nothing
+        Nothing
+        Nothing,
+      UnconfiguredDevice 2,
+      DeviceInfo 4 WFConnection (LocalRemote Primary Unknown)
+        (LocalRemote UpToDate DUnknown) 'C' "r-----"
+        (PerfIndicators 0 0 0 200 0 0 0 0 0 0 (Just 1)
+          (Just 'f') (Just 1048320))
+        Nothing
+        Nothing
+        Nothing
+        Nothing,
+      DeviceInfo 6 Connected (LocalRemote Secondary Primary)
+        (LocalRemote Diskless UpToDate) 'C' "r-----"
+        (PerfIndicators 0 0 0 0 0 0 0 0 0 0 (Just 1) (Just 'b')
+          (Just 0))
+        Nothing
+        Nothing
+        Nothing
+        Nothing,
+      DeviceInfo 8 StandAlone (LocalRemote Secondary Unknown)
+        (LocalRemote UpToDate DUnknown) ' ' "r-----"
+        (PerfIndicators 0 0 0 200 0 0 0 0 0 0 (Just 1)
+          (Just 'f') (Just 1048320))
+        Nothing
+        Nothing
+        Nothing
+        Nothing
+    ]
+
 -- | Test a DRBD 8.3 file with a NULL caracter inside.
 case_drbd83_sync_krnl2_6_39 :: Assertion
 case_drbd83_sync_krnl2_6_39 = testFile "proc_drbd83_sync_krnl2.6.39.txt" $
@@ -404,6 +483,8 @@ case_commaInt_non_triplet = testCommaInt "61,736,12" 61736
 testSuite "Block/Drbd/Parser"
           [ 'case_drbd80_emptyline,
             'case_drbd80_emptyversion,
+            'case_drbd84_sync,
+            'case_drbd84,
             'case_drbd83_sync_krnl2_6_39,
             'case_drbd83_sync,
             'case_drbd83_sync_want,
diff --git a/test/py/ganeti.block.bdev_unittest.py b/test/py/ganeti.block.bdev_unittest.py
index 279ffff25..58dcbac04 100755
--- a/test/py/ganeti.block.bdev_unittest.py
+++ b/test/py/ganeti.block.bdev_unittest.py
@@ -245,6 +245,8 @@ class TestDRBD8Status(testutils.GanetiTestCase):
     proc83_sync_data = testutils.TestDataFilename("proc_drbd83_sync.txt")
     proc83_sync_krnl_data = \
       testutils.TestDataFilename("proc_drbd83_sync_krnl2.6.39.txt")
+    proc84_data = testutils.TestDataFilename("proc_drbd84.txt")
+    proc84_sync_data = testutils.TestDataFilename("proc_drbd84_sync.txt")
 
     self.proc80ev_data = \
       testutils.TestDataFilename("proc_drbd80-emptyversion.txt")
@@ -256,6 +258,9 @@ class TestDRBD8Status(testutils.GanetiTestCase):
       drbd.DRBD8Info.CreateFromFile(filename=proc83_sync_data)
     self.drbd_info83_sync_krnl = \
       drbd.DRBD8Info.CreateFromFile(filename=proc83_sync_krnl_data)
+    self.drbd_info84 = drbd.DRBD8Info.CreateFromFile(filename=proc84_data)
+    self.drbd_info84_sync = \
+      drbd.DRBD8Info.CreateFromFile(filename=proc84_sync_data)
 
   def testIOErrors(self):
     """Test handling of errors while reading the proc file."""
@@ -289,7 +294,7 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
   def testMinor0(self):
     """Test connected, primary device"""
-    for info in [self.drbd_info, self.drbd_info83]:
+    for info in [self.drbd_info, self.drbd_info83, self.drbd_info84]:
       stats = info.GetMinorStatus(0)
       self.failUnless(stats.is_in_use)
       self.failUnless(stats.is_connected and stats.is_primary and
@@ -297,7 +302,7 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
   def testMinor1(self):
     """Test connected, secondary device"""
-    for info in [self.drbd_info, self.drbd_info83]:
+    for info in [self.drbd_info, self.drbd_info83, self.drbd_info84]:
       stats = info.GetMinorStatus(1)
       self.failUnless(stats.is_in_use)
       self.failUnless(stats.is_connected and stats.is_secondary and
@@ -305,13 +310,14 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
   def testMinor2(self):
     """Test unconfigured device"""
-    for info in [self.drbd_info, self.drbd_info83, self.drbd_info80e]:
+    for info in [self.drbd_info, self.drbd_info83,
+                 self.drbd_info80e, self.drbd_info84]:
       stats = info.GetMinorStatus(2)
       self.failIf(stats.is_in_use)
 
   def testMinor4(self):
     """Test WFconn device"""
-    for info in [self.drbd_info, self.drbd_info83]:
+    for info in [self.drbd_info, self.drbd_info83, self.drbd_info84]:
       stats = info.GetMinorStatus(4)
       self.failUnless(stats.is_in_use)
       self.failUnless(stats.is_wfconn and stats.is_primary and
@@ -320,7 +326,7 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
   def testMinor6(self):
     """Test diskless device"""
-    for info in [self.drbd_info, self.drbd_info83]:
+    for info in [self.drbd_info, self.drbd_info83, self.drbd_info84]:
       stats = info.GetMinorStatus(6)
       self.failUnless(stats.is_in_use)
       self.failUnless(stats.is_connected and stats.is_secondary and
@@ -328,7 +334,7 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
   def testMinor8(self):
     """Test standalone device"""
-    for info in [self.drbd_info, self.drbd_info83]:
+    for info in [self.drbd_info, self.drbd_info83, self.drbd_info84]:
       stats = info.GetMinorStatus(8)
       self.failUnless(stats.is_in_use)
       self.failUnless(stats.is_standalone and
@@ -345,6 +351,11 @@ class TestDRBD8Status(testutils.GanetiTestCase):
     self.failUnless(stats.is_in_resync)
     self.failUnless(stats.sync_percent is not None)
 
+  def testDRBD84Sync(self):
+    stats = self.drbd_info84_sync.GetMinorStatus(5)
+    self.failUnless(stats.is_in_resync)
+    self.failUnless(stats.sync_percent is not None)
+
   def testDRBDEmptyVersion(self):
     self.assertRaises(errors.BlockDeviceError,
                       drbd.DRBD8Info.CreateFromFile,
-- 
GitLab