#!/bin/bash

set -o xtrace

source /var/onap/functions

src_folder=$git_src_folder/vfc
vfc_repos=("gvnfm/vnflcm" "gvnfm/vnfmgr" "gvnfm/vnfres" "nfvo/catalog" "nfvo/driver/ems" "nfvo/driver/sfc" \
            "nfvo/driver/vnfm/gvnfm" "nfvo/driver/vnfm/svnfm" "nfvo/lcm" "nfvo/resmanagement" "nfvo/wfengine")

# clone_all_vfc_repos() - Function that clones VF-C source repo.
function clone_all_vfc_repos {
    for dirc in ${vfc_repos[@]}; do
        clone_repo vfc/$dirc $src_folder/$dirc
    done
}

# compile_all_vfc_repos() - Function that compiles VF-C source repo.
function compile_all_vfc_repos {
    install_python_package tox

    pushd $src_folder/gvnfm/vnflcm/lcm
    tox -e py27
    popd


    pushd $src_folder/nfvo/lcm
    tox -e py27
    popd

    # TODO(sshank): Add compile for other vfc_repos. (Both Java and Python based.)
    # Python based:
    # gvnfm/vnflcm/lcm
    # gvnfm/vnfmgr/mgr
    # gvnfm/vnfres/res
    # nfvo/driver/vnfm/gvnfm/gvnfmadapter
    # nfvo/driver/vnfm/svnfm/zte/vmanager

    # Java based:
    # nfvo/catalog
    # nfvo/driver/ems/ems/sems/boco/ems-driver
    # nfvo/driver/sfc/zte/sfc-driver
    # nfvo/driver/vnfm/gvnfm/juju/juju-vnfmadapter
    # nfvo/driver/vnfm/svnfm/huawei/vnfmadapter
    # nfvo/resmanagement
    # nfvo/wfengine
}

# build_nfvo_lcm_image() - Build VFC NFVO LCM docker image
function build_nfvo_lcm_image {
    pushd $src_folder/nfvo/lcm/docker
    sed -i '$ d' build_image.sh
    ./build_image.sh
    popd
}

# get_vfc_images() - Build VFC docker images
function get_vfc_images {
    if [[ "$build_image" == "True" ]]; then
        install_docker
        build_nfvo_lcm_image
        # TODO(sshank): Add other VFC component docker image builds when they are ready.
    else
        pull_docker_image nexus3.onap.org:10003/onap/vfc/nslcm latest
    fi
}

# run_vfc_images() - Run VFC docker images
function run_vfc_images() {
    docker run -d --name vfc-nslcm -p 3306:3306 -p 8403:8403 -e MSB_ADDR=127.0.0.1 nexus3.onap.org:10003/onap/vfc/nslcm
    # TODO(sshank): Run other VFC component docker images when they are ready.
}

# install_vfc() - Download and install vfc service from source code
function install_vfc {
    run_vfc_images
}

# init_vfc() - Function that initialize VF-C services
function init_vfc {
    install_package libmysqlclient-dev

    if [[ "$clone_repo" == "True" ]]; then
        clone_all_vfc_repos
        if [[ "$compile_repo" == "False" ]]; then
            compile_all_vfc_repos
        fi
    fi

    get_vfc_images
    install_vfc
}
