#!/bin/bash

set -ex

export GERRIT_NAME=${GERRIT_NAME:-mcp-jenkins}
# Would delete all .git folders.
# Keep in mind, you would not able to get any other version or history!
# Will ignore 'tempest' itself bz of:
# ```
#   Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository.
#   It's also possible that there is a mismatch between the package name in setup.cfg and the argument given to pbr.version.VersionInfo.
#   Project name tempest was given, but was not able to be found.
# ```
# FIXME|TODO Disabled by default.
# Currently, pip not able to install any package w\o .git directory.
# Should it be re-writed to tgz install or whatever?
#export RELEASE_BUILD=${RELEASE_BUILD:-true}
RELEASE_BUILD=false
#
export TEMPEST_TAG="${TEMPEST_TAG:-mcp/ocata}"
export HORIZON_TAG="${HORIZON_TAG:-mcp/ocata}"
export BARBICAN_TAG="${BARBICAN_TAG:-mcp/ocata}"
export DESIGNATE_TAG="${DESIGNATE_TAG:-mcp/ocata}"
export HEAT_TAG="${HEAT_TAG:-mcp/ocata}"
export IRONIC_TAG="${IRONIC_TAG:-mcp/ocata}"
export MANILA_TAG="${MANILA_TAG:-mcp/ocata}"
export TELEMETRY_TAG="${TELEMETRY_TAG:-mcp/ocata}"
export OCTAVIA_TAG="${OCTAVIA_TAG:-mcp/ocata}"
export PATROLE_TAG="${PATROLE_TAG:-0.4.x}"
export TUNGSTEN_TAG="${TUNGSTEN_TAG:-0.1.x}"
# global openstack requirements repo
# This is the commit where tempest version is 17.2.0 in u-c
export UPPER_CONSTRAINTS_TAG="${UPPER_CONSTRAINTS_TAG:-83b1de74834fbcdbe749e270c29e76cdc28f85d5}"

function prepare(){
  # TODO migrate to downstrem mirror?
  mkdir -p data; pushd data
    if [ ! -d openstack_requirements ] ; then
      git clone https://github.com/openstack/requirements.git openstack_requirements
      pushd openstack_requirements; git checkout $UPPER_CONSTRAINTS_TAG; popd
    fi
    sed -i -e "s|tempest=.*|git+file:///var/lib/tempest@${TEMPEST_TAG}#egg=tempest|g" \
    openstack_requirements/upper-constraints.txt;
  #
    if [ ! -d tempest-horizon-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/tempest-horizon tempest-horizon-plugin
      pushd tempest-horizon-plugin ; git checkout $HORIZON_TAG; popd
    fi
  #
    if [ ! -d barbican-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/barbican-tempest-plugin
      pushd barbican-tempest-plugin; git checkout $BARBICAN_TAG; popd
    fi
  #
    if [ ! -d designate-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/designate-tempest-plugin
      pushd designate-tempest-plugin; git checkout $DESIGNATE_TAG; popd;
    fi
  #
    if [ ! -d heat-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/heat-tempest-plugin
      pushd heat-tempest-plugin; git checkout $HEAT_TAG; popd
    fi
  #
    if [ ! -d ironic-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/ironic-tempest-plugin
      pushd ironic-tempest-plugin; git checkout $IRONIC_TAG;  popd;
    fi
  #
    if [ ! -d manila-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/manila-tempest-plugin
      pushd manila-tempest-plugin; git checkout $MANILA_TAG; popd;
    fi
  #
    if [ ! -d telemetry-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/telemetry-tempest-plugin
      pushd telemetry-tempest-plugin; git checkout $TELEMETRY_TAG; popd;
    fi
  #
    if [ ! -d octavia-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/octavia-tempest-plugin
      pushd octavia-tempest-plugin; git checkout $OCTAVIA_TAG; popd;
    fi
  #
    if [ ! -d patrole-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/patrole patrole-tempest-plugin
      pushd patrole-tempest-plugin; git checkout $PATROLE_TAG; popd;
    fi
  #
    if [ ! -d tungsten-tempest-plugin ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/contrail/tungsten-tempest tungsten-tempest-plugin
      pushd tungsten-tempest-plugin; git checkout $TUNGSTEN_TAG; popd;
    fi
  #
    if [ ! -d tempest ] ; then
      git clone ssh://${GERRIT_NAME}@gerrit.mcp.mirantis.com:29418/packaging/sources/tempest tempest
      pushd tempest ; git checkout $TEMPEST_TAG; popd
    fi
  #
    if [[ "$(echo ${RELEASE_BUILD} | tr [:upper:] [:lower:] )" == "true" ]]; then
      find . -maxdepth 2 -type d -iname .git -not -path '*tempest/.git*' | xargs --no-run-if-empty rm -rf
      find . -maxdepth 2 -type f -iname .gitignore -or -iname .gitreview | xargs --no-run-if-empty rm -v
    fi
  popd
  }

function buildme(){
  echo "=== Installing plugins"
  plugins="tempest-horizon-plugin barbican-tempest-plugin designate-tempest-plugin heat-tempest-plugin ironic-tempest-plugin"
  plugins="${plugins} manila-tempest-plugin telemetry-tempest-plugin octavia-tempest-plugin patrole-tempest-plugin tungsten-tempest-plugin"
  for plugin in ${plugins}; do
    echo "=== Installing plugin: ${plugin}"
    pushd /var/lib/${plugin}
      pip install --constraint /var/lib/openstack_requirements/upper-constraints.txt -r requirements.txt .
    popd
  done
  echo "=== Installing tempest itself"
  pushd /var/lib/tempest/
    pip install .
  popd
  pip install junitxml
  echo "BUILD_TIMESTAMP=$(date '+%Y-%m-%d-%H-%M-%S' -u)" > /etc/build_timestamp
}

############# body ############################################################

case "$1" in

buildme)  echo "Attempt to buildme"
   buildme
   ;;
*) echo "Attempt to prepare.."
   prepare
   ;;
esac
