blob: da61683e1a5e91ac27b5ea94aaf62d5ed5cc753f [file] [log] [blame]
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03001import pytest
2import json
3import utils
4import os
Hanna Arhipova1eef8312019-05-06 20:14:18 +03005import logging
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03006
7
Oleksii Zhurba23c18332019-05-09 18:53:40 -05008@pytest.mark.full
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +03009def test_mtu(local_salt_client, nodes_in_group):
10 testname = os.path.basename(__file__).split('.')[0]
11 config = utils.get_configuration()
12 skipped_ifaces = config.get(testname)["skipped_ifaces"] or \
Oleksii Zhurba674bd132019-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 Kruglovbc0a88b2019-08-20 11:45:35 +020015 group, nodes = nodes_in_group
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030016 total = {}
17 network_info = local_salt_client.cmd(
Dmitriy Kruglovbc0a88b2019-08-20 11:45:35 +020018 tgt="L@"+','.join(nodes),
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030019 param='ls /sys/class/net/',
20 expr_form='compound')
21
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +030022 if len(list(network_info.keys())) < 2:
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030023 pytest.skip("Nothing to compare - only 1 node")
24
Oleksii Zhurba674bd132019-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 Chernovac73bc4e2019-11-12 14:56:03 +030033 for node, ifaces_info in network_info.items():
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030034 if isinstance(ifaces_info, bool):
Valentyn Khalin5670e592020-05-13 19:45:36 +030035 logging.info("{} node skipped. No interfaces available.".format(node))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030036 continue
Oleksii Zhurba674bd132019-05-28 18:42:00 -050037 # if node is a kvm node and virsh is installed there
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +030038 if node in list(kvm_nodes.keys()) and kvm_nodes[node]:
Valentyn Khalin5670e592020-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)
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030055 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:
63 iface_mtu = local_salt_client.cmd(tgt=node,
64 param='cat /sys/class/'
65 'net/{}/mtu'.format(iface))
66 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 Chernovac73bc4e2019-11-12 14:56:03 +030075 my_set.update(list(total[node].keys()))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030076 for interf in my_set:
77 diff = []
78 row = []
79 for node in nodes:
Ekaterina Chernovac73bc4e2019-11-12 14:56:03 +030080 if interf in list(total[node].keys()):
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030081 diff.append(total[node][interf])
82 row.append("{}: {}".format(node, total[node][interf]))
83 else:
Oleksii Zhurba674bd132019-05-28 18:42:00 -050084 row.append("{}: No interface".format(node))
Hanna Arhipovae6ed8e42019-05-15 16:27:08 +030085 if diff.count(diff[0]) < len(nodes):
86 row.sort()
87 row.insert(0, interf)
88 mtu_data.append(row)
Dmitriy Kruglovbc0a88b2019-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 Khalin5670e592020-05-13 19:45:36 +030092 )