#!/usr/bin/env bash
# Copyright 2018, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

export OPTS=()
export ANSIBLE_EMBED_HOME="${HOME}/ansible25"
OPTS+=('ANSIBLE_EMBED_HOME')

source /etc/os-release
if [[ ! -e "${ANSIBLE_EMBED_HOME}/bin/ansible" ]]; then
  if [  ${VERSION_ID} = "14.04" ]; then
    apt-get update
    apt-get -y install python-virtualenv
    echo "done installing python-virtualenv"
  else
    apt-get update
    apt-get -y install python3-virtualenv python-virtualenv
    echo "done installing python-virtualenv python3-virtualenv"
  fi

  if [[ -e "${HOME}/.pip" ]]; then
    echo "..................moving .pip out of place to boostrap"
    mv ${HOME}/.pip ${HOME}/.off-pip
  fi

  if [[ -f "/usr/bin/python2" ]]; then
    virtualenv --python="/usr/bin/python2" "${ANSIBLE_EMBED_HOME}"
  elif [[ -f "/usr/bin/python3" ]]; then
    virtualenv --python="/usr/bin/python3" "${ANSIBLE_EMBED_HOME}"
  else
    virtualenv "${ANSIBLE_EMBED_HOME}"
  fi

  eval "${ANSIBLE_EMBED_HOME}/bin/pip install --upgrade --force pip"
  eval "${ANSIBLE_EMBED_HOME}/bin/pip install --upgrade ansible==2.5.5.0 --isolated"
  eval "${ANSIBLE_EMBED_HOME}/bin/pip install --upgrade jmespath --isolated"
  echo "Ansible can be found here: ${ANSIBLE_EMBED_HOME}/bin"

  if [[ -e "${HOME}/.off-pip" ]]; then
    mv ${HOME}/off-pip ${HOME}/.pip
    echo "..................moving .pip back in to place"
  fi
fi

if [[ ! -d "${ANSIBLE_EMBED_HOME}/repositories/ansible-config_template" ]]; then
  mkdir -p "${ANSIBLE_EMBED_HOME}/repositories"
  git clone https://git.openstack.org/openstack/ansible-config_template "${ANSIBLE_EMBED_HOME}/repositories/ansible-config_template"
  pushd "${ANSIBLE_EMBED_HOME}/repositories/ansible-config_template"
    git checkout a5c9d97e18683f0fdf9769d94ba174c72e2d093c  # HEAD of master from 20-06-18
  popd
fi

if [[ ! -d "${ANSIBLE_EMBED_HOME}/repositories/openstack_ansible_plugins" ]]; then
  mkdir -p "${ANSIBLE_EMBED_HOME}/repositories"
  git clone https://git.openstack.org/openstack/openstack-ansible-plugins "${ANSIBLE_EMBED_HOME}/repositories/openstack-ansible-plugins"
  pushd "${ANSIBLE_EMBED_HOME}/repositories/openstack-ansible-plugins"
    git checkout cef7946b3b3b3e4d02406c228741985a94b72cff  # HEAD of master from 20-06-18
  popd
fi

if [[ ! -d "${ANSIBLE_EMBED_HOME}/repositories/roles/systemd_service" ]]; then
  mkdir -p "${ANSIBLE_EMBED_HOME}/repositories"
  git clone https://git.openstack.org/openstack/ansible-role-systemd_service "${ANSIBLE_EMBED_HOME}/repositories/roles/systemd_service"
  pushd "${ANSIBLE_EMBED_HOME}/repositories/roles/systemd_service"
    git checkout 02f5ff1c0e073af53bed2141a045e608162970ea  # HEAD of master from 20-06-18
  popd
fi

if [[ -f "/etc/openstack_deploy/openstack_inventory.json" ]]; then
  if [[ ! -f "${ANSIBLE_EMBED_HOME}/inventory/openstack_inventory.sh" ]]; then
    mkdir -p "${ANSIBLE_EMBED_HOME}/inventory"
    cat > "${ANSIBLE_EMBED_HOME}/inventory/openstack_inventory.sh" <<EOF
#!/usr/bin/env bash
cat /etc/openstack_deploy/openstack_inventory.json
EOF
    chmod +x "${ANSIBLE_EMBED_HOME}/inventory/openstack_inventory.sh"
  fi

  export USER_VARS="$(for i in $(ls -1 /etc/openstack_deploy/user_*secret*.yml); do echo -n "-e@$i "; done)"
  OPTS+=('USER_VARS')
  echo "env USER_VARS set"
  echo "Extra users variables can be expanded by including the option \$USER_VARS on a playbook run."

  export ANSIBLE_INVENTORY="${ANSIBLE_EMBED_HOME}/inventory/openstack_inventory.sh"
  OPTS+=('ANSIBLE_INVENTORY')
  echo "env ANSIBLE_INVENTORY set"
fi

export ANSIBLE_HOST_KEY_CHECKING="False"
OPTS+=('ANSIBLE_HOST_KEY_CHECKING')
echo "env ANSIBLE_HOST_KEY_CHECKING set"

export ANSIBLE_ROLES_PATH="${ANSIBLE_EMBED_HOME}/repositories/roles"
OPTS+=('ANSIBLE_ROLES_PATH')
echo "env ANSIBLE_ROLES_PATH set"

export ANSIBLE_ACTION_PLUGINS="${ANSIBLE_EMBED_HOME}/repositories/ansible-config_template/action"
OPTS+=('ANSIBLE_ACTION_PLUGINS')
echo "env ANSIBLE_ACTION_PLUGINS set"

export ANSIBLE_CONNECTION_PLUGINS="${ANSIBLE_EMBED_HOME}/repositories/openstack-ansible-plugins/connection/"
OPTS+=('ANSIBLE_CONNECTION_PLUGINS')
echo "env ANSIBLE_CONNECTION_PLUGINS set"

source ${ANSIBLE_EMBED_HOME}/bin/activate
echo "Embedded Ansible has been activated. Run 'deactivate' to leave the embedded environment".

function deactivate_embedded_venv {
  deactivate
  for i in ${OPTS[@]}; do
    unset ${i}
  done
  unset deactivate_embedded_venv
  unalias deactivate
}


alias deactivate=deactivate_embedded_venv