#!/bin/bash

source /var/onap_tests/_test_base
source /var/onap/aai

covered_functions=(
#"install_hadoop" "install_haproxy" "clone_all_aai_repos" "compile_aai_repos" "setup_titan" "start_aai_microservices" "install_hbase" "install_ajsc_aai" "install_model_loader"
"install_hadoop" "install_haproxy" "clone_all_aai_repos" "compile_aai_repos" "setup_titan" "install_hbase"
)

# test_install_hadoop() - Verify that Hadoop is downloaded and started properly
function test_install_hadoop {
    install_hadoop

    asserts_file_exist /opt/hadoop/current/titan-1.0.0-hadoop1/bin/titan.sh
    asserts_java_process Elasticsearch
    asserts_java_process GremlinServer
    asserts_java_process CassandraDaemon
}

# test_install_haproxy() - Verify that HAProxy is installed properly
function test_install_haproxy {
    install_haproxy

    asserts_installed_package haproxy
    asserts_process haproxy
}

# test_clone_all_aai_repos() - Verify that all the AAI Repos are cloned
function test_clone_all_aai_repos {
    clone_repos "aai"

    asserts_file_exist ${src_folders[aai]}/aai-common/pom.xml
    asserts_file_exist ${src_folders[aai]}/aai-config/cookbooks/aai-resources/runlist-aai-resources.json
    asserts_file_exist ${src_folders[aai]}/aai-data/environments/solo.json
    asserts_file_exist ${src_folders[aai]}/aai-service/pom.xml
    asserts_file_exist ${src_folders[aai]}/babel/README.md
    asserts_file_exist ${src_folders[aai]}/champ/pom.xml
    asserts_file_exist ${src_folders[aai]}/data-router/pom.xml
    asserts_file_exist ${src_folders[aai]}/esr-gui/pom.xml
    asserts_file_exist ${src_folders[aai]}/esr-server/pom.xml
    asserts_file_exist ${src_folders[aai]}/gizmo/pom.xml
    asserts_file_exist ${src_folders[aai]}/logging-service/pom.xml
    asserts_file_exist ${src_folders[aai]}/model-loader/pom.xml
    asserts_file_exist ${src_folders[aai]}/resources/pom.xml
    asserts_file_exist ${src_folders[aai]}/rest-client/pom.xml
    asserts_file_exist ${src_folders[aai]}/router-core/pom.xml
    asserts_file_exist ${src_folders[aai]}/search-data-service/pom.xml
    asserts_file_exist ${src_folders[aai]}/sparky-be/pom.xml
    asserts_file_exist ${src_folders[aai]}/sparky-fe/pom.xml
    asserts_file_exist ${src_folders[aai]}/test-config/docker-compose-app.yml
    asserts_file_exist ${src_folders[aai]}/traversal/pom.xml
}

# test_compile_aai_repos() - Verify that all the AAI Repositories complile properly
function test_compile_aai_repos {
    clone_repos "aai"
    compile_aai_repos

    for common in annotations auth core schema utils; do
        asserts_file_exist ${src_folders[aai]}/aai-common/aai-$common/target/aai-$common-1.1.0-SNAPSHOT.jar
    done

    for service in common-logging eelf-logging logging-api; do
        asserts_file_exist ${src_folders[aai]}/logging-service/$service/target/$service-1.1.0-SNAPSHOT.jar
    done

    asserts_file_exist ${src_folders[aai]}/resources/aai-resources/target/aai-resources.jar
    asserts_file_exist ${src_folders[aai]}/traversal/aai-traversal/target/traversal.jar
}

# test_setup_titan() - Verify that Titan Cassandra DB is up and running
function test_setup_titan {
    clone_repos "aai"
    install_hadoop
    setup_titan

    # TODO(electrocucaracha): Validate the DB creation
}

# test_start_aai_microservices() - Verify that AAI Resources and Traversal images works
function test_start_aai_microservices {
    clone_repos "aai"
    start_aai_microservices

    # TODO(electrocucaracha): Investigate how to run AAI microservices in background
}

# test_install_hbase() - Verify that AAI HBase service is up and running properly
function test_install_hbase {
    install_hbase

    asserts_image_running aai-hbase-${hbase_version}
}

if [ "$1" != '*' ]; then
    unset covered_functions
    covered_functions=$1
fi
main "${covered_functions[@]}"
