From 339bc6b51dd1ea7d783b211c485881ccb495fd0d Mon Sep 17 00:00:00 2001 From: Paul Vinciguerra Date: Wed, 19 Dec 2018 02:05:25 -0800 Subject: vpp_config: Rework for Python2/3 compatibility. On ubuntu: $cd /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 --- extras/vpp_config/README.rst | 15 +- extras/vpp_config/scripts/dpdk-devbind.py | 3 +- extras/vpp_config/scripts/vpp-config | 22 -- extras/vpp_config/setup.py | 30 +- extras/vpp_config/vpp_config.py | 156 +++++---- extras/vpp_config/vpplib/AutoConfig.py | 522 ++++++++++++++++------------ extras/vpp_config/vpplib/CpuUtils.py | 18 +- extras/vpp_config/vpplib/QemuUtils.py | 59 ++-- extras/vpp_config/vpplib/VPPUtil.py | 94 +++-- extras/vpp_config/vpplib/VppGrubUtil.py | 3 +- extras/vpp_config/vpplib/VppHugePageUtil.py | 22 +- extras/vpp_config/vpplib/VppPCIUtil.py | 16 +- 12 files changed, 554 insertions(+), 406 deletions(-) delete mode 100755 extras/vpp_config/scripts/vpp-config diff --git a/extras/vpp_config/README.rst b/extras/vpp_config/README.rst index ec9c8e46cf4..8995edfce9f 100644 --- a/extras/vpp_config/README.rst +++ b/extras/vpp_config/README.rst @@ -11,7 +11,7 @@ Use: 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 @@ environment so you can start from scratch. These are the steps to run the utilit 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 @@ Uploading to PyPi: 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 @@ There are no VPP packages on node localhost. 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 f1d374d6b08..b65677dab0c 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 @@ def main(): 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 7cb27fc20e8..00000000000 --- 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 d3d0e51dc96..fca08f66f82 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 145bf4ea03c..1f792014074 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 @@ import argparse 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 @@ def autoconfig_yn(question, default): 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 @@ def autoconfig_hugepage_apply(node, ask_questions=True): 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 @@ def autoconfig_hugepage_apply(node, ask_questions=True): 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 @@ def autoconfig_vpp_apply(node, ask_questions=True): 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 @@ def autoconfig_vpp_apply(node, ask_questions=True): # 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 @@ def autoconfig_grub_apply(node, ask_questions=True): """ - 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 @@ def autoconfig_grub_apply(node, ask_questions=True): # 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 @@ def autoconfig_grub_apply(node, ask_questions=True): 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 @@ def autoconfig_apply(ask_questions=True): 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 @@ def autoconfig_dryrun(ask_questions=True): 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 @@ def autoconfig_install(): 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 @@ def autoconfig_install(): 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 @@ def autoconfig_not_implemented(): """ - print "\nThis Feature is not implemented yet...." + print ("\nThis Feature is not implemented yet....") def autoconfig_basic_test_menu(): @@ -502,20 +510,20 @@ def autoconfig_basic_test_menu(): 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 @@ def autoconfig_basic_test(): 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 @@ q) Quit'.format(rootdir, rootdir) # 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 @@ def autoconfig_setup(ask_questions=True): 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 @@ def config_main(): 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' - - 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)') + # 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)') args = main_parser.parse_args() diff --git a/extras/vpp_config/vpplib/AutoConfig.py b/extras/vpp_config/vpplib/AutoConfig.py index 2664a6aa7c4..da00b2878eb 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.CpuUtils import CpuUtils 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 @@ class AutoConfig(object): """ 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 @@ class AutoConfig(object): """ while True: - answer = raw_input(question) + answer = input(question) if answer == '': answer = default break @@ -144,11 +152,11 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): # 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): # 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 = 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" + 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", + + "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 @@ class AutoConfig(object): :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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): :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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): """ 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): # 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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']) - - 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']) + 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']) + + 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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 @@ class AutoConfig(object): 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']) - - 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']) + 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']) + + 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 @@ class AutoConfig(object): @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 @@ class AutoConfig(object): (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 @@ class AutoConfig(object): (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 f5c23bc141a..23f418d33be 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 @@ class CpuUtils(object): @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 @@ class CpuUtils(object): """ 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 @@ class CpuUtils(object): 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 @@ class CpuUtils(object): 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 @@ class CpuUtils(object): 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 a76b873121f..0b7e08b12d8 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 @@ class QemuUtils(object): :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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): # 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 @@ class QemuUtils(object): 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 @@ class QemuUtils(object): 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 a1c64a3e15d..365c4c95f79 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): :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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 @@ class VPPUtil(object): 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 1723170649e..d199f1eb053 100644 --- a/extras/vpp_config/vpplib/VppGrubUtil.py +++ b/extras/vpp_config/vpplib/VppGrubUtil.py @@ -101,7 +101,8 @@ class VppGrubUtil(object): 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 43df72a455a..3a632828883 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 @@ class VppHugePageUtil(object): 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 fe64c9d4b14..ceda46f97b9 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 @@ class VppPCIUtil(object): 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 @@ class VppPCIUtil(object): 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 @@ class VppPCIUtil(object): 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): -- cgit 1.2.3-korg