vpp_config: Rework for Python2/3 compatibility.

On ubuntu:
   $cd <basedir>/extras/vpp_config
   $./scripts/clean.sh
   $./scripts/cp-data.sh
   $sudo apt-get install python3-pip python3-setuptools
   $python3 -m pip install .
   $vpp-config

Changes:
   * Convert to print() function.
   * raw_input changes.
   * floor division changes.
   * replace vpp-config.py with a setuptools 'vpp-config' entry_point.
   * replace netaddr with ipaddress from the standard library and backport.
   * .decode() subprocess.Popen's stdout because in python3 they are bytes.

Change-Id: Id98894ee54e0c31a0ba0304134b159caef415705
Signed-off-by: Paul Vinciguerra <pvinci@vinciconsulting.com>
diff --git a/extras/vpp_config/README.rst b/extras/vpp_config/README.rst
index ec9c8e4..8995edf 100644
--- a/extras/vpp_config/README.rst
+++ b/extras/vpp_config/README.rst
@@ -11,7 +11,7 @@
 

 The installation and executing of the VPP configuration utility is simple. First

 install the python pip module. Using pip install, then pip install vpp-config.

-Then simply type Òvpp-configÓ and answer the questions. If you are not sure what

+Then simply type �vpp-config� and answer the questions. If you are not sure what

 to answer choose the default. For yes or no questions the capital letter

 designates the default. For example, for a question that shows [Y/n] Y is the

 default. For numbers the default is within the brackets for example for a

@@ -36,14 +36,15 @@
 in this environment. The scripts are meant to be run from the root directory.

 

   ./scripts/clean.sh

-  ./scripts/cp-data.sh 

-  ./vpp_config.py 

+  ./scripts/cp-data.sh

+  ./vpp-config

 

 When the utility is installed with pip the wrapper scripts/vpp-config is written to

 /usr/local/bin. However, the starting point when debugging this script locally is

-./vpp_config.py. Run the utility by executing ./vpp_config.py from the root directory. 

+vpp-config. Run the utility by executing vpp-config.

 

-The start point in the code is in vpp_config.py. However, most of the work is done in

+The start point in the code is in vpp_config.py. However, most of the work is

+done in

 the files in ./vpplib

 

 Uploading to PyPi:

@@ -51,7 +52,7 @@
 To upload this utility to PpPi simple do the following. Currently, I have my own account

 when we want everyone to contribute we will need to change that.

 

-  sudo ÐH bash

+  sudo �H bash

   cd vpp_config

   python setup.py sdist bdist_wheel

   twine upload dist/*

@@ -137,7 +138,7 @@
 Do you want to install VPP [Y/n]? 

 INFO:root: Local Command: ls /etc/apt/sources.list.d/99fd.io.list.orig

 INFO:root:  /etc/apt/sources.list.d/99fd.io.list.orig

-ÉÉ..

+��..

 

 What would you like to do?

 

diff --git a/extras/vpp_config/scripts/dpdk-devbind.py b/extras/vpp_config/scripts/dpdk-devbind.py
index f1d374d..b65677d 100755
--- a/extras/vpp_config/scripts/dpdk-devbind.py
+++ b/extras/vpp_config/scripts/dpdk-devbind.py
@@ -1,4 +1,4 @@
-#! /usr/bin/python
+#! /usr/bin/env python
 #
 #   BSD LICENSE
 #
@@ -647,5 +647,6 @@
     get_crypto_details()
     do_arg_actions()
 
+
 if __name__ == "__main__":
     main()
diff --git a/extras/vpp_config/scripts/vpp-config b/extras/vpp_config/scripts/vpp-config
deleted file mode 100755
index 7cb27fc..0000000
--- a/extras/vpp_config/scripts/vpp-config
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/python
-
-# Copyright (c) 2016 Cisco and/or its affiliates.
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at:
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""VPP Configuration Utility Wrapper"""
-
-import os
-import sys
-import vpp_config as vpp
-
-vpp.config_main()
diff --git a/extras/vpp_config/setup.py b/extras/vpp_config/setup.py
index d3d0e51..fca08f6 100644
--- a/extras/vpp_config/setup.py
+++ b/extras/vpp_config/setup.py
@@ -1,25 +1,33 @@
 from setuptools import setup
 
 setup(name="vpp_config",
-      version="18.10.4",
+      version="19.01.1",
       author="John DeNisco",
       author_email="jdenisco@cisco.com",
       description="VPP Configuration Utility",
-      license = 'Apache-2.0',
+      license='Apache-2.0',
       keywords="vppconfig",
-      url = 'https://wiki.fd.io/view/VPP',
+      url='https://wiki.fd.io/view/VPP',
       py_modules=['vpp_config'],
-      install_requires=['pyyaml','netaddr', 'requests'],
+      install_requires=['pyyaml', 'requests'],
+      extra_requires=["ipaddress; python_version < '3.3'"],
       packages=['vpplib'],
-      scripts=['scripts/vpp-config'],
+      entry_points={
+          'console_scripts': ['vpp-config=vpp_config:config_main'],
+      },
       data_files=[('vpp/vpp-config/scripts', ['scripts/dpdk-devbind.py']),
                   ('vpp/vpp-config/configs', ['data/auto-config.yaml']),
                   ('vpp/vpp-config/configs', ['data/cloud-config.iso']),
-                  ('vpp/vpp-config/configs', ['data/iperf-centos.xml.template']),
-                  ('vpp/vpp-config/configs', ['data/iperf-ubuntu.xml.template']),
-                  ('vpp/vpp-config/dryrun/sysctl.d', ['data/80-vpp.conf.template']),
+                  ('vpp/vpp-config/configs',
+                   ['data/iperf-centos.xml.template']),
+                  ('vpp/vpp-config/configs',
+                   ['data/iperf-ubuntu.xml.template']),
+                  ('vpp/vpp-config/dryrun/sysctl.d',
+                   ['data/80-vpp.conf.template']),
                   ('vpp/vpp-config/dryrun/default', ['data/grub.template']),
-                  ('vpp/vpp-config/dryrun/vpp', ['data/startup.conf.template']),
-      ],
-      long_description="The VPP configuration utility can be used to easily configure VPP.",
+                  ('vpp/vpp-config/dryrun/vpp',
+                   ['data/startup.conf.template']),
+                  ],
+      long_description="The VPP configuration utility can be used to "
+                       "easily configure VPP.",
       )
diff --git a/extras/vpp_config/vpp_config.py b/extras/vpp_config/vpp_config.py
index 145bf4e..1f79201 100755
--- a/extras/vpp_config/vpp_config.py
+++ b/extras/vpp_config/vpp_config.py
@@ -1,6 +1,7 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 # Copyright (c) 2016 Cisco and/or its affiliates.
+# Copyright (c) 2018 Vinci Consulting Corp.  All rights reserved.
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
@@ -14,6 +15,7 @@
 # limitations under the License.
 
 """VPP Configuration Main Entry"""
+from __future__ import absolute_import, division, print_function
 
 import re
 import os
@@ -24,6 +26,12 @@
 from vpplib.AutoConfig import AutoConfig
 from vpplib.VPPUtil import VPPUtil
 
+#  Python2/3 compatible
+try:
+    input = raw_input  # noqa
+except NameError:
+    pass
+
 VPP_DRYRUNDIR = '/vpp/vpp-config/dryrun'
 VPP_AUTO_CONFIGURATION_FILE = '/vpp/vpp-config/configs/auto-config.yaml'
 VPP_HUGE_PAGE_FILE = '/vpp/vpp-config/dryrun/sysctl.d/80-vpp.conf'
@@ -51,14 +59,14 @@
     default = default.lower()
     answer = ''
     while not input_valid:
-        answer = raw_input(question)
+        answer = input(question)
         if len(answer) == 0:
             answer = default
         if re.findall(r'[YyNn]', answer):
             input_valid = True
             answer = answer[0].lower()
         else:
-            print "Please answer Y, N or Return."
+            print ("Please answer Y, N or Return.")
 
     return answer
 
@@ -153,9 +161,9 @@
 
     diffs = autoconfig_diff(node, VPP_REAL_HUGE_PAGE_FILE, rootdir + VPP_HUGE_PAGE_FILE)
     if diffs != '':
-        print "These are the changes we will apply to"
-        print "the huge page file ({}).\n".format(VPP_REAL_HUGE_PAGE_FILE)
-        print diffs
+        print ("These are the changes we will apply to")
+        print ("the huge page file ({}).\n".format(VPP_REAL_HUGE_PAGE_FILE))
+        print (diffs)
         if ask_questions:
             answer = autoconfig_yn("\nAre you sure you want to apply these changes [Y/n]? ", 'y')
             if answer == 'n':
@@ -169,7 +177,7 @@
             raise RuntimeError('{} failed on node {} {} {}'.
                                format(cmd, node['host'], stdout, stderr))
     else:
-        print '\nThere are no changes to the huge page configuration.'
+        print ('\nThere are no changes to the huge page configuration.')
 
     return 0
 
@@ -189,9 +197,9 @@
 
     diffs = autoconfig_diff(node, VPP_REAL_STARTUP_FILE, rootdir + VPP_STARTUP_FILE)
     if diffs != '':
-        print "These are the changes we will apply to"
-        print "the VPP startup file ({}).\n".format(VPP_REAL_STARTUP_FILE)
-        print diffs
+        print ("These are the changes we will apply to")
+        print ("the VPP startup file ({}).\n".format(VPP_REAL_STARTUP_FILE))
+        print (diffs)
         if ask_questions:
             answer = autoconfig_yn("\nAre you sure you want to apply these changes [Y/n]? ", 'y')
             if answer == 'n':
@@ -200,7 +208,7 @@
         # Copy the VPP startup
         autoconfig_cp(node, rootdir + VPP_STARTUP_FILE, VPP_REAL_STARTUP_FILE)
     else:
-        print '\nThere are no changes to VPP startup.'
+        print ('\nThere are no changes to VPP startup.')
 
     return 0
 
@@ -218,12 +226,12 @@
 
     """
 
-    print "\nThe configured grub cmdline looks like this:"
+    print ("\nThe configured grub cmdline looks like this:")
     configured_cmdline = node['grub']['default_cmdline']
     current_cmdline = node['grub']['current_cmdline']
-    print configured_cmdline
-    print "\nThe current boot cmdline looks like this:"
-    print current_cmdline
+    print (configured_cmdline)
+    print ("\nThe current boot cmdline looks like this:")
+    print (current_cmdline)
     if ask_questions:
         question = "\nDo you want to keep the current boot cmdline [Y/n]? "
         answer = autoconfig_yn(question, 'y')
@@ -235,9 +243,9 @@
     # Diff the file
     diffs = autoconfig_diff(node, VPP_REAL_GRUB_FILE, rootdir + VPP_GRUB_FILE)
     if diffs != '':
-        print "These are the changes we will apply to"
-        print "the GRUB file ({}).\n".format(VPP_REAL_GRUB_FILE)
-        print diffs
+        print ("These are the changes we will apply to")
+        print ("the GRUB file ({}).\n".format(VPP_REAL_GRUB_FILE))
+        print (diffs)
         if ask_questions:
             answer = autoconfig_yn("\nAre you sure you want to apply these changes [y/N]? ", 'n')
             if answer == 'n':
@@ -256,11 +264,11 @@
             raise RuntimeError('{} failed on node {} {} {}'.
                                format(cmd, node['host'], stdout, stderr))
 
-        print "There have been changes to the GRUB config a",
-        print "reboot will be required."
+        print ("There have been changes to the GRUB config a", end=' ')
+        print ("reboot will be required.")
         return -1
     else:
-        print '\nThere are no changes to the GRUB config.'
+        print ('\nThere are no changes to the GRUB config.')
 
     return 0
 
@@ -281,13 +289,13 @@
     vutil = VPPUtil()
     pkgs = vutil.get_installed_vpp_pkgs()
     if len(pkgs) == 0:
-        print "\nVPP is not installed, Install VPP with option 4."
+        print ("\nVPP is not installed, Install VPP with option 4.")
         return
 
     acfg = AutoConfig(rootdir, VPP_AUTO_CONFIGURATION_FILE)
 
     if ask_questions:
-        print "\nWe are now going to configure your system(s).\n"
+        print ("\nWe are now going to configure your system(s).\n")
         answer = autoconfig_yn("Are you sure you want to do this [Y/n]? ", 'y')
         if answer == 'n':
             return
@@ -336,7 +344,7 @@
     vutil = VPPUtil()
     pkgs = vutil.get_installed_vpp_pkgs()
     if len(pkgs) == 0:
-        print "\nVPP is not installed, please install VPP."
+        print ("\nVPP is not installed, please install VPP.")
         return
 
     acfg = AutoConfig(rootdir, VPP_AUTO_CONFIGURATION_FILE, clean=True)
@@ -405,15 +413,15 @@
         pkgs = vutil.get_installed_vpp_pkgs()
 
         if len(pkgs) > 0:
-            print "\nThese packages are installed on node {}" \
-                .format(node['host'])
-            print "{:25} {}".format("Name", "Version")
+            print ("\nThese packages are installed on node {}"
+                   .format(node['host']))
+            print ("{:25} {}".format("Name", "Version"))
             for pkg in pkgs:
-                if 'version' in pkg:
-                    print "{:25} {}".format(
-                        pkg['name'], pkg['version'])
-                else:
-                    print "{}".format(pkg['name'])
+                try:
+                    print ("{:25} {}".format(
+                        pkg['name'], pkg['version']))
+                except KeyError:
+                    print ("{}".format(pkg['name']))
 
             question = "\nDo you want to uninstall these "
             question += "packages [y/N]? "
@@ -422,8 +430,8 @@
                 logger.setLevel(logging.INFO)
                 vutil.uninstall_vpp(node)
         else:
-            print "\nThere are no VPP packages on node {}." \
-                .format(node['host'])
+            print ("\nThere are no VPP packages on node {}."
+                   .format(node['host']))
             question = "Do you want to install VPP [Y/n]? "
             answer = autoconfig_yn(question, 'y')
             if answer == 'y':
@@ -488,7 +496,7 @@
 
     """
 
-    print "\nThis Feature is not implemented yet...."
+    print ("\nThis Feature is not implemented yet....")
 
 
 def autoconfig_basic_test_menu():
@@ -502,20 +510,20 @@
 2) Create an iperf VM and Connect to VPP an interface\n\
 9 or q) Back to main menu.'
 
-    print "{}".format(basic_menu_text)
+    print ("{}".format(basic_menu_text))
 
     input_valid = False
     answer = ''
     while not input_valid:
-        answer = raw_input("\nCommand: ")
+        answer = input("\nCommand: ")
         if len(answer) > 1:
-            print "Please enter only 1 character."
+            print ("Please enter only 1 character.")
             continue
         if re.findall(r'[Qq1-29]', answer):
             input_valid = True
             answer = answer[0].lower()
         else:
-            print "Please enter a character between 1 and 2 or 9."
+            print ("Please enter a character between 1 and 2 or 9.")
 
         if answer == '9':
             answer = 'q'
@@ -531,7 +539,7 @@
     vutil = VPPUtil()
     pkgs = vutil.get_installed_vpp_pkgs()
     if len(pkgs) == 0:
-        print "\nVPP is not installed, install VPP with option 4."
+        print ("\nVPP is not installed, install VPP with option 4.")
         return
 
     answer = ''
@@ -563,20 +571,20 @@
     # 5) Dry Run from {}/vpp/vpp-config/auto-config.yaml (will not ask questions).\n\
     # 6) Install QEMU patch (Needed when running openstack).\n\
 
-    print "{}".format(main_menu_text)
+    print ("{}".format(main_menu_text))
 
     input_valid = False
     answer = ''
     while not input_valid:
-        answer = raw_input("\nCommand: ")
+        answer = input("\nCommand: ")
         if len(answer) > 1:
-            print "Please enter only 1 character."
+            print ("Please enter only 1 character.")
             continue
         if re.findall(r'[Qq1-4]', answer):
             input_valid = True
             answer = answer[0].lower()
         else:
-            print "Please enter a character between 1 and 4 or q."
+            print ("Please enter a character between 1 and 4 or q.")
 
     return answer
 
@@ -632,15 +640,19 @@
                            format(filename))
 
     if ask_questions:
-        print "\nWelcome to the VPP system configuration utility"
+        print ("\nWelcome to the VPP system configuration utility")
 
-        print "\nThese are the files we will modify:"
-        print "    /etc/vpp/startup.conf"
-        print "    /etc/sysctl.d/80-vpp.conf"
-        print "    /etc/default/grub"
+        print ("\nThese are the files we will modify:")
+        print ("    /etc/vpp/startup.conf")
+        print ("    /etc/sysctl.d/80-vpp.conf")
+        print ("    /etc/default/grub")
 
-        print "\nBefore we change them, we'll create working copies in {}".format(rootdir + VPP_DRYRUNDIR)
-        print "Please inspect them carefully before applying the actual configuration (option 3)!"
+        print (
+            "\nBefore we change them, we'll create working copies in "
+            "{}".format(rootdir + VPP_DRYRUNDIR))
+        print (
+            "Please inspect them carefully before applying the actual "
+            "configuration (option 3)!")
 
     nodes = acfg.get_nodes()
     for i in nodes.items():
@@ -696,31 +708,43 @@
     if not os.geteuid() == 0:
         sys.exit('\nPlease run the VPP Configuration Utility as root.')
 
-    if len(sys.argv) > 1 and ((sys.argv[1] == '-d') or (sys.argv[1] == '--debug')):
+    if len(sys.argv) > 1 and ((sys.argv[1] == '-d') or (
+            sys.argv[1] == '--debug')):
         logging.basicConfig(level=logging.DEBUG)
     else:
         logging.basicConfig(level=logging.ERROR)
 
-    # If no arguments were entered, ask the user questions to get the main parameters
+    # If no arguments were entered, ask the user questions to
+    # get the main parameters
     if len(sys.argv) == 1:
         autoconfig_main()
         return
-    elif len(sys.argv) == 2 and (sys.argv[1] == '-d' or sys.argv[1] == '--debug'):
+    elif len(sys.argv) == 2 and ((sys.argv[1] == '-d') or (
+            sys.argv[1] == '--debug')):
         autoconfig_main()
         return
 
-    # There were arguments specified, so execute the utility using command line arguments
-    description = 'The VPP configuration utility allows the user to configure VPP in a simple and safe manner. \
-The utility takes input from the user or the speficfied .yaml file. The user should then examine these files \
-to be sure they are correct and then actually apply the configuration. When run without arguments the utility run \
-in an interactive mode'
+    # There were arguments specified, so execute the utility using
+    # command line arguments
+    description = 'The VPP configuration utility allows the user to '
+    'configure VPP in a simple and safe manner. The utility takes input '
+    'from the user or the specified .yaml file. The user should then '
+    'examine these files to be sure they are correct and then actually '
+    'apply the configuration. When run without arguments the utility run '
+    'in an interactive mode'
 
-    main_parser = argparse.ArgumentParser(prog='arg-test', description=description,
-                                          epilog='See "%(prog)s help COMMAND" for help on a specific command.')
-    main_parser.add_argument('--apply', '-a', action='store_true', help='Apply the cofiguration.')
-    main_parser.add_argument('--dry-run', '-dr', action='store_true', help='Create the dryrun configuration files.')
-    main_parser.add_argument('--show', '-s', action='store_true', help='Shows basic system information')
-    main_parser.add_argument('--debug', '-d', action='count', help='Print debug output (multiple levels)')
+    main_parser = argparse.ArgumentParser(
+        prog='arg-test',
+        description=description,
+        epilog='See "%(prog)s help COMMAND" for help on a specific command.')
+    main_parser.add_argument('--apply', '-a', action='store_true',
+                             help='Apply the cofiguration.')
+    main_parser.add_argument('--dry-run', '-dr', action='store_true',
+                             help='Create the dryrun configuration files.')
+    main_parser.add_argument('--show', '-s', action='store_true',
+                             help='Shows basic system information')
+    main_parser.add_argument('--debug', '-d', action='count',
+                             help='Print debug output (multiple levels)')
 
     args = main_parser.parse_args()
 
diff --git a/extras/vpp_config/vpplib/AutoConfig.py b/extras/vpp_config/vpplib/AutoConfig.py
index 2664a6a..da00b28 100644
--- a/extras/vpp_config/vpplib/AutoConfig.py
+++ b/extras/vpp_config/vpplib/AutoConfig.py
@@ -12,12 +12,14 @@
 # limitations under the License.
 
 """Library that supports Auto Configuration."""
+from __future__ import absolute_import, division, print_function
 
 import logging
 import os
 import re
+from ipaddress import ip_address
+
 import yaml
-from netaddr import IPAddress
 
 from vpplib.VPPUtil import VPPUtil
 from vpplib.VppPCIUtil import VppPCIUtil
@@ -26,6 +28,12 @@
 from vpplib.VppGrubUtil import VppGrubUtil
 from vpplib.QemuUtils import QemuUtils
 
+#  Python2/3 compatible
+try:
+    input = raw_input  # noqa
+except NameError:
+    pass
+
 __all__ = ["AutoConfig"]
 
 # Constants
@@ -104,18 +112,18 @@
         """
 
         while True:
-            answer = raw_input("Please enter the IPv4 Address [n.n.n.n/n]: ")
+            answer = input("Please enter the IPv4 Address [n.n.n.n/n]: ")
             try:
                 ipinput = answer.split('/')
-                ipaddr = IPAddress(ipinput[0])
+                ipaddr = ip_address(ipinput[0])
                 if len(ipinput) > 1:
                     plen = answer.split('/')[1]
                 else:
-                    answer = raw_input("Please enter the netmask [n.n.n.n]: ")
-                    plen = IPAddress(answer).netmask_bits()
+                    answer = input("Please enter the netmask [n.n.n.n]: ")
+                    plen = ip_address(answer).netmask_bits()
                 return '{}/{}'.format(ipaddr, plen)
             except None:
-                print "Please enter a valid IPv4 address."
+                print("Please enter a valid IPv4 address.")
 
     @staticmethod
     def _ask_user_range(question, first, last, default):
@@ -136,7 +144,7 @@
         """
 
         while True:
-            answer = raw_input(question)
+            answer = input(question)
             if answer == '':
                 answer = default
                 break
@@ -144,11 +152,11 @@
                 if int(answer) in range(first, last + 1):
                     break
                 else:
-                    print "Please a value between {} and {} or Return.". \
-                        format(first, last)
+                    print("Please a value between {} and {} or Return.".
+                          format(first, last))
             else:
-                print "Please a number between {} and {} or Return.". \
-                    format(first, last)
+                print("Please a number between {} and {} or Return.".
+                      format(first, last))
 
         return int(answer)
 
@@ -169,14 +177,14 @@
         default = default.lower()
         answer = ''
         while not input_valid:
-            answer = raw_input(question)
+            answer = input(question)
             if answer == '':
                 answer = default
             if re.findall(r'[YyNn]', answer):
                 input_valid = True
                 answer = answer[0].lower()
             else:
-                print "Please answer Y, N or Return."
+                print("Please answer Y, N or Return.")
 
         return answer
 
@@ -194,7 +202,9 @@
                 if 'metadata' in topo:
                     self._metadata = topo['metadata']
             except yaml.YAMLError as exc:
-                raise RuntimeError("Couldn't read the Auto config file {}.".format(self._autoconfig_filename, exc))
+                raise RuntimeError(
+                    "Couldn't read the Auto config file {}.".format(
+                        self._autoconfig_filename, exc))
 
         systemfile = self._rootdir + self._metadata['system_config_file']
         if self._clean is False and os.path.isfile(systemfile):
@@ -204,7 +214,9 @@
                     if 'nodes' in systopo:
                         self._nodes = systopo['nodes']
                 except yaml.YAMLError as sysexc:
-                    raise RuntimeError("Couldn't read the System config file {}.".format(systemfile, sysexc))
+                    raise RuntimeError(
+                        "Couldn't read the System config file {}.".format(
+                            systemfile, sysexc))
         else:
             # Get the nodes from Auto Config
             if 'nodes' in topo:
@@ -246,7 +258,7 @@
                 if 'nodes' in ydata:
                     nodes = ydata['nodes']
             except yaml.YAMLError as exc:
-                print exc
+                print(exc)
                 return
 
         for i in nodes.items():
@@ -413,7 +425,8 @@
         return devices
 
     @staticmethod
-    def _calc_vpp_workers(node, vpp_workers, numa_node, other_cpus_end, total_vpp_workers,
+    def _calc_vpp_workers(node, vpp_workers, numa_node, other_cpus_end,
+                          total_vpp_workers,
                           reserve_vpp_main_core):
         """
         Calculate the VPP worker information
@@ -542,7 +555,8 @@
 
             # Get the number of cpus to skip, we never use the first cpu
             other_cpus_start = 1
-            other_cpus_end = other_cpus_start + node['cpu']['total_other_cpus'] - 1
+            other_cpus_end = other_cpus_start + \
+                node['cpu']['total_other_cpus'] - 1
             other_workers = None
             if other_cpus_end is not 0:
                 other_workers = (other_cpus_start, other_cpus_end)
@@ -569,14 +583,16 @@
                     value = item[1]
 
                     # Get the number of descriptors and queues
-                    mbufs = self._calc_desc_and_queues(len(ports_per_numa),
-                                                       len(value['interfaces']), total_rx_queues, value)
+                    mbufs = self._calc_desc_and_queues(
+                        len(ports_per_numa),
+                        len(value['interfaces']), total_rx_queues, value)
                     total_mbufs += mbufs
 
                     # Get the VPP workers
-                    reserve_vpp_main_core = self._calc_vpp_workers(node, vpp_workers, numa_node,
-                                                                   other_cpus_end, total_workers_node,
-                                                                   reserve_vpp_main_core)
+                    reserve_vpp_main_core = self._calc_vpp_workers(
+                        node, vpp_workers, numa_node,
+                        other_cpus_end, total_workers_node,
+                        reserve_vpp_main_core)
 
                 total_mbufs *= 2.5
                 total_mbufs = int(total_mbufs)
@@ -607,36 +623,43 @@
 
         # Generate the api-segment gid vpp sheit in any case
         if (aos + pos) == 0:
-            tcp = "api-segment {\n"
-            tcp = tcp + "  gid vpp\n"
-            tcp = tcp + "}\n"
+            tcp = '\n'.join([
+                "api-segment {",
+                "  gid vpp",
+                "}"
+            ])
             return tcp.rstrip('\n')
 
-        tcp = "# TCP stack-related configuration parameters\n"
-        tcp = tcp + "# expecting {:d} client sessions, {:d} server sessions\n\n".format(aos, pos)
-        tcp = tcp + "heapsize 4g\n\n"
-        tcp = tcp + "api-segment {\n"
-        tcp = tcp + "  global-size 2000M\n"
-        tcp = tcp + "  api-size 1G\n"
-        tcp = tcp + "}\n\n"
+        tcp = '\n'.join([
+            "# TCP stack-related configuration parameters",
+            "# expecting {:d} client sessions, {:d} server sessions\n".format(
+                aos, pos),
+            "heapsize 4g\n",
+            "api-segment {",
+            "  global-size 2000M",
+            "  api-size 1G",
+            "}\n",
 
-        tcp = tcp + "session {\n"
-        tcp = tcp + "  event-queue-length " + "{:d}".format(aos + pos) + "\n"
-        tcp = tcp + "  preallocated-sessions " + "{:d}".format(aos + pos) + "\n"
-        tcp = tcp + "  v4-session-table-buckets " + "{:d}".format((aos + pos) / 4) + "\n"
-        tcp = tcp + "  v4-session-table-memory 3g\n"
+            "session {",
+            "  event-queue-length {:d}".format(aos + pos),
+            "  preallocated-sessions {:d}".format(aos + pos),
+            "  v4-session-table-buckets {:d}".format((aos + pos) // 4),
+            "  v4-session-table-memory 3g\n"
+        ])
         if aos > 0:
-            tcp = tcp + "  v4-halfopen-table-buckets " + \
-                  "{:d}".format((aos + pos) / 4) + "\n"
+            tcp = tcp + "  v4-halfopen-table-buckets {:d}".format(
+                (aos + pos) // 4) + "\n"
             tcp = tcp + "  v4-halfopen-table-memory 3g\n"
-            tcp = tcp + "  local-endpoints-table-buckets " + "{:d}".format((aos + pos) / 4) + "\n"
+            tcp = tcp + "  local-endpoints-table-buckets {:d}".format(
+                (aos + pos) // 4) + "\n"
             tcp = tcp + "  local-endpoints-table-memory 3g\n"
         tcp = tcp + "}\n\n"
 
         tcp = tcp + "tcp {\n"
-        tcp = tcp + "  preallocated-connections " + "{:d}".format(aos + pos) + "\n"
+        tcp = tcp + "  preallocated-connections {:d}".format(aos + pos) + "\n"
         if aos > 0:
-            tcp = tcp + "  preallocated-half-open-connections " + "{:d}".format(aos) + "\n"
+            tcp = tcp + "  preallocated-half-open-connections {:d}".format(
+                aos) + "\n"
         tcp = tcp + "}\n\n"
 
         return tcp.rstrip('\n')
@@ -923,22 +946,27 @@
         :type numa_nodes: list
         """
 
-        print "\nYour system has {} core(s) and {} Numa Nodes.". \
-            format(total_cpus, len(numa_nodes))
-        print "To begin, we suggest not reserving any cores for VPP or other processes."
-        print "Then to improve performance start reserving cores and adding queues as needed. "
+        print("\nYour system has {} core(s) and {} Numa Nodes.".
+              format(total_cpus, len(numa_nodes)))
+        print("To begin, we suggest not reserving any cores for "
+              "VPP or other processes.")
+        print("Then to improve performance start reserving cores and "
+              "adding queues as needed.")
 
         max_vpp_cpus = 4
         total_vpp_cpus = 0
         if max_vpp_cpus > 0:
-            question = "\nHow many core(s) shall we reserve for VPP [0-{}][0]? ".format(max_vpp_cpus)
+            question = "\nHow many core(s) shall we reserve for " \
+                       "VPP [0-{}][0]? ".format(max_vpp_cpus)
             total_vpp_cpus = self._ask_user_range(question, 0, max_vpp_cpus, 0)
             node['cpu']['total_vpp_cpus'] = total_vpp_cpus
 
         max_other_cores = (total_cpus - total_vpp_cpus) / 2
-        question = 'How many core(s) do you want to reserve for processes other than VPP? [0-{}][0]? '. \
+        question = 'How many core(s) do you want to reserve for ' \
+                   'processes other than VPP? [0-{}][0]? '. \
             format(str(max_other_cores))
-        total_other_cpus = self._ask_user_range(question, 0, max_other_cores, 0)
+        total_other_cpus = self._ask_user_range(
+            question, 0, max_other_cores, 0)
         node['cpu']['total_other_cpus'] = total_other_cpus
 
         max_main_cpus = max_vpp_cpus + 1 - total_vpp_cpus
@@ -952,8 +980,8 @@
             node['cpu']['reserve_vpp_main_core'] = reserve_vpp_main_core
             node['cpu']['vpp_main_core'] = 0
 
-        question = "How many RX queues per port shall we use for VPP [1-4][1]? ". \
-            format(max_vpp_cpus)
+        question = "How many RX queues per port shall we use for " \
+                   "VPP [1-4][1]? ".format(max_vpp_cpus)
         total_rx_queues = self._ask_user_range(question, 1, 4, 1)
         node['cpu']['total_rx_queues'] = total_rx_queues
 
@@ -1030,8 +1058,8 @@
 
         odevices_len = len(other_devices)
         if odevices_len > 0:
-            print "\nThese device(s) are currently NOT being used",
-            print "by VPP or the OS.\n"
+            print("\nThese device(s) are currently NOT being used "
+                  "by VPP or the OS.\n")
             VppPCIUtil.show_vpp_devices(other_devices, show_interfaces=False)
             question = "\nWould you like to give any of these devices"
             question += " back to the OS [Y/n]? "
@@ -1046,11 +1074,15 @@
                     question += " the OS [y/N]? "
                     answer = self._ask_user_yn(question, 'n')
                     if answer == 'y':
-                        if 'unused' in device and len(device['unused']) != 0 and device['unused'][0] != '':
+                        if 'unused' in device and len(
+                                device['unused']) != 0 and \
+                                device['unused'][0] != '':
                             driver = device['unused'][0]
-                            ret = VppPCIUtil.bind_vpp_device(node, driver, dvid)
+                            ret = VppPCIUtil.bind_vpp_device(
+                                node, driver, dvid)
                             if ret:
-                                logging.debug('Could not bind device {}'.format(dvid))
+                                logging.debug(
+                                    'Could not bind device {}'.format(dvid))
                             else:
                                 vppd[dvid] = device
                 for dit in vppd.items():
@@ -1061,8 +1093,8 @@
 
         odevices_len = len(other_devices)
         if odevices_len > 0:
-            print "\nThese device(s) are still NOT being used ",
-            print "by VPP or the OS.\n"
+            print("\nThese device(s) are still NOT being used "
+                  "by VPP or the OS.\n")
             VppPCIUtil.show_vpp_devices(other_devices, show_interfaces=False)
             question = "\nWould you like use any of these for VPP [y/N]? "
             answer = self._ask_user_yn(question, 'N')
@@ -1079,12 +1111,16 @@
                 for dit in vppd.items():
                     dvid = dit[0]
                     device = dit[1]
-                    if 'unused' in device and len(device['unused']) != 0 and device['unused'][0] != '':
+                    if 'unused' in device and len(device['unused']) != 0 and \
+                            device['unused'][0] != '':
                         driver = device['unused'][0]
-                        logging.debug('Binding device {} to driver {}'.format(dvid, driver))
+                        logging.debug(
+                            'Binding device {} to driver {}'.format(dvid,
+                                                                    driver))
                         ret = VppPCIUtil.bind_vpp_device(node, driver, dvid)
                         if ret:
-                            logging.debug('Could not bind device {}'.format(dvid))
+                            logging.debug(
+                                'Could not bind device {}'.format(dvid))
                         else:
                             dpdk_devices[dvid] = device
                             del other_devices[dvid]
@@ -1141,19 +1177,17 @@
 
             klen = len(kernel_devices)
             if klen > 0:
-                print "\nThese devices have kernel interfaces, but",
-                print "appear to be safe to use with VPP.\n"
+                print("\nThese devices are safe to be used with VPP.\n")
                 VppPCIUtil.show_vpp_devices(kernel_devices)
-                question = "\nWould you like to use any of these "
-                question += "device(s) for VPP [y/N]? "
+                question = "\nWould you like to use any of these " \
+                           "device(s) for VPP [y/N]? "
                 answer = self._ask_user_yn(question, 'n')
                 if answer == 'y':
                     vppd = {}
                     for dit in kernel_devices.items():
                         dvid = dit[0]
                         device = dit[1]
-                        question = "Would you like to use device {} ". \
-                            format(dvid)
+                        question = "Would you like to use device {} ".format(dvid)
                         question += "for VPP [y/N]? "
                         answer = self._ask_user_yn(question, 'n')
                         if answer == 'y':
@@ -1161,25 +1195,30 @@
                     for dit in vppd.items():
                         dvid = dit[0]
                         device = dit[1]
-                        if 'unused' in device and len(device['unused']) != 0 and device['unused'][0] != '':
+                        if 'unused' in device and len(
+                                device['unused']) != 0 and device['unused'][
+                                0] != '':
                             driver = device['unused'][0]
-                            logging.debug('Binding device {} to driver {}'.format(dvid, driver))
-                            ret = VppPCIUtil.bind_vpp_device(node, driver, dvid)
-                            if ret:
-                                logging.debug('Could not bind device {}'.format(dvid))
-                            else:
-                                dpdk_devices[dvid] = device
-                                del kernel_devices[dvid]
+                            question = "Would you like to bind the driver {} for {} [y/N]? ".format(driver, dvid)
+                            answer = self._ask_user_yn(question, 'n')
+                            if answer == 'y':
+                                logging.debug('Binding device {} to driver {}'.format(dvid, driver))
+                                ret = VppPCIUtil.bind_vpp_device(node, driver, dvid)
+                                if ret:
+                                    logging.debug('Could not bind device {}'.format(dvid))
+                        dpdk_devices[dvid] = device
+                        del kernel_devices[dvid]
 
             dlen = len(dpdk_devices)
             if dlen > 0:
-                print "\nThese device(s) will be used by VPP.\n"
-                VppPCIUtil.show_vpp_devices(dpdk_devices, show_interfaces=False)
+                print("\nThese device(s) are already using DPDK.\n")
+                VppPCIUtil.show_vpp_devices(dpdk_devices,
+                                            show_interfaces=False)
                 question = "\nWould you like to remove any of "
                 question += "these device(s) [y/N]? "
                 answer = self._ask_user_yn(question, 'n')
                 if answer == 'y':
-                    vppd = {}
+                    vppdl = {}
                     for dit in dpdk_devices.items():
                         dvid = dit[0]
                         device = dit[1]
@@ -1187,16 +1226,22 @@
                             format(dvid)
                         answer = self._ask_user_yn(question, 'n')
                         if answer == 'y':
-                            vppd[dvid] = device
-                    for dit in vppd.items():
+                            vppdl[dvid] = device
+                    for dit in vppdl.items():
                         dvid = dit[0]
                         device = dit[1]
-                        if 'unused' in device and len(device['unused']) != 0 and device['unused'][0] != '':
+                        if 'unused' in device and len(
+                                device['unused']) != 0 and device['unused'][
+                                0] != '':
                             driver = device['unused'][0]
-                            logging.debug('Binding device {} to driver {}'.format(dvid, driver))
-                            ret = VppPCIUtil.bind_vpp_device(node, driver, dvid)
+                            logging.debug(
+                                'Binding device {} to driver {}'.format(
+                                    dvid, driver))
+                            ret = VppPCIUtil.bind_vpp_device(node, driver,
+                                                             dvid)
                             if ret:
-                                logging.debug('Could not bind device {}'.format(dvid))
+                                logging.debug(
+                                    'Could not bind device {}'.format(dvid))
                             else:
                                 kernel_devices[dvid] = device
                                 del dpdk_devices[dvid]
@@ -1208,10 +1253,6 @@
                 VppPCIUtil.vpp_create_interface(interfaces, dvid, device)
             node['interfaces'] = interfaces
 
-            print "\nThese device(s) will be used by VPP, please",
-            print "rerun this option if this is incorrect.\n"
-            VppPCIUtil.show_vpp_devices(dpdk_devices, show_interfaces=False)
-
         self._update_auto_config()
         self.updateconfig()
 
@@ -1231,18 +1272,19 @@
             hugesize = int(size.split(' ')[0])
             # The max number of huge pages should be no more than
             # 70% of total free memory
-            maxpages = (int(memfree) * MAX_PERCENT_FOR_HUGE_PAGES / 100) / hugesize
-            print "\nThere currently {} {} huge pages free.". \
-                format(free, size)
-            question = "Do you want to reconfigure the number of "
-            question += "huge pages [y/N]? "
+            maxpages = (int(memfree) * MAX_PERCENT_FOR_HUGE_PAGES // 100) // \
+                hugesize
+            print("\nThere currently {} {} huge pages free.".format(
+                free, size))
+            question = "Do you want to reconfigure the number of " \
+                       "huge pages [y/N]? "
             answer = self._ask_user_yn(question, 'n')
             if answer == 'n':
                 node['hugepages']['total'] = total
                 continue
 
-            print "\nThere currently a total of {} huge pages.". \
-                format(total)
+            print("\nThere currently a total of {} huge pages.".
+                  format(total))
             question = "How many huge pages do you want [{} - {}][{}]? ". \
                 format(MIN_TOTAL_HUGE_PAGES, maxpages, MIN_TOTAL_HUGE_PAGES)
             answer = self._ask_user_range(question, 1024, maxpages, 1024)
@@ -1271,16 +1313,16 @@
         for i in self._nodes.items():
             node = i[1]
 
-            question = "\nHow many active-open / tcp client sessions are expected "
-            question = question + "[0-10000000][0]? "
+            question = "\nHow many active-open / tcp client sessions are " \
+                       "expected [0-10000000][0]? "
             answer = self._ask_user_range(question, 0, 10000000, 0)
             # Less than 10K is equivalent to 0
             if int(answer) < 10000:
                 answer = 0
             node['tcp']['active_open_sessions'] = answer
 
-            question = "How many passive-open / tcp server sessions are expected "
-            question = question + "[0-10000000][0]? "
+            question = "How many passive-open / tcp server sessions are " \
+                       "expected [0-10000000][0]? "
             answer = self._ask_user_range(question, 0, 10000000, 0)
             # Less than 10K is equivalent to 0
             if int(answer) < 10000:
@@ -1302,7 +1344,7 @@
         :type node: dict
         """
 
-        print '\nWe are patching the node "{}":\n'.format(node['host'])
+        print('\nWe are patching the node "{}":\n'.format(node['host']))
         QemuUtils.build_qemu(node, force_install=True, apply_patch=True)
 
     @staticmethod
@@ -1316,44 +1358,44 @@
 
         item = 'Model name'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'CPU(s)'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'Thread(s) per core'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'Core(s) per socket'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'Socket(s)'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'NUMA node(s)'
         numa_nodes = 0
         if item in cpu:
             numa_nodes = int(cpu[item])
-        for i in xrange(0, numa_nodes):
+        for i in range(0, numa_nodes):
             item = "NUMA node{} CPU(s)".format(i)
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'CPU max MHz'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
         item = 'CPU min MHz'
         if item in cpu:
-            print "{:>20}:    {}".format(item, cpu[item])
+            print("{:>20}:    {}".format(item, cpu[item]))
 
         if node['cpu']['smt_enabled']:
             smt = 'Enabled'
         else:
             smt = 'Disabled'
-        print "{:>20}:    {}".format('SMT', smt)
+        print("{:>20}:    {}".format('SMT', smt))
 
         # VPP Threads
-        print "\nVPP Threads: (Name: Cpu Number)"
+        print("\nVPP Threads: (Name: Cpu Number)")
         vpp_processes = cpu['vpp_processes']
         for i in vpp_processes.items():
-            print "  {:10}: {:4}".format(i[0], i[1])
+            print("  {:10}: {:4}".format(i[0], i[1]))
 
     @staticmethod
     def device_info(node):
@@ -1365,53 +1407,53 @@
         if 'cpu' in node and 'total_mbufs' in node['cpu']:
             total_mbufs = node['cpu']['total_mbufs']
             if total_mbufs is not 0:
-                print "Total Number of Buffers: {}".format(total_mbufs)
+                print("Total Number of Buffers: {}".format(total_mbufs))
 
         vpp = VppPCIUtil(node)
         vpp.get_all_devices()
         linkup_devs = vpp.get_link_up_devices()
         if len(linkup_devs):
-            print ("\nDevices with link up (can not be used with VPP):")
+            print("\nDevices with link up (can not be used with VPP):")
             vpp.show_vpp_devices(linkup_devs, show_header=False)
             # for dev in linkup_devs:
             #    print ("    " + dev)
         kernel_devs = vpp.get_kernel_devices()
         if len(kernel_devs):
-            print ("\nDevices bound to kernel drivers:")
+            print("\nDevices bound to kernel drivers:")
             vpp.show_vpp_devices(kernel_devs, show_header=False)
         else:
-            print ("\nNo devices bound to kernel drivers")
+            print("\nNo devices bound to kernel drivers")
 
         dpdk_devs = vpp.get_dpdk_devices()
         if len(dpdk_devs):
-            print ("\nDevices bound to DPDK drivers:")
+            print("\nDevices bound to DPDK drivers:")
             vpp.show_vpp_devices(dpdk_devs, show_interfaces=True,
                                  show_header=False)
         else:
-            print ("\nNo devices bound to DPDK drivers")
+            print("\nNo devices bound to DPDK drivers")
 
         other_devs = vpp.get_other_devices()
         if len(other_devs):
-            print ("\nDevices not bound to Kernel or DPDK drivers:")
+            print("\nDevices not bound to Kernel or DPDK drivers:")
             vpp.show_vpp_devices(other_devs, show_interfaces=True,
                                  show_header=False)
         else:
-            print ("\nNo devices not bound to Kernel or DPDK drivers")
+            print("\nNo devices not bound to Kernel or DPDK drivers")
 
         vpputl = VPPUtil()
         interfaces = vpputl.get_hardware(node)
         if interfaces == {}:
             return
 
-        print ("\nDevices in use by VPP:")
+        print("\nDevices in use by VPP:")
 
         if len(interfaces.items()) < 2:
-            print ("None")
+            print("None")
             return
 
-        print "{:30} {:4} {:4} {:7} {:4} {:7}". \
-            format('Name', 'Numa', 'RXQs',
-                   'RXDescs', 'TXQs', 'TXDescs')
+        print("{:30} {:4} {:4} {:7} {:4} {:7}".
+              format('Name', 'Numa', 'RXQs',
+                     'RXDescs', 'TXQs', 'TXDescs'))
         for intf in sorted(interfaces.items()):
             name = intf[0]
             value = intf[1]
@@ -1429,8 +1471,8 @@
             if 'tx descs' in value:
                 tx_ds = int(value['tx descs'])
 
-            print ("{:30} {:>4} {:>4} {:>7} {:>4} {:>7}".
-                   format(name, numa, rx_qs, rx_ds, tx_qs, tx_ds))
+            print("{:30} {:>4} {:>4} {:>7} {:>4} {:>7}".
+                  format(name, numa, rx_qs, rx_ds, tx_qs, tx_ds))
 
     @staticmethod
     def hugepage_info(node):
@@ -1458,8 +1500,8 @@
         if 'layout' in node['cpu']:
             total_cpus = len(node['cpu']['layout'])
             if total_cpus < 2:
-                print "\nThere is only {} CPU(s) available on this system.".format(total_cpus)
-                print "This is not enough to run VPP."
+                print("\nThere is only {} CPU(s) available on this system. "
+                      "This is not enough to run VPP.".format(total_cpus))
                 min_sys_res = False
 
         # System Memory
@@ -1474,8 +1516,12 @@
             percentmemhugepages = (memhugepages / memfree) * 100
             if free is '0' and \
                     percentmemhugepages > MAX_PERCENT_FOR_HUGE_PAGES:
-                print "\nThe System has only {} of free memory.".format(int(memfree))
-                print "You will not be able to allocate enough Huge Pages for VPP."
+                print(
+                    "\nThe System has only {} of free memory. You will not "
+                    "be able to allocate enough Huge Pages for VPP.".format(
+                        int(
+                            memfree))
+                )
                 min_sys_res = False
 
         return min_sys_res
@@ -1487,45 +1533,43 @@
         """
 
         for i in self._nodes.items():
-            print "\n=============================="
+            print("\n==============================")
             name = i[0]
             node = i[1]
 
-            print "NODE: {}\n".format(name)
+            print("NODE: {}\n".format(name))
 
             # CPU
-            print "CPU:"
+            print("CPU:")
             self.cpu_info(node)
 
             # Grub
-            print "\nGrub Command Line:"
+            print("\nGrub Command Line:")
             if 'grub' in node:
-                print \
-                    "  Current: {}".format(
-                        node['grub']['current_cmdline'])
-                print \
-                    "  Configured: {}".format(
-                        node['grub']['default_cmdline'])
+                print("  Current: {}".format(
+                    node['grub']['current_cmdline']))
+                print("  Configured: {}".format(
+                    node['grub']['default_cmdline']))
 
             # Huge Pages
-            print "\nHuge Pages:"
+            print("\nHuge Pages:")
             self.hugepage_info(node)
 
             # Devices
-            print "\nDevices:"
+            print("\nDevices:")
             self.device_info(node)
 
             # Status
-            print "\nVPP Service Status:"
+            print("\nVPP Service Status:")
             state, errors = VPPUtil.status(node)
-            print "  {}".format(state)
+            print("  {}".format(state))
             for e in errors:
-                print "  {}".format(e)
+                print("  {}".format(e))
 
             # Minimum system resources
             self.min_system_resources(node)
 
-            print "\n=============================="
+            print("\n==============================")
 
     def _ipv4_interface_setup_questions(self, node):
         """
@@ -1549,7 +1593,8 @@
             if name == 'local0':
                 continue
 
-            question = "Would you like add address to interface {} [Y/n]? ".format(name)
+            question = "Would you like add address to " \
+                       "interface {} [Y/n]? ".format(name)
             answer = self._ask_user_yn(question, 'y')
             if answer == 'y':
                 address = {}
@@ -1573,7 +1618,7 @@
             # Show the current interfaces with IP addresses
             current_ints = VPPUtil.get_int_ip(node)
             if current_ints is not {}:
-                print ("\nThese are the current interfaces with IP addresses:")
+                print("\nThese are the current interfaces with IP addresses:")
                 for items in sorted(current_ints.items()):
                     name = items[0]
                     value = items[1]
@@ -1581,13 +1626,16 @@
                         address = 'Not Set'
                     else:
                         address = value['address']
-                    print ("{:30} {:20} {:10}".format(name, address, value['state']))
-                question = "\nWould you like to keep this configuration [Y/n]? "
+                    print("{:30} {:20} {:10}".format(name, address,
+                                                     value['state']))
+                question = "\nWould you like to keep this configuration " \
+                           "[Y/n]? "
                 answer = self._ask_user_yn(question, 'y')
                 if answer == 'y':
                     continue
             else:
-                print ("\nThere are currently no interfaces with IP addresses.")
+                print("\nThere are currently no interfaces with IP "
+                      "addresses.")
 
             # Create a script that add the ip addresses to the interfaces
             # and brings the interfaces up
@@ -1653,24 +1701,32 @@
             if name == 'local0':
                 continue
 
-            question = "Would you like connect this interface {} to the VM [Y/n]? ".format(name)
+            question = "Would you like connect this interface {} to " \
+                       "the VM [Y/n]? ".format(name)
             answer = self._ask_user_yn(question, 'y')
             if answer == 'y':
-                sockfilename = '/var/run/vpp/{}.sock'.format(name.replace('/', '_'))
+                sockfilename = '/var/run/vpp/{}.sock'.format(
+                    name.replace('/', '_'))
                 if os.path.exists(sockfilename):
                     os.remove(sockfilename)
-                cmd = 'vppctl create vhost-user socket {} server'.format(sockfilename)
+                cmd = 'vppctl create vhost-user socket {} server'.format(
+                    sockfilename)
                 (ret, stdout, stderr) = vpputl.exec_command(cmd)
                 if ret != 0:
-                    raise RuntimeError("Couldn't execute the command {}, {}.".format(cmd, stderr))
+                    raise RuntimeError(
+                        "Couldn't execute the command {}, {}.".format(cmd,
+                                                                      stderr))
                 vintname = stdout.rstrip('\r\n')
 
                 cmd = 'chmod 777 {}'.format(sockfilename)
                 (ret, stdout, stderr) = vpputl.exec_command(cmd)
                 if ret != 0:
-                    raise RuntimeError("Couldn't execute the command {}, {}.".format(cmd, stderr))
+                    raise RuntimeError(
+                        "Couldn't execute the command {}, {}.".format(cmd,
+                                                                      stderr))
 
-                interface = {'name': name, 'virtualinterface': '{}'.format(vintname),
+                interface = {'name': name,
+                             'virtualinterface': '{}'.format(vintname),
                              'bridge': '{}'.format(inum)}
                 inum += 1
                 interfaces_with_virtual_interfaces.append(interface)
@@ -1679,8 +1735,8 @@
 
     def create_and_bridge_virtual_interfaces(self):
         """
-        After asking the user some questions, create a VM and connect the interfaces
-        to VPP interfaces
+        After asking the user some questions, create a VM and connect
+        the interfaces to VPP interfaces
 
         """
 
@@ -1688,39 +1744,49 @@
             node = i[1]
 
             # Show the current bridge and interface configuration
-            print "\nThis the current bridge configuration:"
+            print("\nThis the current bridge configuration:")
             VPPUtil.show_bridge(node)
             question = "\nWould you like to keep this configuration [Y/n]? "
             answer = self._ask_user_yn(question, 'y')
             if answer == 'y':
                 continue
 
-            # Create a script that builds a bridge configuration with physical interfaces
-            # and virtual interfaces
+            # Create a script that builds a bridge configuration with
+            # physical interfaces and virtual interfaces
             ints_with_vints = self._create_vints_questions(node)
             content = ''
             for intf in ints_with_vints:
-                vhoststr = 'comment { The following command creates the socket }\n'
-                vhoststr += 'comment { and returns a virtual interface }\n'
-                vhoststr += 'comment {{ create vhost-user socket /var/run/vpp/sock{}.sock server }}\n'. \
-                    format(intf['bridge'])
+                vhoststr = '\n'.join([
+                    'comment { The following command creates the socket }',
+                    'comment { and returns a virtual interface }',
+                    'comment {{ create vhost-user socket '
+                    '/var/run/vpp/sock{}.sock server }}\n'.format(
+                        intf['bridge'])
+                ])
 
-                setintdnstr = 'set interface state {} down\n'.format(intf['name'])
+                setintdnstr = 'set interface state {} down\n'.format(
+                    intf['name'])
 
-                setintbrstr = 'set interface l2 bridge {} {}\n'.format(intf['name'], intf['bridge'])
-                setvintbrstr = 'set interface l2 bridge {} {}\n'.format(intf['virtualinterface'], intf['bridge'])
+                setintbrstr = 'set interface l2 bridge {} {}\n'.format(
+                    intf['name'], intf['bridge'])
+                setvintbrstr = 'set interface l2 bridge {} {}\n'.format(
+                    intf['virtualinterface'], intf['bridge'])
 
                 # set interface state VirtualEthernet/0/0/0 up
-                setintvststr = 'set interface state {} up\n'.format(intf['virtualinterface'])
+                setintvststr = 'set interface state {} up\n'.format(
+                    intf['virtualinterface'])
 
                 # set interface state VirtualEthernet/0/0/0 down
-                setintupstr = 'set interface state {} up\n'.format(intf['name'])
+                setintupstr = 'set interface state {} up\n'.format(
+                    intf['name'])
 
-                content += vhoststr + setintdnstr + setintbrstr + setvintbrstr + setintvststr + setintupstr
+                content += vhoststr + setintdnstr + setintbrstr + \
+                    setvintbrstr + setintvststr + setintupstr
 
             # Write the content to the script
             rootdir = node['rootdir']
-            filename = rootdir + '/vpp/vpp-config/scripts/create_vms_and_connect_to_vpp'
+            filename = rootdir + \
+                '/vpp/vpp-config/scripts/create_vms_and_connect_to_vpp'
             with open(filename, 'w+') as sfile:
                 sfile.write(content)
 
@@ -1768,30 +1834,38 @@
         inum = 1
 
         while True:
-            print '\nPlease pick one interface to connect to the iperf VM.'
+            print('\nPlease pick one interface to connect to the iperf VM.')
             for intf in sorted(interfaces.items()):
                 name = intf[0]
                 if name == 'local0':
                     continue
 
-                question = "Would you like connect this interface {} to the VM [y/N]? ".format(name)
+                question = "Would you like connect this interface {} to " \
+                           "the VM [y/N]? ".format(name)
                 answer = self._ask_user_yn(question, 'n')
                 if answer == 'y':
-                    self._sockfilename = '/var/run/vpp/{}.sock'.format(name.replace('/', '_'))
+                    self._sockfilename = '/var/run/vpp/{}.sock'.format(
+                        name.replace('/', '_'))
                     if os.path.exists(self._sockfilename):
                         os.remove(self._sockfilename)
-                    cmd = 'vppctl create vhost-user socket {} server'.format(self._sockfilename)
+                    cmd = 'vppctl create vhost-user socket {} server'.format(
+                        self._sockfilename)
                     (ret, stdout, stderr) = vpputl.exec_command(cmd)
                     if ret != 0:
-                        raise RuntimeError("Couldn't execute the command {}, {}.".format(cmd, stderr))
+                        raise RuntimeError(
+                            "Couldn't execute the command {}, {}.".format(
+                                cmd, stderr))
                     vintname = stdout.rstrip('\r\n')
 
                     cmd = 'chmod 777 {}'.format(self._sockfilename)
                     (ret, stdout, stderr) = vpputl.exec_command(cmd)
                     if ret != 0:
-                        raise RuntimeError("Couldn't execute the command {}, {}.".format(cmd, stderr))
+                        raise RuntimeError(
+                            "Couldn't execute the command {}, {}.".format(
+                                cmd, stderr))
 
-                    interface = {'name': name, 'virtualinterface': '{}'.format(vintname),
+                    interface = {'name': name,
+                                 'virtualinterface': '{}'.format(vintname),
                                  'bridge': '{}'.format(inum)}
                     inum += 1
                     interfaces_with_virtual_interfaces.append(interface)
@@ -1799,8 +1873,8 @@
 
     def create_and_bridge_iperf_virtual_interface(self):
         """
-        After asking the user some questions, and create and bridge a virtual interface
-        to be used with iperf VM
+        After asking the user some questions, and create and bridge a
+        virtual interface to be used with iperf VM
 
         """
 
@@ -1808,37 +1882,47 @@
             node = i[1]
 
             # Show the current bridge and interface configuration
-            print "\nThis the current bridge configuration:"
+            print("\nThis the current bridge configuration:")
             ifaces = VPPUtil.show_bridge(node)
             question = "\nWould you like to keep this configuration [Y/n]? "
             answer = self._ask_user_yn(question, 'y')
             if answer == 'y':
-                self._sockfilename = '/var/run/vpp/{}.sock'.format(ifaces[0]['name'].replace('/', '_'))
+                self._sockfilename = '/var/run/vpp/{}.sock'.format(
+                    ifaces[0]['name'].replace('/', '_'))
                 if os.path.exists(self._sockfilename):
                     continue
 
-            # Create a script that builds a bridge configuration with physical interfaces
-            # and virtual interfaces
+            # Create a script that builds a bridge configuration with
+            # physical interfaces and virtual interfaces
             ints_with_vints = self._iperf_vm_questions(node)
             content = ''
             for intf in ints_with_vints:
-                vhoststr = 'comment { The following command creates the socket }\n'
-                vhoststr += 'comment { and returns a virtual interface }\n'
-                vhoststr += 'comment {{ create vhost-user socket /var/run/vpp/sock{}.sock server }}\n'. \
-                    format(intf['bridge'])
+                vhoststr = '\n'.join([
+                    'comment { The following command creates the socket }',
+                    'comment { and returns a virtual interface }',
+                    'comment {{ create vhost-user socket '
+                    '/var/run/vpp/sock{}.sock server }}\n'.format(
+                        intf['bridge'])
+                ])
 
-                setintdnstr = 'set interface state {} down\n'.format(intf['name'])
+                setintdnstr = 'set interface state {} down\n'.format(
+                    intf['name'])
 
-                setintbrstr = 'set interface l2 bridge {} {}\n'.format(intf['name'], intf['bridge'])
-                setvintbrstr = 'set interface l2 bridge {} {}\n'.format(intf['virtualinterface'], intf['bridge'])
+                setintbrstr = 'set interface l2 bridge {} {}\n'.format(
+                    intf['name'], intf['bridge'])
+                setvintbrstr = 'set interface l2 bridge {} {}\n'.format(
+                    intf['virtualinterface'], intf['bridge'])
 
                 # set interface state VirtualEthernet/0/0/0 up
-                setintvststr = 'set interface state {} up\n'.format(intf['virtualinterface'])
+                setintvststr = 'set interface state {} up\n'.format(
+                    intf['virtualinterface'])
 
                 # set interface state VirtualEthernet/0/0/0 down
-                setintupstr = 'set interface state {} up\n'.format(intf['name'])
+                setintupstr = 'set interface state {} up\n'.format(
+                    intf['name'])
 
-                content += vhoststr + setintdnstr + setintbrstr + setvintbrstr + setintvststr + setintupstr
+                content += vhoststr + setintdnstr + setintbrstr + \
+                    setvintbrstr + setintvststr + setintupstr
 
             # Write the content to the script
             rootdir = node['rootdir']
@@ -1859,8 +1943,8 @@
     @staticmethod
     def destroy_iperf_vm(name):
         """
-        After asking the user some questions, create a VM and connect the interfaces
-        to VPP interfaces
+        After asking the user some questions, create a VM and connect
+        the interfaces to VPP interfaces
 
         :param name: The name of the VM to be be destroyed
         :type name: str
@@ -1870,37 +1954,46 @@
         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
         if ret != 0:
             logging.debug(stderr)
-            raise RuntimeError("Couldn't execute the command {} : {}".format(cmd, stderr))
+            raise RuntimeError(
+                "Couldn't execute the command {} : {}".format(cmd, stderr))
 
         if re.findall(name, stdout):
             cmd = 'virsh destroy {}'.format(name)
             (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
             if ret != 0:
                 logging.debug(stderr)
-                raise RuntimeError("Couldn't execute the command {} : {}".format(cmd, stderr))
+                raise RuntimeError(
+                    "Couldn't execute the command {} : {}".format(
+                        cmd, stderr))
 
     def create_iperf_vm(self, vmname):
         """
-        After asking the user some questions, create a VM and connect the interfaces
-        to VPP interfaces
+        After asking the user some questions, create a VM and connect
+        the interfaces to VPP interfaces
 
         """
 
         # Read the iperf VM template file
         distro = VPPUtil.get_linux_distro()
         if distro[0] == 'Ubuntu':
-            tfilename = '{}/vpp/vpp-config/configs/iperf-ubuntu.xml.template'.format(self._rootdir)
+            tfilename = \
+                '{}/vpp/vpp-config/configs/iperf-ubuntu.xml.template'.format(
+                    self._rootdir)
         else:
-            tfilename = '{}/vpp/vpp-config/configs/iperf-centos.xml.template'.format(self._rootdir)
+            tfilename = \
+                '{}/vpp/vpp-config/configs/iperf-centos.xml.template'.format(
+                    self._rootdir)
 
         with open(tfilename, 'r') as tfile:
             tcontents = tfile.read()
         tfile.close()
 
         # Add the variables
-        imagename = '{}/vpp/vpp-config/{}'.format(self._rootdir, IPERFVM_IMAGE)
+        imagename = '{}/vpp/vpp-config/{}'.format(
+            self._rootdir, IPERFVM_IMAGE)
         isoname = '{}/vpp/vpp-config/{}'.format(self._rootdir, IPERFVM_ISO)
-        tcontents = tcontents.format(vmname=vmname, imagename=imagename, isoname=isoname,
+        tcontents = tcontents.format(vmname=vmname, imagename=imagename,
+                                     isoname=isoname,
                                      vhostsocketname=self._sockfilename)
 
         # Write the xml
@@ -1913,4 +2006,5 @@
         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
         if ret != 0:
             logging.debug(stderr)
-            raise RuntimeError("Couldn't execute the command {} : {}".format(cmd, stderr))
+            raise RuntimeError(
+                "Couldn't execute the command {} : {}".format(cmd, stderr))
diff --git a/extras/vpp_config/vpplib/CpuUtils.py b/extras/vpp_config/vpplib/CpuUtils.py
index f5c23bc..23f418d 100644
--- a/extras/vpp_config/vpplib/CpuUtils.py
+++ b/extras/vpp_config/vpplib/CpuUtils.py
@@ -12,7 +12,7 @@
 # limitations under the License.
 
 """CPU utilities library."""
-
+from __future__ import absolute_import, division
 import re
 
 from vpplib.VPPUtil import VPPUtil
@@ -43,8 +43,8 @@
     @staticmethod
     def is_smt_enabled(cpu_info):
         """Uses CPU mapping to find out if SMT is enabled or not. If SMT is
-        enabled, the L1d,L1i,L2,L3 setting is the same for two processors. These
-        two processors are two threads of one core.
+        enabled, the L1d,L1i,L2,L3 setting is the same for two processors.
+        These two processors are two threads of one core.
 
         :param cpu_info: CPU info, the output of "lscpu -p".
         :type cpu_info: list
@@ -53,7 +53,7 @@
         """
 
         cpu_mems = [item[-4:] for item in cpu_info]
-        cpu_mems_len = len(cpu_mems) / CpuUtils.NR_OF_THREADS
+        cpu_mems_len = len(cpu_mems) // CpuUtils.NR_OF_THREADS
         count = 0
         for cpu_mem in cpu_mems[:cpu_mems_len]:
             if cpu_mem in cpu_mems[cpu_mems_len:]:
@@ -137,7 +137,7 @@
 
         if smt_enabled and not smt_used:
             cpu_list_len = len(cpu_list)
-            cpu_list = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS]
+            cpu_list = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS]
 
         return cpu_list
 
@@ -171,8 +171,8 @@
             cpu_cnt = cpu_list_len - skip_cnt
 
         if smt_used:
-            cpu_list_0 = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS]
-            cpu_list_1 = cpu_list[cpu_list_len / CpuUtils.NR_OF_THREADS:]
+            cpu_list_0 = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS]
+            cpu_list_1 = cpu_list[cpu_list_len // CpuUtils.NR_OF_THREADS:]
             cpu_list = [cpu for cpu in cpu_list_0[skip_cnt:skip_cnt + cpu_cnt]]
             cpu_list_ex = [cpu for cpu in
                            cpu_list_1[skip_cnt:skip_cnt + cpu_cnt]]
@@ -236,8 +236,8 @@
                                                        smt_used=smt_used)
         if smt_used:
             cpu_list_len = len(cpu_list)
-            cpu_list_0 = cpu_list[:cpu_list_len / CpuUtils.NR_OF_THREADS]
-            cpu_list_1 = cpu_list[cpu_list_len / CpuUtils.NR_OF_THREADS:]
+            cpu_list_0 = cpu_list[:cpu_list_len // CpuUtils.NR_OF_THREADS]
+            cpu_list_1 = cpu_list[cpu_list_len // CpuUtils.NR_OF_THREADS:]
             cpu_range = "{}{}{},{}{}{}".format(cpu_list_0[0], sep,
                                                cpu_list_0[-1],
                                                cpu_list_1[0], sep,
diff --git a/extras/vpp_config/vpplib/QemuUtils.py b/extras/vpp_config/vpplib/QemuUtils.py
index a76b873..0b7e08b 100644
--- a/extras/vpp_config/vpplib/QemuUtils.py
+++ b/extras/vpp_config/vpplib/QemuUtils.py
@@ -12,6 +12,7 @@
 # limitations under the License.
 
 """QEMU utilities library."""
+from  __future__ import absolute_import, division
 
 from time import time, sleep
 import json
@@ -100,8 +101,9 @@
         :type threads: int
         :type sockets: int
         """
-        self._qemu_opt['smp'] = '-smp {},cores={},threads={},sockets={}'.format(
-            cpus, cores, threads, sockets)
+        self._qemu_opt['smp'] = \
+            '-smp {},cores={},threads={},sockets={}'.format(
+                cpus, cores, threads, sockets)
 
     def qemu_set_ssh_fwd_port(self, fwd_port):
         """Set host port for guest SSH forwarding.
@@ -256,7 +258,8 @@
         if int(ret_code) != 0:
             logging.debug('QMP execute failed {0}'.format(stderr))
             raise RuntimeError('QMP execute "{0}"'
-                               ' failed on {1}'.format(cmd, self._node['host']))
+                               ' failed on {1}'.format(
+                cmd, self._node['host']))
         logging.debug(stdout)
         # Skip capabilities negotiation messages.
         out_list = stdout.splitlines()
@@ -268,7 +271,8 @@
     def _qemu_qga_flush(self):
         """Flush the QGA parser state
         """
-        qga_cmd = '(printf "\xFF"; sleep 1) | sudo -S socat - UNIX-CONNECT:' + \
+        qga_cmd = '(printf "\xFF"; sleep 1) | ' \
+                  'sudo -S socat - UNIX-CONNECT:' + \
                   self._qga_sock
         # TODO: probably need something else
         (ret_code, stdout, stderr) = self._ssh.exec_command(qga_cmd)
@@ -298,7 +302,8 @@
         if int(ret_code) != 0:
             logging.debug('QGA execute failed {0}'.format(stderr))
             raise RuntimeError('QGA execute "{0}"'
-                               ' failed on {1}'.format(cmd, self._node['host']))
+                               ' failed on {1}'.format(
+                cmd, self._node['host']))
         logging.debug(stdout)
         if not stdout:
             return {}
@@ -322,7 +327,8 @@
                 self._qemu_qga_flush()
                 out = self._qemu_qga_exec('guest-ping')
             except ValueError:
-                logging.debug('QGA guest-ping unexpected output {}'.format(out))
+                logging.debug(
+                    'QGA guest-ping unexpected output {}'.format(out))
             # Empty output - VM not booted yet
             if not out:
                 sleep(5)
@@ -335,10 +341,12 @@
             else:
                 # If there is an unexpected output from QGA guest-info, try
                 # again until timeout.
-                logging.debug('QGA guest-ping unexpected output {}'.format(out))
+                logging.debug(
+                    'QGA guest-ping unexpected output {}'.format(out))
 
-        logging.debug('VM {0} booted on {1}'.format(self._qemu_opt['disk_image'],
-                                                    self._node['host']))
+        logging.debug(
+            'VM {0} booted on {1}'.format(self._qemu_opt['disk_image'],
+                                          self._node['host']))
 
     def _update_vm_interfaces(self):
         """Update interface names in VM node dict."""
@@ -349,8 +357,9 @@
         interfaces = out.get('return')
         mac_name = {}
         if not interfaces:
-            raise RuntimeError('Get VM {0} interface list failed on {1}'.format(
-                self._qemu_opt['disk_image'], self._node['host']))
+            raise RuntimeError(
+                'Get VM {0} interface list failed on {1}'.format(
+                    self._qemu_opt['disk_image'], self._node['host']))
         # Create MAC-name dict
         for interface in interfaces:
             if 'hardware-address' not in interface:
@@ -361,7 +370,8 @@
             mac = interface.get('mac_address')
             if_name = mac_name.get(mac)
             if if_name is None:
-                logging.debug('Interface name for MAC {} not found'.format(mac))
+                logging.debug(
+                    'Interface name for MAC {} not found'.format(mac))
             else:
                 interface['name'] = if_name
 
@@ -380,20 +390,25 @@
             # If we want to allocate hugepage dynamically
             if allocate:
                 mem_needed = abs((huge_free * huge_size) - (mem_size * 1024))
-                huge_to_allocate = ((mem_needed / huge_size) * 2) + huge_total
+                huge_to_allocate = ((mem_needed // huge_size) * 2) + huge_total
                 max_map_count = huge_to_allocate*4
-                # Increase maximum number of memory map areas a process may have
-                cmd = 'echo "{0}" | sudo tee /proc/sys/vm/max_map_count'.format(
+                # Increase maximum number of memory map areas a
+                # process may have
+                cmd = \
+                    'echo "{0}" | sudo tee /proc/sys/vm/max_map_count'.format(
                     max_map_count)
                 (ret_code, _, stderr) = self._ssh.exec_command_sudo(cmd)
                 # Increase hugepage count
-                cmd = 'echo "{0}" | sudo tee /proc/sys/vm/nr_hugepages'.format(
+                cmd = \
+                    'echo "{0}" | sudo tee /proc/sys/vm/nr_hugepages'.format(
                     huge_to_allocate)
                 (ret_code, _, stderr) = self._ssh.exec_command_sudo(cmd)
                 if int(ret_code) != 0:
-                    logging.debug('Mount huge pages failed {0}'.format(stderr))
-                    raise RuntimeError('Mount huge pages failed on {0}'.format(
-                        self._node['host']))
+                    logging.debug(
+                        'Mount huge pages failed {0}'.format(stderr))
+                    raise RuntimeError(
+                        'Mount huge pages failed on {0}'.format(
+                            self._node['host']))
             # If we do not want to allocate dynamicaly end with error
             else:
                 raise RuntimeError(
@@ -467,7 +482,8 @@
                 try:
                     huge_free = int(out)
                 except ValueError:
-                    logging.debug('Reading free huge pages information failed')
+                    logging.debug(
+                        'Reading free huge pages information failed')
                 else:
                     break
         else:
@@ -493,7 +509,8 @@
                 try:
                     huge_total = int(out)
                 except ValueError:
-                    logging.debug('Reading total huge pages information failed')
+                    logging.debug(
+                        'Reading total huge pages information failed')
                 else:
                     break
         else:
diff --git a/extras/vpp_config/vpplib/VPPUtil.py b/extras/vpp_config/vpplib/VPPUtil.py
index a1c64a3..365c4c9 100644
--- a/extras/vpp_config/vpplib/VPPUtil.py
+++ b/extras/vpp_config/vpplib/VPPUtil.py
@@ -11,6 +11,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from __future__ import print_function
+
 """VPP util library"""
 import logging
 import re
@@ -45,12 +47,18 @@
                                stderr=subprocess.PIPE)
 
         with prc.stdout:
-            for line in iter(prc.stdout.readline, b''):
+            lines = prc.stdout.readlines()
+            for line in lines:
+                if type(line) != str:
+                    line = line.decode()
                 logging.info("  {}".format(line.strip('\n')))
                 out += line
 
         with prc.stderr:
-            for line in iter(prc.stderr.readline, b''):
+            lines = prc.stderr.readlines()
+            for line in lines:
+                if type(line) != str:
+                    line = line.decode()
                 logging.warn("  {}".format(line.strip('\n')))
                 err += line
 
@@ -135,8 +143,10 @@
             sfd.close()
 
         # Add the key
-        key = requests.get('https://packagecloud.io/fdio/{}/gpgkey'.format(branch))
-        cmd = 'echo "{}" | apt-key add -'.format(key.content)
+
+        key = requests.get(
+            'https://packagecloud.io/fdio/{}/gpgkey'.format(branch))
+        cmd = 'echo "{}" | apt-key add -'.format(key.content.decode(key.encoding))
         (ret, stdout, stderr) = self.exec_command(cmd)
         if ret != 0:
             raise RuntimeError('{} failed on node {} {}'.format(
@@ -205,28 +215,31 @@
                 stderr))
 
         # Get the file contents
-        reps = '[fdio_{}]\n'.format(branch)
-        reps += 'name=fdio_{}\n'.format(branch)
-        reps += 'baseurl=https://packagecloud.io/fdio/{}/el/7/$basearch\n'.format(branch)
-        reps += 'repo_gpgcheck=1\n'
-        reps += 'gpgcheck=0\n'
-        reps += 'enabled=1\n'
-        reps += 'gpgkey=https://packagecloud.io/fdio/{}/gpgkey\n'.format(branch)
-        reps += 'sslverify=1\n'
-        reps += 'sslcacert=/etc/pki/tls/certs/ca-bundle.crt\n'
-        reps += 'metadata_expire=300\n'
-        reps += '\n'
-        reps += '[fdio_{}-source]\n'.format(branch)
-        reps += 'name=fdio_{}-source\n'.format(branch)
-        reps += 'baseurl=https://packagecloud.io/fdio/{}/el/7/SRPMS\n'.format(branch)
-        reps += 'repo_gpgcheck=1\n'
-        reps += 'gpgcheck=0\n'
-        reps += 'enabled=1\n'
-        reps += 'gpgkey=https://packagecloud.io/fdio/{}/gpgkey\n'.format(branch)
-        reps += 'sslverify =1\n'
-        reps += 'sslcacert=/etc/pki/tls/certs/ca-bundle.crt\n'
-        reps += 'metadata_expire=300\n'
 
+        reps = '\n'.join([
+            '[fdio_{}]'.format(branch),
+            'name=fdio_{}'.format(branch),
+            'baseurl=https://packagecloud.io/fdio/{}/el/7/$basearch'.format(
+                branch),
+            'repo_gpgcheck=1',
+            'gpgcheck=0',
+            'enabled=1',
+            'gpgkey=https://packagecloud.io/fdio/{}/gpgkey'.format(branch),
+            'sslverify=1',
+            'sslcacert=/etc/pki/tls/certs/ca-bundle.crt',
+            'metadata_expire=300\n',
+            '[fdio_{}-source]'.format(branch),
+            'name=fdio_release-{}'.format(branch),
+            'baseurl=https://packagecloud.io/fdio/{}/el/7/SRPMS'.format(
+                branch),
+            'repo_gpgcheck=1',
+            'gpgcheck=0',
+            'enabled=1',
+            'gpgkey=https://packagecloud.io/fdio/{}/gpgkey'.format(branch),
+            'sslverify =1',
+            'sslcacert=/etc/pki/tls/certs/ca-bundle.crt',
+            'metadata_expire=300\n'
+        ])
         with open(sfile, 'w') as sfd:
             sfd.write(reps)
             sfd.close()
@@ -240,7 +253,8 @@
                 node['host'],
                 stderr))
 
-        cmd = "yum -q makecache -y --disablerepo='*' --enablerepo='fdio_{}'".format(branch)
+        cmd = "yum -q makecache -y --disablerepo='*' " \
+              "--enablerepo='fdio_{}'".format(branch)
         (ret, stdout, stderr) = self.exec_command(cmd)
         if ret != 0:
             logging.debug('{} failed on node {} {}'.format(
@@ -425,14 +439,15 @@
 
         :param node: VPP node.
         :type node: dict
-        :returns: Dictionary containing a list of VMs and the interfaces that are connected to VPP
+        :returns: Dictionary containing a list of VMs and the interfaces
+                  that are connected to VPP
         :rtype: dictionary
         """
 
         vmdict = {}
 
-        print "Need to implement get vms"
-        
+        print ("Need to implement get vms")
+
         return vmdict
 
     @staticmethod
@@ -627,8 +642,10 @@
     def get_interfaces_numa_node(node, *iface_keys):
         """Get numa node on which are located most of the interfaces.
 
-        Return numa node with highest count of interfaces provided as arguments.
-        Return 0 if the interface does not have numa_node information available.
+        Return numa node with highest count of interfaces provided as
+        arguments.
+        Return 0 if the interface does not have numa_node information
+        available.
         If all interfaces have unknown location (-1), then return 0.
         If most of interfaces have unknown location (-1), but there are
         some interfaces with known location, then return the second most
@@ -702,7 +719,9 @@
         cmd = 'service vpp stop'
         (ret, stdout, stderr) = VPPUtil.exec_command(cmd)
         if ret != 0:
-            logging.debug('{} failed on node {} {} {}'.format(cmd, node['host'], stdout, stderr))
+            logging.debug('{} failed on node {} {} {}'.
+                          format(cmd, node['host'],
+                                 stdout, stderr))
 
     # noinspection RegExpRedundantEscape
     @staticmethod
@@ -754,11 +773,12 @@
 
         distro = platform.linux_distribution()
         if distro[0] == 'Ubuntu' or \
-                        distro[0] == 'CentOS Linux' or \
-                        distro[:7] == 'Red Hat':
+                distro[0] == 'CentOS Linux' or \
+                distro[:7] == 'Red Hat':
             return distro
         else:
-            raise RuntimeError('Linux Distribution {} is not supported'.format(distro[0]))
+            raise RuntimeError(
+                'Linux Distribution {} is not supported'.format(distro[0]))
 
     @staticmethod
     def version():
@@ -810,7 +830,7 @@
         bridges = []
         for line in lines:
             if line == 'no bridge-domains in use':
-                print line
+                print (line)
                 return ifaces
             if len(line) == 0:
                 continue
@@ -834,5 +854,5 @@
                 ifcidx = {'name': iface[0], 'index': line.split()[1]}
                 ifaces.append(ifcidx)
 
-        print stdout
+        print (stdout)
         return ifaces
diff --git a/extras/vpp_config/vpplib/VppGrubUtil.py b/extras/vpp_config/vpplib/VppGrubUtil.py
index 1723170..d199f1e 100644
--- a/extras/vpp_config/vpplib/VppGrubUtil.py
+++ b/extras/vpp_config/vpplib/VppGrubUtil.py
@@ -101,7 +101,8 @@
         value = cmdline.split('{}='.format(grubcmdline))[1]
         value = value.rstrip('"').lstrip('"')
 
-        # jadfix intel_pstate=disable sometimes cause networks to hang on reboot
+        # jadfix intel_pstate=disable sometimes cause networks to
+        # hang on reboot
         # iommu = re.findall(r'iommu=\w+', value)
         # pstate = re.findall(r'intel_pstate=\w+', value)
         # If there is already some iommu commands set, leave them,
diff --git a/extras/vpp_config/vpplib/VppHugePageUtil.py b/extras/vpp_config/vpplib/VppHugePageUtil.py
index 43df72a..3a63282 100644
--- a/extras/vpp_config/vpplib/VppHugePageUtil.py
+++ b/extras/vpp_config/vpplib/VppHugePageUtil.py
@@ -11,6 +11,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from __future__ import print_function
+
 """VPP Huge Page Utilities"""
 
 import re
@@ -95,16 +97,16 @@
 
         node = self._node
         hugepages = node['hugepages']
-        print "  {:30}: {}".format("Total System Memory",
-                                   hugepages['memtotal'])
-        print "  {:30}: {}".format("Total Free Memory",
-                                   hugepages['memfree'])
-        print "  {:30}: {}".format("Actual Huge Page Total",
-                                   hugepages['actual_total'])
-        print "  {:30}: {}".format("Configured Huge Page Total",
-                                   hugepages['total'])
-        print "  {:30}: {}".format("Huge Pages Free", hugepages['free'])
-        print "  {:30}: {}".format("Huge Page Size", hugepages['size'])
+        print ("  {:30}: {}".format("Total System Memory",
+                                   hugepages['memtotal']))
+        print ("  {:30}: {}".format("Total Free Memory",
+                                    hugepages['memfree']))
+        print ("  {:30}: {}".format("Actual Huge Page Total",
+                                    hugepages['actual_total']))
+        print ("  {:30}: {}".format("Configured Huge Page Total",
+                                    hugepages['total']))
+        print ("  {:30}: {}".format("Huge Pages Free", hugepages['free']))
+        print ("  {:30}: {}".format("Huge Page Size", hugepages['size']))
 
     def get_huge_page_config(self):
         """
diff --git a/extras/vpp_config/vpplib/VppPCIUtil.py b/extras/vpp_config/vpplib/VppPCIUtil.py
index fe64c9d..ceda46f 100644
--- a/extras/vpp_config/vpplib/VppPCIUtil.py
+++ b/extras/vpp_config/vpplib/VppPCIUtil.py
@@ -11,6 +11,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+from __future__ import print_function
+
 """VPP PCI Utility libraries"""
 
 import re
@@ -44,7 +46,7 @@
 
         ids = re.findall(PCI_DEV_ID_REGEX, device_string)
         descriptions = re.findall(r'\'([\s\S]*?)\'', device_string)
-        unused = re.findall(r'unused=[\w,]+', device_string)
+        unused = re.findall(r'unused=\w+|unused=', device_string)
 
         for i, j in enumerate(ids):
             device = {'description': descriptions[i]}
@@ -268,8 +270,8 @@
         dashseparator = ("-" * (len(header) - 2))
 
         if show_header is True:
-            print header
-            print dashseparator
+            print (header)
+            print (dashseparator)
         for dit in devices.items():
             dvid = dit[0]
             device = dit[1]
@@ -282,11 +284,11 @@
                     else:
                         interface = interfaces[i]
 
-                print "{:15} {:25} {:50}".format(
-                    dvid, interface, device['description'])
+                print ("{:15} {:25} {:50}".format(
+                    dvid, interface, device['description']))
             else:
-                print "{:15} {:50}".format(
-                    dvid, device['description'])
+                print ("{:15} {:50}".format(
+                    dvid, device['description']))
 
     @staticmethod
     def unbind_vpp_device(node, device_id):