--- /dev/null
+import os
+import pytest
+import subprocess
+
+
+uses_collocated_journals = pytest.mark.skipif(
+ 'collocated_journals' not in pytest.config.slaveinput['node_config']['components'],
+ reason="only run in osds with collocated journals"
+)
+
+# XXX These could/should probably move to fixtures
+
+
+def which(executable):
+ locations = (
+ '/usr/local/bin',
+ '/bin',
+ '/usr/bin',
+ '/usr/local/sbin',
+ '/usr/sbin',
+ '/sbin',
+ )
+
+ for location in locations:
+ executable_path = os.path.join(location, executable)
+ if os.path.exists(executable_path):
+ return executable_path
+
+
+def get_system_devices():
+ """
+ uses ceph-disk to get a list of devices of a system, and formats the output nicely
+ so that tests can consume it to make assertions:
+
+ From:
+
+ /dev/sda :
+ /dev/sda2 other, 0x5
+ /dev/sda5 other, LVM2_member
+ /dev/sda1 other, ext2, mounted on /boot
+ /dev/sdb :
+ /dev/sdb1 ceph data, active, cluster ceph, osd.0, journal /dev/sdc1
+ /dev/sdc :
+ /dev/sdc1 ceph journal, for /dev/sdb1
+ /dev/sr0 other, unknown
+
+ To:
+
+ {"/dev/sda2": "other, 0x5",
+ "/dev/sda5": "other, LVM2_member",
+ "/dev/sda1": "other, ext2, mounted on /boot",
+ "/dev/sdb1": "ceph data, active, cluster ceph, osd.0, journal /dev/sdc1",
+ "/dev/sdc1": "ceph journal, for /dev/sdb1",
+ "/dev/sr0": "other, unknown"}
+ """
+ cmd = ['sudo', which('ceph-disk'), 'list']
+ process = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True
+ )
+ stdout = process.stdout.read().splitlines()
+ stderr = process.stderr.read().splitlines()
+ returncode = process.wait()
+ if not stdout:
+ raise RuntimeError("'ceph-disk list' failed with: %s" % ' '.join(stderr))
+
+ device_map = {}
+
+ for line in stdout:
+ dev, comment = line.strip().split(' ', 1)
+ if line.endswith(':'):
+ continue
+ device_map[dev] = comment
+
+ return device_map
+
+
+# XXX This test needs to be revisited. The loops obfuscate the values. They
+# could very well be parametrized
+class TestOSD(object):
+
+ @uses_collocated_journals
+ def test_osds_are_all_collocated(self, node_config):
+ system_devices = get_system_devices()
+ devices = node_config.get('devices', [])
+ for device in devices:
+ osd_devices = dict((d, comment) for d, comment in system_devices.items() if d.startswith(device))
+ journal = dict((d, comment) for d, comment in osd_devices.items() if 'ceph journal' in comment)
+ osd = dict((d, comment) for d, comment in osd_devices.items() if 'ceph data' in comment)
+ assert journal != {}, 'no journal found for device: %s' % device
+ assert osd != {}, 'no osd found for device: %s' % device