misc: vpptop makefile target
[vpp.git] / extras / vpptop / vpptop.sh
diff --git a/extras/vpptop/vpptop.sh b/extras/vpptop/vpptop.sh
new file mode 100755 (executable)
index 0000000..0d07942
--- /dev/null
@@ -0,0 +1,231 @@
+#!/bin/bash
+
+# A simple script that installs VPPTop utility including
+# all requirements. The binary API is built from the local
+# vpp data. 'make install-dep' is recommended to call first.
+
+set -eo pipefail
+
+OPT_ARG=${1:-}
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+cd "${SCRIPT_DIR}"/../../
+VPP_DIR=$(pwd)
+BUILD_DIR=${VPP_DIR}/extras/vpptop/build
+
+GOROOT=${GOROOT:-}
+GOPATH=${GOPATH:-}
+
+[ -z "${GOROOT}" ] && GOROOT="${HOME}/.go"
+[ -z "${GOPATH}" ] && GOPATH="${HOME}/go"
+
+function dep_install() {
+  echo "Installing VPPTop dependencies"
+  apt-get update
+  apt-get install git wget curl -y
+}
+
+# Install latest GO version
+function go_install() {
+  local TMP="/tmp"
+
+  # Search for existing golang installation
+  echo "Looking for pre-installed GO.."
+  local installed_ver installed_ver_fmt
+  if [[ -f "${GOROOT}/bin/go" ]]; then
+    installed_ver=$(cd ${GOROOT}/bin && ./go version)
+    installed_ver_fmt=${installed_ver#"go version go"}
+    export PATH=$GOROOT/bin:$PATH
+    export PATH=$GOPATH/bin:$PATH
+    echo "Found installed version ${installed_ver_fmt}"
+    return
+  fi
+
+  # install golang when missing
+  echo ".. none was found. Installing the latest one"
+  mkdir -p "${GOROOT}"
+  mkdir -p "${GOPATH}/"{src,pkg,bin}
+
+  wget "https://dl.google.com/go/$(curl https://golang.org/VERSION?m=text).linux-amd64.tar.gz" -O "${TMP}/go.tar.gz"
+  tar -C "$GOROOT" --strip-components=1 -xzf "${TMP}/go.tar.gz"
+
+  rm -f "${TMP}/go.tar.gz"
+
+  # export for current session so the VPPTop can be installed
+  export GOROOT=${GOROOT}
+  export GOPATH=$GOPATH
+  export PATH=$GOROOT/bin:$PATH
+  export PATH=$GOPATH/bin:$PATH
+
+  cat << EOF
+Installed $(go version)
+Note: following variables were exported for the current session:
+GOROOT=${GOROOT}
+GOPATH=${GOPATH}
+Both were added to PATH
+EOF
+}
+
+# Install GoVPP binary API generator. GoLang required
+# to be installed in version 1.13 or higher
+function install_binapi_gen() {
+  echo "Installing GoVPP binary API generator"
+
+  export GO111MODULE=on
+  # master required for latest VPPTop
+  if [[ ! -f "${GOROOT}/bin/go" ]]; then
+    echo "GO is not installed"
+    exit 1
+  fi
+  cd ${GOROOT}/bin && ./go get git.fd.io/govpp.git/cmd/binapi-generator@master
+
+  local installed_ver installed_ver_fmt
+  installed_ver=$(cd ${GOPATH}/bin && ./binapi-generator -version)
+  installed_ver_fmt=${installed_ver#"govpp "}
+  echo "Binary API generator ${installed_ver_fmt} installed"
+}
+
+# Generate binary API files in the VPPTop directory using
+# the local VPP sources
+function generate_binary_api() {
+  # note: build-root dir is planned to be removed, update the path by then
+  local api_dir=${VPP_DIR}/build-root/install-vpp-native/vpp/share/vpp/api
+  local out_dir=${BUILD_DIR}/vpptop/stats/local/binapi
+
+  if [[ ! -f "${GOPATH}/bin/binapi-generator" ]]; then
+    install_binapi_gen
+  fi
+  if [ ! -d "${BUILD_DIR}" ]; then
+    echo "VPPTop directory does not exist"
+    exit 1
+  elif [ ! -d "${out_dir}" ]; then
+    mkdir -p "${out_dir}"
+  fi
+  if [ ! -d "${api_dir}" ]; then
+    echo "JSON API files missing, call 'make json-api-files' first"
+    exit 1
+  fi
+
+  echo "Generating API"
+  cd ${GOPATH}/bin && ./binapi-generator --output-dir="${out_dir}" -input-dir="${api_dir}" \
+    "${api_dir}"/plugins/dhcp.api.json \
+    "${api_dir}"/core/interface.api.json \
+    "${api_dir}"/core/ip.api.json \
+    "${api_dir}"/core/vpe.api.json
+}
+
+# Retrieve VPPTop repository
+function get_vpptop() {
+  echo "Fetching VPPTop"
+  if [ ! -d "${BUILD_DIR}/vpptop" ]; then
+    mkdir "${BUILD_DIR}"
+    cd "${BUILD_DIR}" && git clone https://github.com/PANTHEONtech/vpptop.git
+  else
+    echo "VPPTop directory already exists"
+  fi
+}
+
+# Resolve VPPTop dependencies and install the binary
+function vpptop_install() {
+  get_vpptop
+  generate_binary_api
+
+  echo "Installing VPPTop"
+  if [ ! -d "${BUILD_DIR}" ]; then
+    echo "VPPTop directory does not exist"
+    exit 1
+  fi
+
+  gopath=${GOROOT}/bin/go
+
+  cd "${BUILD_DIR}"/vpptop && go mod download
+  cd "${BUILD_DIR}"/vpptop && make install
+
+  if [[ ! -x "$(command -v vpptop)" ]] && [[ ! -f "${GOPATH}/bin/vpptop" ]] ; then
+    echo "VPPTop was not successfully installed"
+    exit 1
+  fi
+  if [[ ! -x "$(command -v vpptop)" ]] ; then
+    echo "VPPTop was installed to ${GOPATH}/bin/vpptop"
+  fi
+
+    cat << EOF
+-----
+$(vpptop --help)
+-----
+
+Following binaries were installed:
+${GOPATH}/bin/binapi-generator
+${GOPATH}/bin/vpptop
+EOF
+}
+
+# Starts the vpptop binary
+function vpptop_start() {
+  if [[ -f "${GOPATH}/bin/vpptop"  ]] ; then
+    cd ${GOPATH}/bin && ./vpptop
+    return
+  fi
+
+  echo "VPPTop is not installed, use 'make vpptop-install' first"
+}
+
+# Remove VPPTop repository from extras
+function cleanup() {
+  echo "Cleaning up VPPTop"
+  rm -rf "${BUILD_DIR}"
+}
+
+# Show available commands
+function help() {
+  cat <<__EOF__
+  VPPTop installer
+
+  Run 'make install-dep' before the installation
+
+  <install>:
+  Installs VPPTop requirements (latest GO, GoVPP binary API generator),
+  retrieves VPPTop repository, generates binary API and installs the
+  VPPTop binary.
+
+  <cleanup>:
+  Removes VPPTop repository
+
+  <start>:
+  Runs vpptop binary
+
+__EOF__
+}
+
+# Resolve chosen option and call appropriate functions
+function resolve_option() {
+  local option=$1
+  case ${option} in
+  "start")
+    vpptop_start
+    ;;
+  "install")
+    dep_install
+    go_install
+    vpptop_install
+    ;;
+  "cleanup")
+    cleanup
+    ;;
+  "help")
+    help
+    ;;
+  *) echo invalid option ;;
+  esac
+}
+
+if [[ -n ${OPT_ARG} ]]; then
+  resolve_option "${OPT_ARG}"
+else
+  PS3="--> "
+  options=("install" "cleanup" "help")
+  select option in "${options[@]}"; do
+    resolve_option "${option}"
+    break
+  done
+fi