blob: da61683e1a5e91ac27b5ea94aaf62d5ed5cc753f [file] [log] [blame]
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00001import pytest
2import json
Hanna Arhipova16e93fb2019-01-23 19:03:01 +02003import utils
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +00004import os
Hanna Arhipova56eab942019-05-06 20:14:18 +03005import logging
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +00006
7
Oleksii Zhurba5b15b9b2019-05-09 18:53:40 -05008@pytest.mark.full
Oleksii Zhurbad0ae87f2018-03-26 13:36:25 -05009def test_mtu(local_salt_client, nodes_in_group):
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000010 testname = os.path.basename(__file__).split('.')[0]
Oleksii Zhurbae0668ae2017-10-27 23:58:18 +000011 config = utils.get_configuration()
Oleksii Zhurba3dbed242017-10-31 19:58:53 +000012 skipped_ifaces = config.get(testname)["skipped_ifaces"] or \
Oleksii Zhurba4e667e52019-05-28 18:42:00 -050013 ["bonding_masters", "lo", "veth", "tap", "cali", "qv", "qb", "br-int",
14 "vxlan", "virbr0", "virbr0-nic", "docker0", "o-hm0"]
Dmitriy Kruglova34a3042019-08-20 11:45:35 +020015 group, nodes = nodes_in_group
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000016 total = {}
17 network_info = local_salt_client.cmd(
Dmitriy Kruglova34a3042019-08-20 11:45:35 +020018 tgt="L@"+','.join(nodes),
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050019 param='ls /sys/class/net/',
20 expr_form='compound')
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000021
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030022 if len(list(network_info.keys())) < 2:
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000023 pytest.skip("Nothing to compare - only 1 node")
24
Oleksii Zhurba4e667e52019-05-28 18:42:00 -050025 # collect all nodes and check if virsh is installed there
26 kvm_nodes = local_salt_client.cmd(
27 tgt='salt:control',
28 fun='pkg.version',
29 param='libvirt-clients',
30 expr_form='pillar'
31 )
32
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030033 for node, ifaces_info in network_info.items():
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050034 if isinstance(ifaces_info, bool):
Valentyn Khalin60f57cc2020-05-13 19:45:36 +030035 logging.info("{} node skipped. No interfaces available.".format(node))
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050036 continue
Oleksii Zhurba4e667e52019-05-28 18:42:00 -050037 # if node is a kvm node and virsh is installed there
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030038 if node in list(kvm_nodes.keys()) and kvm_nodes[node]:
Valentyn Khalin60f57cc2020-05-13 19:45:36 +030039 domain_name = node.split(".", 1)[1]
40 # vms_count calculated separately to have readable output
41 # and for further debug if needed
42 vms_count = local_salt_client.cmd(tgt=node, param="virsh list | grep {}"
43 .format(domain_name))
44 if not vms_count[node]:
45 logging.info("{} node skipped. No OS vm's running.".format(node))
46 continue
47 # param assumes that KVM has OS vm's running.
48 # virsh list | grep domain_name --- fails
49 # if KVM has nothing to grep and test fails
50 param = "virsh list | grep " + domain_name + "| awk '{print $2}' | " \
51 "xargs -n1 virsh domiflist | " \
52 "grep -v br-pxe | grep br- | " \
53 "awk '{print $1}' "
54 kvm_info = local_salt_client.cmd(tgt=node, param=param)
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000055 ifaces_info = kvm_info.get(node)
56 node_ifaces = ifaces_info.split('\n')
57 ifaces = {}
58 for iface in node_ifaces:
59 for skipped_iface in skipped_ifaces:
60 if skipped_iface in iface:
61 break
62 else:
Oleksii Zhurba4bfd2ee2019-04-10 21:56:58 -050063 iface_mtu = local_salt_client.cmd(tgt=node,
64 param='cat /sys/class/'
65 'net/{}/mtu'.format(iface))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000066 ifaces[iface] = iface_mtu.get(node)
67 total[node] = ifaces
68
69 nodes = []
70 mtu_data = []
71 my_set = set()
72
73 for node in total:
74 nodes.append(node)
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030075 my_set.update(list(total[node].keys()))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000076 for interf in my_set:
77 diff = []
78 row = []
79 for node in nodes:
Ekaterina Chernovae32e3f92019-11-12 14:56:03 +030080 if interf in list(total[node].keys()):
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000081 diff.append(total[node][interf])
82 row.append("{}: {}".format(node, total[node][interf]))
83 else:
Oleksii Zhurba4e667e52019-05-28 18:42:00 -050084 row.append("{}: No interface".format(node))
Oleksii Zhurbaa10927b2017-09-27 22:09:23 +000085 if diff.count(diff[0]) < len(nodes):
86 row.sort()
87 row.insert(0, interf)
88 mtu_data.append(row)
Dmitriy Kruglova34a3042019-08-20 11:45:35 +020089 assert len(mtu_data) == 0, (
90 "Non-uniform MTUs are set on the same node interfaces of '{}' group "
91 "of nodes: {}".format(group, json.dumps(mtu_data, indent=4))
Valentyn Khalin60f57cc2020-05-13 19:45:36 +030092 )