#!/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 pristine Vagrant environment.

TARGET_DISTRIBUTION is one of (centos6, centos7, jessie64, trusty64, 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_JESSIE64_DEPENDENCIES=(
  g++
  make
  libapr1-dev
  libcurl4-nss-dev
  libsasl2-dev
  libsvn-dev
  make
  patch
  python-dev
  python-virtualenv
  zlib1g-dev
  wget
)
build_debian_jessie64() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/debian/jessie64/python
  local image_name=debian:jessie-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_JESSIE64_DEPENDENCIES[*]}
      $(fetch_and_build_mesos "$mesos_version")
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.executor*.egg "$python_outdir"
  popd
}

UBUNTU_TRUSTY64_DEPENDENCIES=(
  g++
  libapr1-dev
  libcurl4-nss-dev
  libsasl2-dev
  libsvn-dev
  make
  patch
  python-dev
  wget
  zlib1g-dev
)
build_ubuntu_trusty64() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/ubuntu/trusty64/python
  local image_name=ubuntu:trusty

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

      sudo apt-get update
      sudo apt-get -y install ${UBUNTU_TRUSTY64_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
      jessie64)
        build_debian_jessie64 "$mesos_version" "$output_basedir"
        ;;
      trusty64)
        build_ubuntu_trusty64 "$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 "$@"
