mirror of https://github.com/ceph/ceph-ansible.git
Merge pull request #1130 from ceph/colocated-tests
initial pass on tests for collocated journalspull/1132/head
commit
91ed7049b9
|
@ -14,6 +14,7 @@ nodes = {
|
|||
},
|
||||
'osd0': {
|
||||
'username': 'vagrant',
|
||||
'components': [],
|
||||
'components': ['collocated_journals'],
|
||||
'devices': ['/dev/sda', '/dev/sdb'],
|
||||
},
|
||||
}
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
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
|
16
tox.ini
16
tox.ini
|
@ -1,5 +1,5 @@
|
|||
[tox]
|
||||
envlist = {ansible2.2}-{xenial-conf-tests,xenial-mon-osd,xenial-cluster,journal-collocation,centos7-cluster,dmcrypt-journal,dmcrypt-journal-collocation}
|
||||
envlist = {ansible2.2}-{xenial_conf_tests,xenial_mon_osd,xenial_cluster,journal_collocation,centos7_cluster,dmcrypt_journal,dmcrypt_journal_collocation}
|
||||
skipsdist = True
|
||||
|
||||
[testenv]
|
||||
|
@ -17,19 +17,19 @@ deps=
|
|||
-r{toxinidir}/tests/requirements.txt
|
||||
changedir=
|
||||
# test a 3 mon cluster and ensures ceph.conf is rendered correctly
|
||||
xenial-conf-tests: {toxinidir}/tests/functional/ubuntu/16.04/mon
|
||||
xenial_conf_tests: {toxinidir}/tests/functional/ubuntu/16.04/mon
|
||||
# tests a 1 mon 1 osd xenial cluster using raw_multi_journal OSD scenario
|
||||
xenial-mon-osd: {toxinidir}/tests/functional/ubuntu/16.04/mon-osd
|
||||
xenial_mon_osd: {toxinidir}/tests/functional/ubuntu/16.04/mon-osd
|
||||
# tests a 1 mon, 1 osd, 1 mds and 1 rgw xenial cluster using raw_multi_journal OSD scenario
|
||||
xenial-cluster: {toxinidir}/tests/functional/ubuntu/16.04/mon-osd-mds-rgw
|
||||
xenial_cluster: {toxinidir}/tests/functional/ubuntu/16.04/mon-osd-mds-rgw
|
||||
# tests a 1 mon 1 osd centos7 cluster using journal_collocation OSD scenario
|
||||
journal-collocation: {toxinidir}/tests/functional/centos/7/journal-collocation
|
||||
journal_collocation: {toxinidir}/tests/functional/centos/7/journal-collocation
|
||||
# tests a 1 mon 1 osd centos7 cluster using dmcrypt_dedicated_journal OSD scenario
|
||||
dmcrypt-journal: {toxinidir}/tests/functional/centos/7/dmcrypt-dedicated-journal
|
||||
dmcrypt_journal: {toxinidir}/tests/functional/centos/7/dmcrypt-dedicated-journal
|
||||
# tests a 1 mon 1 osd centos7 cluster using dmcrypt_journal_collocation OSD scenario
|
||||
dmcrypt-journal-collocation: {toxinidir}/tests/functional/centos/7/dmcrypt-journal-collocation
|
||||
dmcrypt_journal_collocation: {toxinidir}/tests/functional/centos/7/dmcrypt-journal-collocation
|
||||
# tests a 1 mon, 1 osd, 1 mds and 1 rgw centos7 cluster using raw_multi_journal OSD scenario
|
||||
centos7-cluster: {toxinidir}/tests/functional/centos/7/mon-osd-mds-rgw
|
||||
centos7_cluster: {toxinidir}/tests/functional/centos/7/mon-osd-mds-rgw
|
||||
commands=
|
||||
vagrant up --no-provision {posargs:--provider=virtualbox}
|
||||
bash {toxinidir}/tests/scripts/generate_ssh_config.sh {changedir}
|
||||
|
|
Loading…
Reference in New Issue