2016-10-28 03:39:12 +08:00
|
|
|
import pytest
|
2019-03-28 16:11:09 +08:00
|
|
|
import json
|
2017-05-05 03:04:23 +08:00
|
|
|
import os
|
2016-10-28 03:39:12 +08:00
|
|
|
|
2019-03-28 16:11:09 +08:00
|
|
|
def str_to_bool(val):
|
|
|
|
try:
|
|
|
|
val = val.lower()
|
|
|
|
except AttributeError:
|
|
|
|
val = str(val).lower()
|
|
|
|
if val == 'true':
|
|
|
|
return True
|
|
|
|
elif val == 'false':
|
|
|
|
return False
|
|
|
|
else:
|
|
|
|
raise ValueError("Invalid input value: %s" % val)
|
2016-10-28 03:39:12 +08:00
|
|
|
|
2016-12-03 22:07:09 +08:00
|
|
|
@pytest.fixture()
|
2017-08-22 02:07:43 +08:00
|
|
|
def node(host, request):
|
2016-12-06 23:54:50 +08:00
|
|
|
"""
|
|
|
|
This fixture represents a single node in the ceph cluster. Using the
|
2018-03-29 18:19:29 +08:00
|
|
|
host.ansible fixture provided by testinfra it can access all the ansible
|
|
|
|
variables provided to it by the specific test scenario being ran.
|
2016-12-06 23:54:50 +08:00
|
|
|
|
2018-03-29 18:19:29 +08:00
|
|
|
You must include this fixture on any tests that operate on specific type
|
|
|
|
of node because it contains the logic to manage which tests a node
|
|
|
|
should run.
|
2016-12-06 23:54:50 +08:00
|
|
|
"""
|
2017-08-22 02:07:43 +08:00
|
|
|
ansible_vars = host.ansible.get_variables()
|
2017-05-05 03:04:23 +08:00
|
|
|
# tox will pass in this environment variable. we need to do it this way
|
|
|
|
# because testinfra does not collect and provide ansible config passed in
|
|
|
|
# from using --extra-vars
|
2017-09-28 06:17:12 +08:00
|
|
|
ceph_stable_release = os.environ.get("CEPH_STABLE_RELEASE", "luminous")
|
2019-03-28 16:11:09 +08:00
|
|
|
rolling_update = str_to_bool(os.environ.get("ROLLING_UPDATE", False))
|
2018-06-20 19:44:08 +08:00
|
|
|
group_names = ansible_vars["group_names"]
|
2016-12-08 09:17:09 +08:00
|
|
|
docker = ansible_vars.get("docker")
|
2018-10-29 23:24:45 +08:00
|
|
|
fsid = ansible_vars.get("fsid")
|
2017-08-24 17:17:56 +08:00
|
|
|
osd_auto_discovery = ansible_vars.get("osd_auto_discovery")
|
2018-08-04 00:15:58 +08:00
|
|
|
osd_scenario = ansible_vars.get("osd_scenario")
|
|
|
|
lvm_scenario = osd_scenario in ['lvm', 'lvm-batch']
|
2019-03-28 16:11:09 +08:00
|
|
|
devices = ansible_vars.get("devices", [])
|
2017-10-11 22:21:52 +08:00
|
|
|
ceph_release_num = {
|
2018-03-29 18:19:29 +08:00
|
|
|
'jewel': 10,
|
|
|
|
'kraken': 11,
|
|
|
|
'luminous': 12,
|
|
|
|
'mimic': 13,
|
|
|
|
'dev': 99
|
2017-10-11 22:21:52 +08:00
|
|
|
}
|
2016-12-03 22:07:09 +08:00
|
|
|
|
2018-06-20 19:44:08 +08:00
|
|
|
# capture the initial/default state
|
|
|
|
test_is_applicable = False
|
|
|
|
for marker in request.node.iter_markers():
|
|
|
|
if marker.name in group_names or marker.name == 'all':
|
|
|
|
test_is_applicable = True
|
|
|
|
break
|
|
|
|
# Check if any markers on the test method exist in the nodes group_names. If they do not, this test is not valid for the node being tested.
|
|
|
|
if not test_is_applicable:
|
|
|
|
reason = "%s: Not a valid test for node type: %s" % (request.function, group_names)
|
|
|
|
pytest.skip(reason)
|
|
|
|
|
|
|
|
if request.node.get_closest_marker("no_lvm_scenario") and lvm_scenario:
|
2017-08-31 20:48:24 +08:00
|
|
|
pytest.skip("Not a valid test for lvm scenarios")
|
|
|
|
|
2018-06-20 19:44:08 +08:00
|
|
|
if not lvm_scenario and request.node.get_closest_marker("lvm_scenario"):
|
2017-08-22 02:07:43 +08:00
|
|
|
pytest.skip("Not a valid test for non-lvm scenarios")
|
|
|
|
|
2018-06-20 19:44:08 +08:00
|
|
|
if request.node.get_closest_marker("no_docker") and docker:
|
2018-03-29 18:19:29 +08:00
|
|
|
pytest.skip(
|
|
|
|
"Not a valid test for containerized deployments or atomic hosts")
|
2016-12-08 09:17:09 +08:00
|
|
|
|
2018-06-20 19:44:08 +08:00
|
|
|
if request.node.get_closest_marker("docker") and not docker:
|
2018-03-29 18:19:29 +08:00
|
|
|
pytest.skip(
|
|
|
|
"Not a valid test for non-containerized deployments or atomic hosts") # noqa E501
|
2017-05-01 23:45:03 +08:00
|
|
|
|
2017-07-27 23:05:59 +08:00
|
|
|
journal_collocation_test = ansible_vars.get("osd_scenario") == "collocated"
|
2018-06-20 19:44:08 +08:00
|
|
|
if request.node.get_closest_marker("journal_collocation") and not journal_collocation_test: # noqa E501
|
2016-12-07 00:50:54 +08:00
|
|
|
pytest.skip("Scenario is not using journal collocation")
|
2016-12-06 06:21:52 +08:00
|
|
|
|
2016-12-04 10:01:30 +08:00
|
|
|
# I can assume eth1 because I know all the vagrant
|
|
|
|
# boxes we test with use that interface
|
2017-08-22 02:07:43 +08:00
|
|
|
address = host.interface("eth1").addresses[0]
|
2016-12-06 23:58:01 +08:00
|
|
|
subnet = ".".join(ansible_vars["public_network"].split(".")[0:-1])
|
2016-12-07 00:55:20 +08:00
|
|
|
num_mons = len(ansible_vars["groups"]["mons"])
|
2017-08-24 17:17:56 +08:00
|
|
|
if osd_auto_discovery:
|
2018-09-07 03:00:56 +08:00
|
|
|
num_osds = 3
|
2017-08-24 17:17:56 +08:00
|
|
|
else:
|
2018-09-07 03:00:56 +08:00
|
|
|
num_osds = len(ansible_vars.get("devices", []))
|
|
|
|
if not num_osds:
|
|
|
|
num_osds = len(ansible_vars.get("lvm_volumes", []))
|
|
|
|
osds_per_device = ansible_vars.get("osds_per_device", 1)
|
|
|
|
num_osds = num_osds * osds_per_device
|
|
|
|
|
2018-09-01 03:29:17 +08:00
|
|
|
# If number of devices doesn't map to number of OSDs, allow tests to define
|
|
|
|
# that custom number, defaulting it to ``num_devices``
|
2018-09-07 03:00:56 +08:00
|
|
|
num_osds = ansible_vars.get('num_osds', num_osds)
|
2019-03-28 16:11:09 +08:00
|
|
|
if rolling_update:
|
|
|
|
cluster_name = "test"
|
|
|
|
else:
|
|
|
|
cluster_name = ansible_vars.get("cluster", "ceph")
|
2016-12-07 00:55:20 +08:00
|
|
|
conf_path = "/etc/ceph/{}.conf".format(cluster_name)
|
2017-02-03 02:39:06 +08:00
|
|
|
|
2016-12-04 10:01:30 +08:00
|
|
|
data = dict(
|
|
|
|
address=address,
|
2016-12-05 23:47:33 +08:00
|
|
|
subnet=subnet,
|
2016-12-06 23:58:01 +08:00
|
|
|
vars=ansible_vars,
|
2016-12-07 00:55:20 +08:00
|
|
|
num_mons=num_mons,
|
2018-09-01 03:29:17 +08:00
|
|
|
num_osds=num_osds,
|
2016-12-07 03:32:28 +08:00
|
|
|
cluster_name=cluster_name,
|
|
|
|
conf_path=conf_path,
|
2016-12-08 09:17:09 +08:00
|
|
|
docker=docker,
|
2019-03-28 16:11:09 +08:00
|
|
|
fsid=fsid,
|
|
|
|
devices=devices,
|
2017-05-05 03:04:23 +08:00
|
|
|
ceph_stable_release=ceph_stable_release,
|
tests: add mimic support for test_rbd_mirror_is_up()
prior mimic, the data structure returned by `ceph -s -f json` used to
gather information about rbd-mirror daemons looked like below:
```
"servicemap": {
"epoch": 8,
"modified": "2018-07-05 13:21:06.207483",
"services": {
"rbd-mirror": {
"daemons": {
"summary": "",
"ceph-nano-luminous-faa32aebf00b": {
"start_epoch": 8,
"start_stamp": "2018-07-05 13:21:04.668450",
"gid": 14107,
"addr": "172.17.0.2:0/2229952892",
"metadata": {
"arch": "x86_64",
"ceph_version": "ceph version 12.2.5 (cad919881333ac92274171586c827e01f554a70a) luminous (stable)",
"cpu": "Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz",
"distro": "centos",
"distro_description": "CentOS Linux 7 (Core)",
"distro_version": "7",
"hostname": "ceph-nano-luminous-faa32aebf00b",
"instance_id": "14107",
"kernel_description": "#1 SMP Wed Mar 14 15:12:16 UTC 2018",
"kernel_version": "4.9.87-linuxkit-aufs",
"mem_swap_kb": "1048572",
"mem_total_kb": "2046652",
"os": "Linux"
}
}
}
}
}
}
```
This part has changed from mimic and became:
```
"servicemap": {
"epoch": 2,
"modified": "2018-07-04 09:54:36.164786",
"services": {
"rbd-mirror": {
"daemons": {
"summary": "",
"14151": {
"start_epoch": 2,
"start_stamp": "2018-07-04 09:54:35.541272",
"gid": 14151,
"addr": "192.168.1.80:0/240942528",
"metadata": {
"arch": "x86_64",
"ceph_release": "mimic",
"ceph_version": "ceph version 13.2.0 (79a10589f1f80dfe21e8f9794365ed98143071c4) mimic (stable)",
"ceph_version_short": "13.2.0",
"cpu": "Intel(R) Xeon(R) CPU X5650 @ 2.67GHz",
"distro": "centos",
"distro_description": "CentOS Linux 7 (Core)",
"distro_version": "7",
"hostname": "ceph-rbd-mirror0",
"id": "ceph-rbd-mirror0",
"instance_id": "14151",
"kernel_description": "#1 SMP Wed May 9 18:05:47 UTC 2018",
"kernel_version": "3.10.0-862.2.3.el7.x86_64",
"mem_swap_kb": "1572860",
"mem_total_kb": "1015548",
"os": "Linux"
}
}
}
}
}
}
```
This patch modifies the function `test_rbd_mirror_is_up()` in
`test_rbd_mirror.py` so it works with `mimic` and keeps backward compatibility
with `luminous`
Signed-off-by: Guillaume Abrioux <gabrioux@redhat.com>
2018-07-05 21:16:19 +08:00
|
|
|
ceph_release_num=ceph_release_num,
|
2018-07-18 17:07:49 +08:00
|
|
|
rolling_update=rolling_update,
|
2016-12-04 10:01:30 +08:00
|
|
|
)
|
|
|
|
return data
|
|
|
|
|
2016-12-03 22:07:09 +08:00
|
|
|
|
|
|
|
def pytest_collection_modifyitems(session, config, items):
|
|
|
|
for item in items:
|
|
|
|
test_path = item.location[0]
|
|
|
|
if "mon" in test_path:
|
|
|
|
item.add_marker(pytest.mark.mons)
|
|
|
|
elif "osd" in test_path:
|
|
|
|
item.add_marker(pytest.mark.osds)
|
|
|
|
elif "mds" in test_path:
|
|
|
|
item.add_marker(pytest.mark.mdss)
|
2017-09-17 17:16:54 +08:00
|
|
|
elif "mgr" in test_path:
|
|
|
|
item.add_marker(pytest.mark.mgrs)
|
|
|
|
elif "rbd-mirror" in test_path:
|
|
|
|
item.add_marker(pytest.mark.rbdmirrors)
|
2016-12-03 22:07:09 +08:00
|
|
|
elif "rgw" in test_path:
|
|
|
|
item.add_marker(pytest.mark.rgws)
|
2017-08-22 01:36:38 +08:00
|
|
|
elif "nfs" in test_path:
|
|
|
|
item.add_marker(pytest.mark.nfss)
|
2018-03-29 18:19:29 +08:00
|
|
|
elif "iscsi" in test_path:
|
2018-06-06 12:07:33 +08:00
|
|
|
item.add_marker(pytest.mark.iscsigws)
|
2016-12-03 22:07:09 +08:00
|
|
|
else:
|
|
|
|
item.add_marker(pytest.mark.all)
|
2016-12-06 06:21:52 +08:00
|
|
|
|
|
|
|
if "journal_collocation" in test_path:
|
2019-03-28 16:11:09 +08:00
|
|
|
item.add_marker(pytest.mark.journal_collocation)
|