blob: 9e4b9786999f6882244d4c9e3098c30a18fdc835 [file] [log] [blame]
Dmitriy Kruglove961f272019-01-23 09:37:13 +01001import pytest
2from collections import Counter
3from pprint import pformat
4import os
5from cvp_checks import utils
6
7
8def get_duplicate_ifaces(nodes, ips):
9 dup_ifaces = {}
10 for node in nodes:
11 for iface in nodes[node]['ip4_interfaces']:
12 if set(nodes[node]['ip4_interfaces'][iface]) & set(ips):
13 dup_ifaces[node] = {iface: nodes[node]['ip4_interfaces'][iface]}
14 return dup_ifaces
15
16def test_duplicate_ips(local_salt_client):
17 active_nodes = utils.get_active_nodes()
18
19 testname = os.path.basename(__file__).split('.')[0]
20 config = utils.get_configuration()
21 skipped_ifaces = config.get(testname)["skipped_ifaces"]
22
23 local_salt_client.cmd('L@'+','.join(active_nodes),
24 'saltutil.refresh_grains',
25 expr_form='compound')
26 nodes = local_salt_client.cmd('L@'+','.join(active_nodes),
27 'grains.item',
28 ['ip4_interfaces'],
29 expr_form='compound')
30
31 ipv4_list = []
32 for node in nodes:
33 for iface in nodes[node]['ip4_interfaces']:
34 # Omit 'ip-less' ifaces
35 if not nodes[node]['ip4_interfaces'][iface]:
36 continue
37 if iface in skipped_ifaces:
38 continue
39 ipv4_list.extend(nodes[node]['ip4_interfaces'][iface])
40 no_dups = (len(ipv4_list) == len(set(ipv4_list)))
41 if not no_dups:
42 ips_count = Counter(ipv4_list).most_common()
43 dup_ips = filter(lambda x: x[1] > 1, ips_count)
44 dup_ifaces = get_duplicate_ifaces(nodes, [v[0] for v in dup_ips])
45
46 msg = ("\nDuplicate IP addresses found:\n{}"
47 "\n\nThe following interfaces are affected:\n{}"
48 "".format(pformat(dup_ips), pformat(dup_ifaces)))
49 assert no_dups, msg