blob: 0b336f2ad95cbfefdffcca82c059e71e219a1676 [file] [log] [blame]
Alex3ebc5632019-04-18 16:47:18 -05001from cfg_checker.common import logger_cli
Alex205546c2020-12-30 19:22:30 -06002from cfg_checker.modules.network.mapper import SaltNetworkMapper, \
3 KubeNetworkMapper
Alex3ebc5632019-04-18 16:47:18 -05004from cfg_checker.modules.network.network_errors import NetworkErrors
Alex Savatieievf526dc02019-03-06 10:11:32 -06005from cfg_checker.reports import reporter
Alex Savatieiev9b2f6512019-02-20 18:05:00 -06006
7
Alexe0c5b9e2019-04-23 18:51:23 -05008class NetworkChecker(object):
Alex205546c2020-12-30 19:22:30 -06009 def __init__(self):
Alexe0c5b9e2019-04-23 18:51:23 -050010 logger_cli.debug("... init error logs folder")
Alex3ebc5632019-04-18 16:47:18 -050011 self.errors = NetworkErrors()
12
Alex3cdb1bd2021-09-10 15:51:11 -050013 def _check_duplicate_ips(self):
14 # shortcuts
15 logger_cli.debug("... checking for duplicate ips")
16 _map = self.mapper.map
17 for _net in _map.keys():
18 _ips = set()
19 for _node_name, _interfaces in _map[_net].items():
20 for _if in _interfaces:
21 if _if["ip_address"] not in _ips:
22 # there was no such ip yet
23 _ips.add(_if["ip_address"])
24 else:
25 # this ip already used
26 logger_cli.warning(
27 "Warning: Duplicate ip address: "
28 "'{}: {}' at {} -> {}".format(
29 _if["interface"],
30 _if["ip_address"],
31 _net,
32 _node_name
33 )
34 )
35 self.errors.add_error(
36 self.errors.NET_DUPLICATE_IP,
37 network=_net,
38 node_name=_node_name,
39 if_name=_if["interface"],
40 ip_address=_if["ip_address"]
41 )
42 return
43
44 def _check_non_uniform_mtu(self):
45 # shortcuts
46 logger_cli.debug("... checking for duplicate ips")
47 _map = self.mapper.map
48 for _net in _map.keys():
49 _mtus = set()
50 for _node_name, _interfaces in _map[_net].items():
51 for _if in _interfaces:
52 if len(_mtus) < 1:
53 # this is the 1st iteration
54 _mtus.add(_if["rt_mtu"])
55 elif _if["rt_mtu"] not in _mtus:
56 # this ip already used
57 logger_cli.warning(
58 "Non-uniform MTU value of '{}' in '{}': "
59 "{}:{}:{}".format(
60 _net,
61 _node_name,
62 _if["interface"],
63 _if["ip_address"],
64 _if["rt_mtu"]
65 )
66 )
67 self.errors.add_error(
68 self.errors.NET_DUPLICATE_IP,
69 network=_net,
70 node_name=_node_name,
71 if_name=_if["interface"],
72 ip_address=_if["ip_address"],
73 mtu=_if["rt_mtu"]
74 )
75 return
76
77 def check_networks(self, map=True, skip_keywords=None):
78 # Load map
Alex1f90e7b2021-09-03 15:31:28 -050079 self.mapper.map_networks()
Alex3cdb1bd2021-09-10 15:51:11 -050080 self.mapper.create_map(skip_keywords=skip_keywords)
81 # Check for errors that is not detectable during mapping
82 self._check_duplicate_ips()
83 self._check_non_uniform_mtu()
84 # print map if requested
Alex836fac82019-08-22 13:36:16 -050085 if map:
86 self.mapper.print_map()
Alex Savatieiev42b89fa2019-03-07 18:45:26 -060087
Alex3ebc5632019-04-18 16:47:18 -050088 def print_summary(self):
Alex3ebc5632019-04-18 16:47:18 -050089 logger_cli.info(self.errors.get_summary(print_zeros=False))
Alex3ebc5632019-04-18 16:47:18 -050090
91 def print_error_details(self):
92 # Detailed errors
Alexb151fbe2019-04-22 16:53:30 -050093 logger_cli.info(
94 "\n{}\n".format(
95 self.errors.get_errors()
96 )
97 )
Alex3ebc5632019-04-18 16:47:18 -050098
Alex Savatieiev9b2f6512019-02-20 18:05:00 -060099 def create_html_report(self, filename):
100 """
101 Create static html showing network schema-like report
102
103 :return: none
104 """
105 logger_cli.info("### Generating report to '{}'".format(filename))
106 _report = reporter.ReportToFile(
Alex205546c2020-12-30 19:22:30 -0600107 reporter.HTMLNetworkReport(self.mapper.master),
Alex Savatieiev9b2f6512019-02-20 18:05:00 -0600108 filename
109 )
Alex9a4ad212020-10-01 18:04:25 -0500110 _report(
111 {
112 "domain": self.mapper.domain,
113 "nodes": self.mapper.nodes,
114 "map": self.mapper.map,
115 "mcp_release": self.mapper.cluster['mcp_release'],
116 "openstack_release": self.mapper.cluster['openstack_release']
117 }
118 )
Alex Savatieiev9b2f6512019-02-20 18:05:00 -0600119 logger_cli.info("-> Done")
Alex205546c2020-12-30 19:22:30 -0600120
121
122class SaltNetworkChecker(NetworkChecker):
123 def __init__(
124 self,
125 config,
126 skip_list=None,
127 skip_list_file=None
128 ):
129 super(SaltNetworkChecker, self).__init__()
130 self.mapper = SaltNetworkMapper(
131 config,
132 errors_class=self.errors,
133 skip_list=skip_list,
134 skip_list_file=skip_list_file
135 )
136
Alex359e5752021-08-16 17:28:30 -0500137
Alex205546c2020-12-30 19:22:30 -0600138class KubeNetworkChecker(NetworkChecker):
139 def __init__(
140 self,
141 config,
142 skip_list=None,
143 skip_list_file=None
144 ):
Alexc4f59622021-08-27 13:42:00 -0500145 super(KubeNetworkChecker, self).__init__()
Alex205546c2020-12-30 19:22:30 -0600146 self.mapper = KubeNetworkMapper(
147 config,
148 errors_class=self.errors,
149 skip_list=skip_list,
150 skip_list_file=skip_list_file
Alexe8643642021-08-23 14:08:46 -0500151 )