#!/bin/bash

##
# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
# This file is part of openmano
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##

#This script is a basic test for openmano, that deals with two openvim
#stopping on an error
#WARNING: It destroy the database content


function usage(){
    echo -e "usage: ${BASH_SOURCE[0]} [-f]\n  Deletes openvim/openmano content and make automatically the wiki steps"
    echo -e "  at 'https://github.com/nfvlabs/openmano/wiki/Getting-started#how-to-use-it'"
    echo -e "  OPTIONS:"
    echo -e "    -f --force : does not prompt for confirmation"
    echo -e "    -h --help  : shows this help"
}

function is_valid_uuid(){
    echo "$1" | grep -q -E '^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$' && return 0
    return 1
}


#detect if is called with a source to use the 'exit'/'return' command for exiting
[[ ${BASH_SOURCE[0]} != $0 ]] && _exit="return" || _exit="exit"

#check correct arguments
[[ -n $1 ]] && [[ $1 != -h ]] && [[ $1 != --help ]] && [[ $1 != -f ]] && [[ $1 != --force ]] && \
   echo "invalid argument '$1'?" &&  usage >&2 && $_exit 1
[[ $1 == -h ]] || [[ $1 == --help ]]  && usage && $_exit 0

#ask for confirmation if argument is not -f --force
force=""
[[ $1 == -f ]] || [[ $1 == --force ]] && force=y
[[ $force != y ]] && read -e -p "WARNING: openmano and openvim database content will be lost!!!  Continue(y/N)" force
[[ $force != y ]] && [[ $force != yes ]] && echo "aborted!" && $_exit

DIRNAME=$(dirname $(readlink -f ${BASH_SOURCE[0]}))
DIR_BASE=$(dirname $DIRNAME)
DIR_BASE=$(dirname $DIR_BASE)
DIRvim=$DIR_BASE/openvim
DIRmano=$DIR_BASE/openmano
DIRscripts=$DIR_BASE/scripts

echo "deleting deployed vm"
openvim vm-delete -f | grep -q deleted && sleep 10 #give some time to get virtual machines deleted

echo "Stopping openmano"
$DIRscripts/service-openmano stop

echo "Initializing databases"
$DIRvim/database_utils/init_vim_db.sh -u vim -p vimpw
$DIRmano/database_utils/init_mano_db.sh -u mano -p manopw

echo "Starting openmano"
$DIRscripts/service-openmano start

echo "Creating openmano tenant 'mytenant'"
nfvotenant=`openmano tenant-create mytenant --description=mytenant |gawk '{print $1}'`
#check a valid uuid is obtained
is_valid_uuid $nfvotenant || ! echo "fail" >&2 || $_exit 1 
export OPENMANO_TENANT=$nfvotenant
echo "  $nfvotenant"

echo "Adding example hosts"
openvim host-add $DIRvim/test/hosts/host-example0.json || ! echo "fail" >&2 || $_exit 1
openvim host-add $DIRvim/test/hosts/host-example1.json || ! echo "fail" >&2 || $_exit 1
openvim host-add $DIRvim/test/hosts/host-example2.json || ! echo "fail" >&2 || $_exit 1
openvim host-add $DIRvim/test/hosts/host-example3.json || ! echo "fail" >&2 || $_exit 1
echo "Adding example nets"
openvim net-create $DIRvim/test/networks/net-example0.yaml || ! echo "fail" >&2 || $_exit 1
openvim net-create $DIRvim/test/networks/net-example1.yaml || ! echo "fail" >&2 || $_exit 1
openvim net-create $DIRvim/test/networks/net-example2.yaml || ! echo "fail" >&2 || $_exit 1
openvim net-create $DIRvim/test/networks/net-example3.yaml || ! echo "fail" >&2 || $_exit 1

echo "Creating openvim tenant 'admin'"
vimtenant=`openvim tenant-create '{"tenant": {"name":"admin", "description":"admin"}}' |gawk '{print $1}'`
#check a valid uuid is obtained
is_valid_uuid $vimtenant || ! echo "fail" >&2 || $_exit 1
echo "  $vimtenant"
OPENVIM_TENANT_1=$vimtenant && export OPENVIM_TENANT=$vimtenant

echo "Creating datacenter 'mydc1' in openmano"
datacenter=`openmano datacenter-create mydc1 http://localhost:9080/openvim |gawk '{print $1}'`
#check a valid uuid is obtained
is_valid_uuid $datacenter || ! echo "fail" >&2 || $_exit 1 
echo "  $datacenter"
OPENMANO_DATACENTER_1=$datacenter && export OPENMANO_DATACENTER=$datacenter

echo "Attaching openmano tenant to the datacenter and the openvim tenant"
openmano datacenter-attach mydc1 --vim-tenant-id $vimtenant || ! echo "fail" >&2 || $_exit 1 

echo "Updating external nets in openmano"
openmano datacenter-net-update -f mydc1 || ! echo "fail" >&2 || $_exit 1

echo "Creating a second fake datacenter 'mydc2' in openmano"
datacenter2=`openmano datacenter-create mydc2 http://localhost:9082/openvim |gawk '{print $1}'`
#check a valid uuid is obtained
is_valid_uuid $datacenter || ! echo "fail" >&2 || $_exit 1 
echo "  $datacenter2"
OPENMANO_DATACENTER_2=$datacenter2
echo "Attaching a second fake openvim 'mydc2'"
openmano datacenter-attach mydc2 --vim-tenant-id $vimtenant || ! echo "fail" >&2 || $_exit 1

echo "Creating VNFs, must fail in second openvim"
openmano vnf-create $DIRmano/vnfs/examples/linux.yaml         || ! echo "fail" >&2 || $_exit 1
openmano vnf-create $DIRmano/vnfs/examples/dataplaneVNF1.yaml || ! echo "fail" >&2 || $_exit 1
openmano vnf-create $DIRmano/vnfs/examples/dataplaneVNF2.yaml || ! echo "fail" >&2 || $_exit 1

echo "Checking images and flavors created at openvim"
nb=`openvim image-list | wc -l`
echo -n " $nb images "
[[ $nb -eq 3 ]] || ! echo "fail" >&2 || $_exit 1
echo " $nb flavors "
[[ $nb -eq 3 ]] || ! echo "fail" >&2 || $_exit 1

echo "Creating Scenarios"
openmano scenario-create $DIRmano/scenarios/examples/simple.yaml  || ! echo "fail" >&2 || $_exit 1
openmano scenario-create $DIRmano/scenarios/examples/complex.yaml || ! echo "fail" >&2 || $_exit 1

echo "Deleting openvim images and flavors to force reload again"
openvim image-delete -f
openvim flavor-delete -f

echo "Launching scenarios"
openmano scenario-deploy simple simple-instance   || ! echo "fail" >&2 || $_exit 1
openmano scenario-deploy complex complex-instance || ! echo "fail" >&2 || $_exit 1

echo "Checking that openvim has 5 VM running"
nb=`openvim vm-list | wc -l`
[[ $nb -eq 5 ]] || ! echo "fail" >&2 || $_exit 1
while openvim vm-list | grep -q CREATING ; do sleep 1; done
openvim vm-list | grep -v -q ERROR || ! echo "fail: VM with error" >&2 || $_exit 1

echo "Removing scenarios"
for scenario in `openmano instance-scenario-list  | awk '{print $2}'`
do
  openmano instance-scenario-delete -f $scenario
done

echo "Editing datacenters so that Changing openvim Working with the second openvim"
openmano datacenter-edit -f mydc1 'vim_url: http://localhost:9083/openvim'
openmano datacenter-edit -f mydc2 'vim_url: http://localhost:9080/openvim'
export OPENMANO_DATACENTER=$OPENMANO_DATACENTER_2

echo "Updating external nets in openmano for second datacenter"
openmano datacenter-net-update -f mydc2 || ! echo "fail" >&2 || $_exit 1

echo "Launching Scenario instances"
openmano scenario-deploy simple simple-instance   || ! echo "fail" >&2 || $_exit 1
openmano scenario-deploy complex complex-instance || ! echo "fail" >&2 || $_exit 1

echo "Checking images and flavors created at openvim"
nb=`openvim image-list | wc -l`
echo -n " $nb images "
[[ $nb -eq 3 ]] || ! echo "fail" >&2 || $_exit 1
echo " $nb flavors "
[[ $nb -eq 3 ]] || ! echo "fail" >&2 || $_exit 1

echo "Checking that openvim has 5 VM running"
nb=`openvim vm-list | wc -l`
[[ $nb -eq 5 ]] || ! echo "fail" >&2 || $_exit 1
while openvim vm-list | grep -q CREATING ; do sleep 1; done
openvim vm-list | grep -v -q ERROR || ! echo "fail: VM with error" >&2 || $_exit 1


echo
echo DONE
#echo "Listing VNFs"
#openmano vnf-list
#echo "Listing scenarios"
#openmano scenario-list
#echo "Listing scenario instances"
#openmano instance-scenario-list


