Network check fixes

- Proper network mapping
- Proper reclass lookup
- VIP detection
- Simple error gathering
- IP shown as 'exploded', i.e. in CIDR format
- MTU matching and detection
- Errors class for handling errors, including codes and indices
- Summary and detailed errors view
- Flake8 refactoring

Change-Id: I8ee37d345bdc21c7ad930bf8305acd28f8c121c8
Related-PROD: PROD-28199
diff --git a/cfg_checker/nodes.py b/cfg_checker/nodes.py
index 776c8b2..d518e75 100644
--- a/cfg_checker/nodes.py
+++ b/cfg_checker/nodes.py
@@ -1,12 +1,9 @@
-import json
 import os
-import sys
+from copy import deepcopy
 
-from  copy import deepcopy
-
-from cfg_checker.common import utils, const
-from cfg_checker.common import config, logger, logger_cli, pkg_dir
-from cfg_checker.common import salt_utils
+from cfg_checker.common import config, const
+from cfg_checker.common import logger, logger_cli, pkg_dir
+from cfg_checker.common import salt_utils, utils
 
 node_tmpl = {
     'role': '',
@@ -22,7 +19,7 @@
         logger_cli.info("# Collecting nodes")
         # simple salt rest client
         self.salt = salt_utils.SaltRemote()
-        
+
         # Keys for all nodes
         # this is not working in scope of 2016.8.3, will overide with list
         logger_cli.debug("...collecting node names existing in the cloud")
@@ -36,18 +33,22 @@
             self.node_keys = {
                 'minions': _keys['minions']
             }
-        except Exception as e:
+        except Exception:
             _keys = None
             self.node_keys = None
-        
+
         # List of minions with grains
         _minions = self.salt.list_minions()
         if _minions:
-            logger_cli.info("-> api reported {} active minions".format(len(_minions)))
+            logger_cli.info(
+                "-> api reported {} active minions".format(len(_minions))
+            )
         elif not self.node_keys:
             # this is the last resort
             _minions = config.load_nodes_list()
-            logger_cli.info("-> {} nodes loaded from list file".format(len(_minions)))
+            logger_cli.info(
+                "-> {} nodes loaded from list file".format(len(_minions))
+            )
         else:
             _minions = self.node_keys['minions']
 
@@ -87,7 +88,7 @@
             lambda nd: self.nodes[nd]['role'] == const.all_roles_map['cfg'],
             self.nodes
         )[0]
-        
+
         # OpenStack versions
         self.mcp_release = self.salt.pillar_get(
             self.master_node,
@@ -98,7 +99,6 @@
             "_param:openstack_version"
         )[self.master_node]
 
-
     def skip_node(self, node):
         # Add node to skip list
         # Fro example if it is fails to comply with the rules
@@ -119,7 +119,9 @@
 
         :return: no return value, data pulished internally
         """
-        logger_cli.debug("...collecting node pillars for '{}'".format(pillar_path))
+        logger_cli.debug(
+            "...collecting node pillars for '{}'".format(pillar_path)
+        )
         _result = self.salt.pillar_get(self.active_nodes_compound, pillar_path)
         self.not_responded = []
         for node, data in self.nodes.iteritems():
@@ -152,7 +154,7 @@
                 self.not_responded.append(node)
             else:
                 _data[_pillar_keys[-1]] = _result[node]
-    
+
     def execute_script_on_active_nodes(self, script_filename, args=[]):
         # Prepare script
         _p = os.path.join(pkg_dir, 'scripts', script_filename)
@@ -162,12 +164,13 @@
             config.salt_file_root, config.salt_scripts_folder
         )
         logger_cli.debug(
-            "...Uploading script {} to master's file cache folder: '{}'".format(
+            "...Uploading script {} "
+            "to master's file cache folder: '{}'".format(
                 script_filename,
                 _storage_path
             )
         )
-        _result = self.salt.mkdir("cfg01*", _storage_path)
+        self.salt.mkdir("cfg01*", _storage_path)
         # Form cache, source and target path
         _cache_path = os.path.join(_storage_path, script_filename)
         _source_path = os.path.join(
@@ -182,11 +185,15 @@
         )
 
         logger_cli.debug("...creating file in cache '{}'".format(_cache_path))
-        _result = self.salt.f_touch_master(_cache_path)
-        _result = self.salt.f_append_master(_cache_path, _script)
+        self.salt.f_touch_master(_cache_path)
+        self.salt.f_append_master(_cache_path, _script)
         # command salt to copy file to minions
-        logger_cli.debug("...creating script target folder '{}'".format(_cache_path))
-        _result = self.salt.mkdir(
+        logger_cli.debug(
+            "...creating script target folder '{}'".format(
+                _cache_path
+            )
+        )
+        self.salt.mkdir(
             self.active_nodes_compound,
             os.path.join(
                 '/root',
@@ -195,14 +202,15 @@
             tgt_type="compound"
         )
         logger_cli.info("-> Running script to all active nodes")
-        _result = self.salt.get_file(
+        logger.debug("... syncing file to nodes")
+        self.salt.get_file(
             self.active_nodes_compound,
             _source_path,
             _target_path,
             tgt_type="compound"
         )
         # execute pkg collecting script
-        logger.debug("Running script to all nodes")
+        logger.debug("... running script")
         # handle results for each node
         _script_arguments = " ".join(args) if args else ""
         self.not_responded = []
@@ -214,7 +222,7 @@
         )
 
         # all false returns means that there is no response
-        self.not_responded = [_n for _n  in _r.keys() if not _r[_n]]
+        self.not_responded = [_n for _n in _r.keys() if not _r[_n]]
         return _r
 
     def is_node_available(self, node, log=True):
@@ -228,4 +236,3 @@
             return False
         else:
             return True
-