#!/bin/bash

source /var/onap/functions

multicloud_src_folder=$git_src_folder/multicloud
multicloud_repos=("multicloud" "multicloud/framework" "multicloud/openstack" \
"multicloud/openstack/vmware" "multicloud/openstack/windriver" \
"multicloud/azure")
openstack_release="newton"

# clone_multicloud_repos() - Function that clones the Multi Cloud repositories
function clone_multicloud_repos {
    for repo in ${multicloud_repos[@]}; do
        clone_repo $repo $multicloud_src_folder${repo#*multicloud}
    done
}

# compile_multicloud_repos() - 
function compile_multicloud_repos {
    for repo in ${multicloud_repos[@]}; do
        compile_src $multicloud_src_folder${repo#*multicloud}
    done
}

function _build_images {
    install_docker
    install_python_requirements $multicloud_src_folder/openstack/$openstack_release
    pushd $multicloud_src_folder/openstack/$openstack_release
    bash build_image.sh
    popd
}

# get_multicloud_images() -
function get_multicloud_images {
    if [[ "$build_image" == "True" ]]; then
        _build_images
    else
        pull_onap_image multicloud/openstack-$openstack_release
    fi
}

# install_multicloud() - 
function install_multicloud {
    pushd $multicloud_src_folder/openstack/$openstack_release
    /opt/docker/docker-compose up -d
    popd
}

# init_multicloud() - Function that initialize Multi Cloud services
function init_multicloud {
    if [[ "$clone_repo" == "True" ]]; then
        clone_multicloud_repos
        if [[ "$compile_repo" == "True" ]]; then
            compile_multicloud_repos
        fi
    fi
    if [[ "$skip_get_images" == "False" ]]; then
        get_multicloud_images
        if [[ "$skip_install" == "False" ]]; then
            install_multicloud
        fi
    fi
}
