# 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
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

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

# install_dib() - Collect source and prepare
function install_dib {
    git_clone $DIB_REPO $DIB_DIR $DIB_BRANCH
    pushd $DIB_DIR
    pip_install ./
    popd

    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 \
    PYPI_MIRROR_URL=$pypi_mirror_url \
    PYPI_MIRROR_URL_1=$pypi_mirror_url_1 \
    disk-image-create -a amd64 $image_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:
