#!/bin/bash
# Dependencies: vagrant >= 1.5.0 (for vagrantcloud support), VirtualBox
# System Requirements: 4 GiB of RAM free.
set -u -e

MESOS_BASEURL=https://archive.apache.org/dist/mesos
BOX_CPUS=4

usage() {
  cat <<EOF
Usage: make-mesos-native-egg.sh TARGET_DISTRIBUTION MESOS_VERSION AURORA_3RDPARTY_ROOT

Build a mesos Python egg in a Docker container.

TARGET_DISTRIBUTION is one of (centos6, centos7, stretch64, xenial64).
MESOS_VERSION is a released version of mesos available on archive.apache.org.
AURORA_3RDPARTY_ROOT is the path to a sparse checkout of the Aurora 3rdparty repo.
EOF
  exit ${1:-1}
}

setup_tempdir() {
  TMPDIR=$(mktemp -d -t make-mesos-eggs.XXXXX)
  cleanup() {
    rm -frv "$TMPDIR"
  }
  # TODO(ksweeney): Use atexit.sh from mesos and its superior handling of this cleanup idiom.
  trap cleanup EXIT
}

fetch_and_build_mesos() {
  local mesos_version=$1

  cat <<EOF
      wget --progress=dot "$MESOS_BASEURL/$mesos_version/mesos-${mesos_version}.tar.gz"
      tar zxvf mesos-${mesos_version}.tar.gz
      cd mesos-$mesos_version
      ./configure --disable-java --enable-optimize
      export MAKEFLAGS="-j$BOX_CPUS"
      make
      find . -name '*.egg' -exec cp -v {} /mesos-egg \\;
EOF
}

DEBIAN_STRETCH64_DEPENDENCIES=(
  g++
  make
  libapr1-dev
  libcurl4-nss-dev
  libsasl2-dev
  libsvn-dev
  make
  patch
  python-dev
  python-virtualenv
  zlib1g-dev
  wget
)
build_debian_stretch64() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/debian/stretch64/python
  local image_name=debian:stretch-slim

  pushd "$TMPDIR"
    docker run -i -v $(pwd):/mesos-egg $image_name bash <<EOF
      set -e -u

      apt-get update
      apt-get -y install ${DEBIAN_STRETCH64_DEPENDENCIES[*]}
      $(fetch_and_build_mesos "$mesos_version")
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.executor*.egg "$python_outdir"
  popd
}

UBUNTU_XENIAL64_DEPENDENCIES=(
  g++
  libapr1-dev
  libcurl4-nss-dev
  libsasl2-dev
  libsvn-dev
  make
  patch
  python-dev
  python-virtualenv
  wget
  zlib1g-dev
)
build_ubuntu_xenial64() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/ubuntu/xenial64/python
  local image_name=ubuntu:xenial

  pushd "$TMPDIR"
    docker run -i -v $(pwd):/mesos-egg $image_name bash <<EOF
      set -e -u

      apt-get update
      apt-get -y install ${UBUNTU_XENIAL64_DEPENDENCIES[*]}
      $(fetch_and_build_mesos "$mesos_version")
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.executor*.egg "$python_outdir"
  popd
}

CENTOS6_X86_64_DEPENDENCIES=(
  apr-devel
  cyrus-sasl-devel
  cyrus-sasl-md5
  devtoolset-7-binutils
  devtoolset-7-gcc
  devtoolset-7-gcc-c++
  devtoolset-7-toolchain
  libcurl-devel
  make
  patch
  python27-python-devel
  subversion-devel
  zlib-devel
  wget
  tar
)
build_centos6() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/centos/6/python
  local image_name=centos:6

  pushd "$TMPDIR"
    docker run -i -v $(pwd):/mesos-egg $image_name bash <<EOF
    set -e -u

    # We need Software Collections for Python 2.7 (we dropped support for 2.6).
    # wget must get installed before everything else to fetch the additional repos.
    yum -y install centos-release-scl-rh
    yum -y install ${CENTOS6_X86_64_DEPENDENCIES[*]}

    # Mesos requires gcc 4.8+, which is available in devtools-7 on centos 6.
    scl enable devtoolset-7 bash
    scl enable python27 - <<EOS
        $(fetch_and_build_mesos "$mesos_version")
EOS
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.executor*.egg "$python_outdir"
  popd
}

CENTOS7_X86_64_DEPENDENCIES=(
  apr-devel
  cyrus-sasl-devel
  cyrus-sasl-md5
  gcc-c++
  libcurl-devel
  make
  patch
  python-devel
  subversion-devel
  wget
  zlib-devel
  tar
)
build_centos7() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/centos/7/python
  local image_name=centos:7

  pushd "$TMPDIR"
    docker run -i -v $(pwd):/mesos-egg $image_name bash <<EOF
    set -e -u

    yum -y install ${CENTOS7_X86_64_DEPENDENCIES[*]}
    $(fetch_and_build_mesos "$mesos_version")
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.executor*.egg "$python_outdir"
  popd
}

main() {
  local target_distribution=$1
  local mesos_version=$2
  local output_basedir=$3

  if [[ ! -d "$output_basedir" ]]; then
    echo "'$output_basedir' is not a directory."
    echo
    usage 1
  fi
  setup_tempdir
  pushd "$TMPDIR"
    case "$target_distribution" in
      stretch64)
        build_debian_stretch64 "$mesos_version" "$output_basedir"
        ;;
      xenial64)
        build_ubuntu_xenial64 "$mesos_version" "$output_basedir"
        ;;
      centos6)
        build_centos6 "$mesos_version" "$output_basedir"
        ;;
      centos7)
        build_centos7 "$mesos_version" "$output_basedir"
        ;;
      *)
        echo "Invalid distribution '$target_distribution'."
        echo
        usage 1
        ;;
    esac
  popd
}

if [[ ${1:-""} = -h ]]; then usage 0; elif [[ $# -ne 3 ]]; then usage 1; fi
main "$@"
