Migrating to Python v3

 - support for Python v3.8.x
 - support for Python v3.5.x
 - new tag, 2019.2.8
 - updates class generation and iterators
 - unittests updated with coverage >75%
 - new coverage routines
 - unittests profiling
 - full fake data for unittests
 - unittest testrun is ~1.5 seconds long

Bugfixes
 - 34834, proper use of 'sudo' option
 - multiple proper iterator use
 - 37919, show warning when installed and candidate versions
   are newer comparing to release version

Change-Id: Idd6b889f7ce94ae0c832e2f0a0346e4fdc3264a3
Related-PROD: PROD-34834 PROD-34664 PROD-34919
diff --git a/cfg_checker/modules/network/mapper.py b/cfg_checker/modules/network/mapper.py
index 482bdfa..59f3781 100644
--- a/cfg_checker/modules/network/mapper.py
+++ b/cfg_checker/modules/network/mapper.py
@@ -124,7 +124,7 @@
                 continue
 
             # build map based on IPs and save info too
-            for if_name, _dat in _pillar.iteritems():
+            for if_name, _dat in _pillar.items():
                 # get proper IF name
                 _if_name = if_name if 'name' not in _dat else _dat['name']
                 # place it
@@ -195,11 +195,11 @@
 
         logger_cli.info("-> mapping IPs")
         # match interfaces by IP subnets
-        for host, node_data in salt_master.nodes.iteritems():
+        for host, node_data in salt_master.nodes.items():
             if not salt_master.is_node_available(host):
                 continue
 
-            for net_name, net_data in node_data['networks'].iteritems():
+            for net_name, net_data in node_data['networks'].items():
                 # cut net name
                 _i = net_name.find('@')
                 _name = net_name if _i < 0 else net_name[:_i]
@@ -321,7 +321,7 @@
 
                 # debug, print built tree
                 # logger_cli.debug("# '{}'".format(_ifname))
-                lvls = _tree.keys()
+                lvls = list(_tree.keys())
                 lvls.sort()
                 n = len(lvls)
                 m = max([len(_tree[k].keys()) for k in _tree.keys()])
@@ -330,11 +330,14 @@
                 while True:
                     _lv = lvls.pop(0)
                     # get all interfaces on this level
-                    nets = _tree[_lv].keys()
+                    nets = iter(_tree[_lv].keys())
                     while True:
                         y = 0
                         # get next interface
-                        _net = nets.pop(0)
+                        try:
+                            _net = next(nets)
+                        except StopIteration:
+                            break
                         # all nets
                         _a = [_net]
                         # put current interface if this is only one left