#!/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_RAM_MB=$((4 * 1024))  # 4 GiB, needed to link libmesos

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 (trusty64, centos6, centos7).
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="/tmp"
  cleanup() {
    if [[ -f Vagrantfile ]]; then
      vagrant destroy -f
    fi
    cd /
    rm -frv "$TMPDIR"
  }
  # TODO(ksweeney): Use atexit.sh from mesos and its superior handling of this cleanup idiom.
  trap cleanup EXIT
  TMPDIR=$(mktemp -d -t make-mesos-eggs.XXXXX)
}

# Create a new vagrant box
init_vagrant_box() {
  local box_name=$1
  cat > Vagrantfile <<EOF
Vagrant.require_version ">= 1.5.0"
Vagrant.configure("2") do |config|
  config.vm.box = "$box_name"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "$BOX_RAM_MB"]
  end
end
EOF
}

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
      make
      find . -name '*.egg' -exec cp -v {} /vagrant \\;
EOF
}

UBUNTU_TRUSTY64_DEPENDENCIES=(
  g++-4.8
  libapr1-dev
  libcurl4-nss-dev
  libsasl2-dev
  libsvn-dev
  python-dev
  python-virtualenv
  zlib1g-dev
)
build_ubuntu_trusty64() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/ubuntu/trusty64/python
  pushd "$TMPDIR"
    init_vagrant_box ubuntu/trusty64
    vagrant up
    vagrant ssh <<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.native*.egg "$python_outdir"
  popd
}

CENTOS6_X86_64_DEPENDENCIES=(
  apr-devel
  cyrus-sasl-devel
  cyrus-sasl-md5
  devtoolset-2-binutils
  devtoolset-2-gcc
  devtoolset-2-gcc-c++
  libcurl-devel
  patch
  python27-python-devel
  subversion-devel
  zlib-devel
)
build_centos6() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/centos/6/python
  mkdir -pv centos6
  pushd centos6
    VAGRANTDIR=$PWD
    init_vagrant_box bento/centos-6.7
    vagrant up
    vagrant ssh <<EOF
    set -e -u

    # We need Software Collections for Python 2.7 (we dropped support for 2.6).
    sudo yum -y install centos-release-SCL

    # Mesos requires gcc 4.8, which is available in devtools-2 on centos 6.
    # TODO(maxim): Consider using signed packages when/if available.
    sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo

    sudo yum -y install ${CENTOS6_X86_64_DEPENDENCIES[*]}
    scl enable devtoolset-2 bash
    scl enable python27 - <<EOS
        $(fetch_and_build_mesos "$mesos_version")
EOS
EOF
    mkdir -pv "$python_outdir"
    cp -v mesos.native*.egg "$python_outdir"
  popd
}

CENTOS7_X86_64_DEPENDENCIES=(
  apr-devel
  cyrus-sasl-devel
  cyrus-sasl-md5
  gcc-c++
  libcurl-devel
  patch
  python-devel
  subversion-devel
  zlib-devel
)
build_centos7() {
  local mesos_version=$1 output_basedir=$2
  local python_outdir=$output_basedir/centos/7/python
  mkdir -pv "$python_outdir"
  pushd $TMPDIR
    init_vagrant_box bento/centos-7.1
    vagrant up
    vagrant ssh <<EOF
    set -e -u

    sudo yum -y install ${CENTOS7_X86_64_DEPENDENCIES[*]}
    $(fetch_and_build_mesos "$mesos_version")
EOF
    cp -v mesos.native*.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
      trusty64)
        build_ubuntu_trusty64 "$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 "$@"
