sdk/apps/virtual-ethernet/scripts/virtual_ethernet_pktgen_install.py (131 lines of code) (raw):

#!/usr/bin/env python3 # Amazon FPGA Hardware Development Kit # # Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Amazon Software License (the "License"). You may not use # this file except in compliance with the License. A copy of the License is # located at # # http://aws.amazon.com/asl/ # # or in the "license" file accompanying this file. This file is distributed on # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or # implied. See the License for the specific language governing permissions and # limitations under the License. from __future__ import print_function import os import sys import distro import glob import argparse import logging import platform dpdk_git = "https://github.com/DPDK/dpdk.git" pktgen_git = "git://dpdk.org/apps/pktgen-dpdk" dpdk_kmods_git = "git://dpdk.org/dpdk-kmods" numa_git = "https://github.com/numactl/numactl.git" # Use a version that is "known good" for use with pktgen dpdk_ver = "v24.03" pktgen_ver = "pktgen-24.03.1" numa_ver = "v2.0.12" # Patch file directory patches_dir = "../patches/pktgen-dpdk" dpdk_kmods_patches_dir = "../patches/spp-dpdk-kmods" # DPDK make target make_tgt = "x86_64-native-linuxapp-gcc" # Logger logger = logging.getLogger('logger') def print_success(scripts_path, install_path): print("") print("pktgen-dpdk installation and build complete!") print("pktgen-dpdk may be setup via the following step:") print(" sudo %s/virtual_ethernet_pktgen_setup.py %s --eni_dbdf <ENI_DBDF> --eni_ethdev <ENI_ETHDEV>" % (scripts_path, install_path)) def cmd_exec(cmd): # Execute the cmd, check the return and exit on failures ret = os.system(cmd) if ret != 0: logger.error("cmd='%s' failed with ret=%d, exiting" % (cmd, ret)) sys.exit(1) def install_dpdk_dep(): installed_distro = distro.name() if (installed_distro == "Ubuntu"): cmd_exec("sudo apt -y install libnuma-dev") cmd_exec("sudo apt -y install libpcap-dev") cmd_exec("sudo apt -y install meson") cmd_exec("sudo apt -y install python3-pyelftools") cmd_exec("sudo apt -y install autoconf") cmd_exec("sudo apt -y install libtool") else: cmd_exec("sudo yum -y install numactl-devel") cmd_exec("sudo yum -y install libpcap-devel") cmd_exec("sudo yum -y install meson") cmd_exec("sudo yum -y install python3-pyelftools") cmd_exec("sudo yum -y install autoconf") cmd_exec("sudo yum -y install libtool") def install_pktgen_dpdk(install_path): logger.debug("install_pktgen_dpdk: install_path=%s" % (install_path)) if os.path.exists(install_path): # Allow the user to remove an already existing install_path logger.error("install_path=%s allready exists." % (install_path)) logger.error("Please specify a different directory or remove the existing directory, exiting") sys.exit(1) # Install DPDK dependencies install_dpdk_dep() # Stash away the current working directory cwd = os.getcwd() scripts_path = os.path.dirname(os.path.abspath(sys.argv[0])) logger.debug("scripts directory path is %s" % (scripts_path)) # Make the install_path directory cmd_exec("mkdir %s" % (install_path)) # Construct the path to the dpdk-kmods git patch files dpdk_kmods_patches_path = "%s/%s" % (scripts_path, dpdk_kmods_patches_dir) logger.info("Patches will be installed from %s" % (dpdk_kmods_patches_path)) # Read in the patch filenames dpdk_kmods_patchfiles = [] for patchfile in sorted(glob.iglob("%s/000*.patch" % (dpdk_kmods_patches_path))): logger.debug("found patchfile=%s" % patchfile) dpdk_kmods_patchfiles.append(os.path.abspath(patchfile)) # Construct the path to the git patch files patches_path = "%s/%s" % (scripts_path, patches_dir) logger.info("Patches will be installed from %s" % (patches_path)) # Read in the pktgen patch filenames patchfiles = [] for patchfile in sorted(glob.iglob("%s/000*.patch" % (patches_path))): logger.debug("found patchfile=%s for pktgen" % patchfile) patchfiles.append(os.path.abspath(patchfile)) # Read in the dpdk patch filenames dpdk_patchfiles = [] for dpdk_patchfile in sorted(glob.iglob("%s/dpdk*.patch" % (patches_path))): logger.debug("found patchfile=%s for dpdk" % dpdk_patchfile) dpdk_patchfiles.append(os.path.abspath(dpdk_patchfile)) # cd to the install_path directory os.chdir("%s" % (install_path)) # Clone the DPDK-KMODS repo logger.info("Cloning %s into %s" % (dpdk_kmods_git, install_path)) cmd_exec("git clone %s" % (dpdk_kmods_git)) # cd to the dpdk-kmods directory os.chdir("dpdk-kmods") # Apply the patches for patchfile in dpdk_kmods_patchfiles: logger.info("Applying patch for patchfile=%s" % patchfile) cmd_exec("git am %s" % (patchfile)) # Clone the DPDK repo os.chdir("%s" % (install_path)) logger.info("Cloning %s version of %s into %s" % (dpdk_ver, dpdk_git, install_path)) cmd_exec("git clone -b %s %s" % (dpdk_ver, dpdk_git)) # cd to the dpdk directory os.chdir("dpdk") # Apply the patches for dpdk_patchfile in dpdk_patchfiles: logger.info("Applying patch for patchfile=%s" % dpdk_patchfile) cmd_exec("git apply %s" % (dpdk_patchfile)) cmd_exec("cp -r ../dpdk-kmods/linux ./kernel/") # Configure the DPDK build cmd_exec("meson build") cmd_exec("ninja -C build") os.chdir("build") cmd_exec("sudo meson install") # Clone the numactl repo os.chdir("%s" % (install_path)) logger.info("Cloning %s version of %s into %s" % (numa_ver, numa_git, install_path)) cmd_exec("git clone -b %s %s" % (numa_ver, numa_git)) # cd to the numactl directory os.chdir("numactl") # Configure the numactl build cmd_exec("./autogen.sh") cmd_exec("./configure") cmd_exec("make") cmd_exec("sudo make install") # Clone the pktgen-dpdk repo os.chdir("%s" % (install_path)) logger.info("Cloning %s version of %s into %s" % (pktgen_ver, pktgen_git, install_path)) cmd_exec("git clone -b %s %s" % (pktgen_ver, pktgen_git)) # cd to the pktgen-dpdk directory os.chdir("pktgen-dpdk") # Apply the patches for patchfile in patchfiles: logger.info("Applying patch for patchfile=%s" % patchfile) cmd_exec("git apply %s" % (patchfile)) # Build pktgen-dpdk cmd_exec("meson build") cmd_exec("ninja -C build") # cd back to the original directory os.chdir("%s" % (cwd)) # Print a success message print_success(scripts_path, install_path) def main(): parser = argparse.ArgumentParser( description="Installs pktgen-dpdk and applies pktgen related patches for ENA use.") parser.add_argument('install_path', metavar='INSTALL_DIR', type=str, help = "specify the full installation directory path") parser.add_argument('--debug', action='store_true', required=False, help='Enable debug messages') args = parser.parse_args() logging_level = logging.INFO if args.debug: logging_level = logging.DEBUG logging_format = '%(levelname)s:%(asctime)s: %(message)s' logger.setLevel(logging_level) fh = logging.StreamHandler() fh.setLevel(logging_level) formatter = logging.Formatter(logging_format) fh.setFormatter(formatter) logger.addHandler(fh) install_pktgen_dpdk(args.install_path) if __name__ == '__main__': main()