#!/bin/bash

set -o xtrace
set -o errexit
set -o pipefail

# Enable unbuffered output for Ansible in Jenkins.
export PYTHONUNBUFFERED=1

function deploy_tenks_logged {
    . /etc/kolla/admin-openrc.sh

    echo "Creating IPA images for Ironic"
    ~/openstackclient-venv/bin/openstack image create --disk-format aki --container-format aki --private \
        --file /etc/kolla/config/ironic/ironic-agent.kernel ipa.vmlinuz
    ~/openstackclient-venv/bin/openstack image create --disk-format ari --container-format ari --private \
        --file /etc/kolla/config/ironic/ironic-agent.initramfs ipa.initramfs

    # Install a trivial script for ovs-vsctl that talks to containerised Open
    # vSwitch.
    sudo tee /usr/bin/ovs-vsctl >/dev/null <<EOF
#!/usr/bin/env bash

# Script installed onto the host to fool tenks into using the containerised
# Open vSwitch rather than installing its own.

sudo docker exec openvswitch_vswitchd ovs-vsctl "\$@"
EOF
    sudo chmod 755 /usr/bin/ovs-vsctl

    # Install the Tenks venv.
    python3 -m venv ${TENKS_VENV_PATH}
    ${TENKS_VENV_PATH}/bin/pip install -U pip
    ${TENKS_VENV_PATH}/bin/pip install ${TENKS_SRC_PATH}

    local attempt
    attempt=1
    while ! ${TENKS_VENV_PATH}/bin/ansible-galaxy install \
            --role-file="${TENKS_SRC_PATH}/requirements.yml" \
            --roles-path="${TENKS_SRC_PATH}/ansible/roles/"; do
        echo "ansible-galaxy install failed, attempt $attempt"
        attempt=$((attempt+1))
        if [[ $attempt -eq 10 ]]; then
            echo "enough retrying, farewell"
            return 1
        fi
        sleep 10
    done

    # Run Tenks.
    ${TENKS_VENV_PATH}/bin/ansible-playbook \
        -vvv \
        --inventory "${TENKS_SRC_PATH}/ansible/inventory" \
        --extra-vars=@"$HOME/tenks.yml" \
        "${TENKS_SRC_PATH}/ansible/deploy.yml"
}

function deploy_tenks {
    echo "Configuring virtual bare metal via Tenks"
    deploy_tenks_logged > /tmp/logs/ansible/deploy-tenks 2>&1
    result=$?
    if [[ $result != 0 ]]; then
        echo "Deploying tenks failed. See ansible/deploy-tenks for details"
    else
        echo "Successfully deployed tenks. See ansible/deploy-tenks for details"
    fi
    return $result
}

deploy_tenks