diff --git a/Makefile.am b/Makefile.am
index 2b20bf00f52b4f9c9bc8bf10f3c600470a622e34..996feff90f76dc4a7f23eac0e49160decdfb1493 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -106,6 +106,7 @@ DIRS = \
 	qa \
 	test \
 	test/data \
+	test/data/bdev-rbd \
 	test/data/ovfdata \
 	test/data/ovfdata/other \
 	test/py \
@@ -986,6 +987,18 @@ TEST_FILES = \
 	test/data/bdev-drbd-disk.txt \
 	test/data/bdev-drbd-net-ip4.txt \
 	test/data/bdev-drbd-net-ip6.txt \
+	test/data/bdev-rbd/json_output_empty.txt \
+	test/data/bdev-rbd/json_output_extra_matches.txt \
+	test/data/bdev-rbd/json_output_no_matches.txt \
+	test/data/bdev-rbd/json_output_ok.txt \
+	test/data/bdev-rbd/plain_output_new_extra_matches.txt \
+	test/data/bdev-rbd/plain_output_new_no_matches.txt \
+	test/data/bdev-rbd/plain_output_new_ok.txt \
+	test/data/bdev-rbd/plain_output_old_empty.txt \
+	test/data/bdev-rbd/plain_output_old_extra_matches.txt \
+	test/data/bdev-rbd/plain_output_old_no_matches.txt \
+	test/data/bdev-rbd/plain_output_old_ok.txt \
+	test/data/bdev-rbd/output_invalid.txt \
 	test/data/cert1.pem \
 	test/data/cert2.pem \
 	test/data/instance-minor-pairing.txt \
diff --git a/test/data/bdev-rbd/json_output_empty.txt b/test/data/bdev-rbd/json_output_empty.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93
--- /dev/null
+++ b/test/data/bdev-rbd/json_output_empty.txt
@@ -0,0 +1 @@
+{}
diff --git a/test/data/bdev-rbd/json_output_extra_matches.txt b/test/data/bdev-rbd/json_output_extra_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..321c43829c95d80605885ddcce97275fe4bb4c19
--- /dev/null
+++ b/test/data/bdev-rbd/json_output_extra_matches.txt
@@ -0,0 +1 @@
+{"4":{"pool":"rbd","name":"d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0","snap":"-","device":"\/dev\/rbd4"},"1":{"pool":"rbd","name":"b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0","snap":"-","device":"\/dev\/rbd1"},"2":{"pool":"rbd","name":"abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0","snap":"-","device":"\/dev\/rbd2"},"3":{"pool":"rbd","name":"d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0","snap":"-","device":"\/dev\/rbd3"}}
diff --git a/test/data/bdev-rbd/json_output_no_matches.txt b/test/data/bdev-rbd/json_output_no_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a29878850a3646af1132bb6217eb849f3f382124
--- /dev/null
+++ b/test/data/bdev-rbd/json_output_no_matches.txt
@@ -0,0 +1 @@
+{"1":{"pool":"rbd","name":"b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0","snap":"-","device":"\/dev\/rbd1"},"2":{"pool":"rbd","name":"abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0","snap":"-","device":"\/dev\/rbd2"}}
diff --git a/test/data/bdev-rbd/json_output_ok.txt b/test/data/bdev-rbd/json_output_ok.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0d5173f5da496da1ef571e7628a9dabd24193a3f
--- /dev/null
+++ b/test/data/bdev-rbd/json_output_ok.txt
@@ -0,0 +1 @@
+{"1":{"pool":"rbd","name":"b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0","snap":"-","device":"\/dev\/rbd1"},"2":{"pool":"rbd","name":"abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0","snap":"-","device":"\/dev\/rbd2"},"3":{"pool":"rbd","name":"d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0","snap":"-","device":"\/dev\/rbd3"}}
diff --git a/test/data/bdev-rbd/output_invalid.txt b/test/data/bdev-rbd/output_invalid.txt
new file mode 100644
index 0000000000000000000000000000000000000000..27aa7b10a13c4c1a66578dbdb4b38b27660466a1
--- /dev/null
+++ b/test/data/bdev-rbd/output_invalid.txt
@@ -0,0 +1 @@
+invalid rbd output 
diff --git a/test/data/bdev-rbd/plain_output_new_empty.txt b/test/data/bdev-rbd/plain_output_new_empty.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/data/bdev-rbd/plain_output_new_extra_matches.txt b/test/data/bdev-rbd/plain_output_new_extra_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f7bc907189f378c23a72b3969aadd1c7e2088bb4
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_new_extra_matches.txt
@@ -0,0 +1,5 @@
+id pool image                                          snap device    
+4  rbd  d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0 -    /dev/rbd4 
+1  rbd  b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0 -    /dev/rbd1 
+2  rbd  abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0 -    /dev/rbd2 
+3  rbd  d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0 -    /dev/rbd3 
diff --git a/test/data/bdev-rbd/plain_output_new_no_matches.txt b/test/data/bdev-rbd/plain_output_new_no_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bc126b3dc55c17576dcde6de74dee86fe6f9b142
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_new_no_matches.txt
@@ -0,0 +1,3 @@
+id pool image                                          snap device    
+1  rbd  b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0 -    /dev/rbd1 
+2  rbd  abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0 -    /dev/rbd2 
diff --git a/test/data/bdev-rbd/plain_output_new_ok.txt b/test/data/bdev-rbd/plain_output_new_ok.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bc250941f13c875be3c0fdcfad15073f2f6b7200
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_new_ok.txt
@@ -0,0 +1,3 @@
+1  rbd  b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0 -    /dev/rbd1 
+2  rbd  abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0 -    /dev/rbd2 
+3  rbd  d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0 -    /dev/rbd3 
diff --git a/test/data/bdev-rbd/plain_output_old_empty.txt b/test/data/bdev-rbd/plain_output_old_empty.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0bb19ea0cf424ddf3b92098c1b3f36286872d756
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_old_empty.txt
@@ -0,0 +1 @@
+id	pool	image	snap	device
diff --git a/test/data/bdev-rbd/plain_output_old_extra_matches.txt b/test/data/bdev-rbd/plain_output_old_extra_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..52848e4966df87c5f26bcf56fa621ef5cd522bf8
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_old_extra_matches.txt
@@ -0,0 +1,5 @@
+id	pool	image	snap	device
+4	rbd	d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0	-	/dev/rbd4
+1	rbd	b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0	-	/dev/rbd1
+2	rbd	abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0	-	/dev/rbd2
+3	rbd	d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0	-	/dev/rbd3
diff --git a/test/data/bdev-rbd/plain_output_old_no_matches.txt b/test/data/bdev-rbd/plain_output_old_no_matches.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3632b483ca1c95c9a0c39b90e8d16bc92bf13e68
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_old_no_matches.txt
@@ -0,0 +1,3 @@
+id	pool	image	snap	device
+1	rbd	b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0	-	/dev/rbd1
+2	rbd	abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0	-	/dev/rbd2
diff --git a/test/data/bdev-rbd/plain_output_old_ok.txt b/test/data/bdev-rbd/plain_output_old_ok.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c2e1e5c3abe994cde859a3893041435f786a2c43
--- /dev/null
+++ b/test/data/bdev-rbd/plain_output_old_ok.txt
@@ -0,0 +1,4 @@
+id	pool	image	snap	device
+1	rbd	b9e31bb3-4d4f-4a2c-bc63-207a0bc4b287.rbd.disk0	-	/dev/rbd1
+2	rbd	abe7957a-ec96-490f-9c08-53b1c51cecf0.rbd.disk0	-	/dev/rbd2
+3	rbd	d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0	-	/dev/rbd3
diff --git a/test/py/ganeti.bdev_unittest.py b/test/py/ganeti.bdev_unittest.py
index 4aa310687d9ea6602d35f091cb808cc5ad791f36..8243375c5bf85b4c3b5584c3f803714ac5980432 100755
--- a/test/py/ganeti.bdev_unittest.py
+++ b/test/py/ganeti.bdev_unittest.py
@@ -346,35 +346,72 @@ class TestDRBD8Status(testutils.GanetiTestCase):
 
 
 class TestRADOSBlockDevice(testutils.GanetiTestCase):
-  def test_ParseRbdShowmappedOutput(self):
-    volume_name = "abc9778-8e8ace5b.rbd.disk0"
-    output_ok = \
-      ("0\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
-       "1\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd16\n"
-       "line\twith\tfewer\tfields\n"
-       "")
-    output_empty = ""
-    output_no_matches = \
-      ("0\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
-       "1\trbd\tabcdef01-9817.rbd.disk0\t-\t/dev/rbd10\n"
-       "2\trbd\tcdef0123-9817.rbd.disk0\t-\t/dev/rbd12\n"
-       "something\twith\tfewer\tfields"
-       "")
-    output_extra_matches = \
-      ("0\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd11\n"
-       "1\trbd\te69f28e5-9817.rbd.disk0\t-\t/dev/rbd0\n"
-       "2\t/dev/rbd0\tabc9778-8e8ace5b.rbd.disk0\t-\t/dev/rbd16\n"
-       "something\twith\tfewer\tfields"
-       "")
-
-    parse_function = bdev.RADOSBlockDevice._ParseRbdShowmappedOutput
-    self.assertEqual(parse_function(output_ok, volume_name), "/dev/rbd16")
+  def setUp(self):
+    """Set up input data"""
+    testutils.GanetiTestCase.setUp(self)
+
+    self.plain_output_old_ok = \
+      testutils.ReadTestData("bdev-rbd/plain_output_old_ok.txt")
+    self.plain_output_old_no_matches = \
+      testutils.ReadTestData("bdev-rbd/plain_output_old_no_matches.txt")
+    self.plain_output_old_extra_matches = \
+      testutils.ReadTestData("bdev-rbd/plain_output_old_extra_matches.txt")
+    self.plain_output_old_empty = \
+      testutils.ReadTestData("bdev-rbd/plain_output_old_empty.txt")
+    self.plain_output_new_ok = \
+      testutils.ReadTestData("bdev-rbd/plain_output_new_ok.txt")
+    self.plain_output_new_no_matches = \
+      testutils.ReadTestData("bdev-rbd/plain_output_new_no_matches.txt")
+    self.plain_output_new_extra_matches = \
+      testutils.ReadTestData("bdev-rbd/plain_output_new_extra_matches.txt")
+    # This file is completely empty, and as such it's not shipped.
+    self.plain_output_new_empty = ""
+    self.json_output_ok = testutils.ReadTestData("bdev-rbd/json_output_ok.txt")
+    self.json_output_no_matches = \
+      testutils.ReadTestData("bdev-rbd/json_output_no_matches.txt")
+    self.json_output_extra_matches = \
+      testutils.ReadTestData("bdev-rbd/json_output_extra_matches.txt")
+    self.json_output_empty = \
+      testutils.ReadTestData("bdev-rbd/json_output_empty.txt")
+    self.output_invalid = testutils.ReadTestData("bdev-rbd/output_invalid.txt")
+
+    self.volume_name = "d7ab910a-4933-4ffe-88d0-faf2ce31390a.rbd.disk0"
+
+  def test_ParseRbdShowmappedJson(self):
+    parse_function = bdev.RADOSBlockDevice._ParseRbdShowmappedJson
+
+    self.assertEqual(parse_function(self.json_output_ok, self.volume_name),
+                     "/dev/rbd3")
+    self.assertEqual(parse_function(self.json_output_empty, self.volume_name),
+                     None)
+    self.assertEqual(parse_function(self.json_output_no_matches,
+                     self.volume_name), None)
     self.assertRaises(errors.BlockDeviceError, parse_function,
-                      output_empty, volume_name)
-    self.assertEqual(parse_function(output_no_matches, volume_name), None)
+                      self.json_output_extra_matches, self.volume_name)
     self.assertRaises(errors.BlockDeviceError, parse_function,
-                      output_extra_matches, volume_name)
-
+                      self.output_invalid, self.volume_name)
+
+  def test_ParseRbdShowmappedPlain(self):
+    parse_function = bdev.RADOSBlockDevice._ParseRbdShowmappedPlain
+
+    self.assertEqual(parse_function(self.plain_output_new_ok,
+                     self.volume_name), "/dev/rbd3")
+    self.assertEqual(parse_function(self.plain_output_old_ok,
+                     self.volume_name), "/dev/rbd3")
+    self.assertEqual(parse_function(self.plain_output_new_empty,
+                     self.volume_name), None)
+    self.assertEqual(parse_function(self.plain_output_old_empty,
+                     self.volume_name), None)
+    self.assertEqual(parse_function(self.plain_output_new_no_matches,
+                     self.volume_name), None)
+    self.assertEqual(parse_function(self.plain_output_old_no_matches,
+                     self.volume_name), None)
+    self.assertRaises(errors.BlockDeviceError, parse_function,
+                      self.plain_output_new_extra_matches, self.volume_name)
+    self.assertRaises(errors.BlockDeviceError, parse_function,
+                      self.plain_output_old_extra_matches, self.volume_name)
+    self.assertRaises(errors.BlockDeviceError, parse_function,
+                      self.output_invalid, self.volume_name)
 
 class TestComputeWrongFileStoragePathsInternal(unittest.TestCase):
   def testPaths(self):