#!/bin/bash
#
# lib/dib
# Install and build images with **diskimage-builder**

# Dependencies:
#
# - functions
# - DEST, DATA_DIR must be defined

# stack.sh
# ---------
# - install_dib

# Save trace setting
XTRACE=$(set +o | grep xtrace)
set +o xtrace

# Defaults
# --------

# set up default directories
DIB_DIR=$DEST/diskimage-builder
TIE_DIR=$DEST/tripleo-image-elements

# NOTE: Setting DIB_APT_SOURCES assumes you will be building
# Debian/Ubuntu based images. Leave unset for other flavors.
DIB_APT_SOURCES=${DIB_APT_SOURCES:-""}
DIB_BUILD_OFFLINE=$(trueorfalse False DIB_BUILD_OFFLINE)
DIB_IMAGE_CACHE=$DATA_DIR/diskimage-builder/image-create
DIB_PIP_REPO=$DATA_DIR/diskimage-builder/pip-repo
DIB_PIP_REPO_PORT=${DIB_PIP_REPO_PORT:-8899}

OCC_DIR=$DEST/os-collect-config
ORC_DIR=$DEST/os-refresh-config
OAC_DIR=$DEST/os-apply-config

# Include the apt-sources element in builds if we have an
# alternative sources.list specified.
if [ -n "$DIB_APT_SOURCES" ]; then
    if [ ! -e "$DIB_APT_SOURCES" ]; then
        die $LINENO "DIB_APT_SOURCES set but not found at $DIB_APT_SOURCES"
    fi
    EXTRA_ELEMENTS="apt-sources"
fi

# Functions
# ---------

# install_dib() - Collect source and prepare
function install_dib {
    pip_install diskimage-builder

    git_clone $TIE_REPO $TIE_DIR $TIE_BRANCH
    git_clone $OCC_REPO $OCC_DIR $OCC_BRANCH
    git_clone $ORC_REPO $ORC_DIR $ORC_BRANCH
    git_clone $OAC_REPO $OAC_DIR $OAC_BRANCH
    mkdir -p $DIB_IMAGE_CACHE
}

# build_dib_pip_repo() - Builds a local pip repo from local projects
function build_dib_pip_repo {
    local project_dirs=$1
    local projpath proj package

    rm -rf $DIB_PIP_REPO
    mkdir -p $DIB_PIP_REPO

    echo "<html><body>" > $DIB_PIP_REPO/index.html
    for projpath in $project_dirs; do
        proj=$(basename $projpath)
        mkdir -p $DIB_PIP_REPO/$proj
        pushd $projpath
        rm -rf dist
        python setup.py sdist
        pushd dist
        package=$(ls *)
        mv $package $DIB_PIP_REPO/$proj/$package
        popd

        echo "<html><body><a href=\"$package\">$package</a></body></html>" > $DIB_PIP_REPO/$proj/index.html
        echo "<a href=\"$proj\">$proj</a><br/>" >> $DIB_PIP_REPO/index.html

        popd
    done

    echo "</body></html>" >> $DIB_PIP_REPO/index.html

    local dib_pip_repo_apache_conf=$(apache_site_config_for dib_pip_repo)

    sudo cp $FILES/apache-dib-pip-repo.template $dib_pip_repo_apache_conf
    sudo sed -e "
        s|%DIB_PIP_REPO%|$DIB_PIP_REPO|g;
        s|%DIB_PIP_REPO_PORT%|$DIB_PIP_REPO_PORT|g;
        s|%APACHE_NAME%|$APACHE_NAME|g;
    " -i $dib_pip_repo_apache_conf
    enable_apache_site dib_pip_repo
}

# disk_image_create_upload() - Creates and uploads a diskimage-builder built image
function disk_image_create_upload {

    local image_name=$1
    local image_elements=$2
    local elements_path=$3

    local image_path=$TOP_DIR/files/$image_name.qcow2

    # Set the local pip repo as the primary index mirror so the
    # image is built with local packages
    local pypi_mirror_url=http://$SERVICE_HOST:$DIB_PIP_REPO_PORT/
    local pypi_mirror_url_1

    if [ -a $HOME/.pip/pip.conf ]; then
        # Add the current pip.conf index-url as an extra-index-url
        # in the image build
        pypi_mirror_url_1=$(iniget $HOME/.pip/pip.conf global index-url)
    else
        # If no pip.conf, set upstream pypi as an extra mirror
        # (this also sets the .pydistutils.cfg index-url)
        pypi_mirror_url_1=http://pypi.python.org/simple
    fi

    # The disk-image-create command to run
    ELEMENTS_PATH=$elements_path \
    DIB_APT_SOURCES=$DIB_APT_SOURCES \
    DIB_OFFLINE=$DIB_BUILD_OFFLINE \
    PYPI_MIRROR_URL=$pypi_mirror_url \
    PYPI_MIRROR_URL_1=$pypi_mirror_url_1 \
    disk-image-create -a amd64 $image_elements $EXTRA_ELEMENTS \
        --image-cache $DIB_IMAGE_CACHE \
        -o $image_path

    local token=$(keystone token-get | grep ' id ' | get_field 2)
    die_if_not_set $LINENO token "Keystone fail to get token"

    glance --os-auth-token $token --os-image-url http://$GLANCE_HOSTPORT \
        image-create --name $image_name --is-public True \
        --container-format=bare --disk-format qcow2 \
        < $image_path
}

# Restore xtrace
$XTRACE

# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:
