#!/bin/bash
#
# Script name: verify_cross_pod_install.sh
# This script is to verify the installation of Tricircle in cross pod L3 networking.
# It verify both east-west and north-south networks.
#
# In this script, there are some parameters you need to consider before running it.
#
# 1, Post URL whether is 127.0.0.1 or something else,
# 2, This script creates 2 subnets 10.0.1.0/24 and 10.0.2.0/24, Change these if needed.
# 3, This script creates external subnet ext-net 10.50.11.0/26, Change it according to
# your own environment.
# 4, The floating ip attached to the VM with ip 10.0.2.3, created by the script
# "verify_cross_pod_install.sh", modify it according to your own environment.
#
# Change the parameters according to your own environment.
# Finally, execute "verify_cross_pod_install.sh" in the Node1.
#
# Author: Pengfei Shi <shipengfei92@gmail.com>
#

set -o xtrace

TEST_DIR=$(pwd)
echo "Test work directory is $TEST_DIR."

if [ ! -r admin-openrc.sh ];then
    set -o xtrace
    echo "Your work directory doesn't have admin-openrc.sh,"
    echo "Please check whether you are in tricircle/devstack/ or not and run this script."
exit 1
fi

echo "Beginning the verify testing..."

echo "Import client environment variables:"
source $TEST_DIR/admin-openrc.sh

echo "******************************"
echo "*       Verify Endpoint      *"
echo "******************************"

echo "List openstack endpoint:"
openstack --debug endpoint list

token=$(openstack token issue | awk 'NR==5 {print $4}')

echo $token

openstack multiregion networking pod create --region-name RegionOne

openstack multiregion networking pod create --region-name Pod1 --availability-zone az1

openstack multiregion networking pod create --region-name Pod2 --availability-zone az2

echo "******************************"
echo "*         Verify Nova        *"
echo "******************************"

echo "Show nova aggregate:"
nova aggregate-list

neutron net-create --availability-zone-hint az1 net1

neutron net-create --availability-zone-hint az2 net2

echo "Create external network ext-net:"
neutron net-create --router:external --provider:network_type vlan --provider:physical_network extern --availability-zone-hint Pod2 ext-net

echo "Create test flavor:"
nova flavor-create test 1 1024 10 1

echo "******************************"
echo "*       Verify Neutron       *"
echo "******************************"

echo "Create external subnet with floating ips:"
neutron subnet-create --name ext-subnet --disable-dhcp ext-net 10.50.11.0/26  --allocation-pool start=10.50.11.30,end=10.50.11.50 --gateway 10.50.11.1

echo "Create router for subnets:"
neutron router-create router

echo "Set router external gateway:"
neutron router-gateway-set router ext-net

echo "Create net1 in Node1:"
neutron subnet-create net1 10.0.1.0/24

echo "Create net2 in Node2:"
neutron subnet-create net2 10.0.2.0/24

net1_id=$(neutron net-list |grep net1 | awk '{print $2}')
net2_id=$(neutron net-list |grep net2 | awk '{print $2}')
image_id=$(glance image-list |awk 'NR==4 {print $2}')

echo "Boot vm1 in az1:"
nova boot --flavor 1 --image $image_id --nic net-id=$net1_id --availability-zone az1 vm1
echo "Boot vm2 in az2:"
nova boot --flavor 1 --image $image_id --nic net-id=$net2_id --availability-zone az2 vm2

subnet1_id=$(neutron net-list |grep net1 |awk '{print $6}')
subnet2_id=$(neutron net-list |grep net2 |awk '{print $6}')

echo "Add interface of subnet1:"
neutron router-interface-add router $subnet1_id
echo "Add interface of subnet2:"
neutron router-interface-add router $subnet2_id

echo "******************************"
echo "*   Verify VNC connection    *"
echo "******************************"

echo "Get the VNC url of vm1:"
nova --os-region-name Pod1 get-vnc-console vm1 novnc
echo "Get the VNC url of vm2:"
nova --os-region-name Pod2 get-vnc-console vm2 novnc

echo "**************************************"
echo "*       Verify External network      *"
echo "**************************************"

echo "Create floating ip:"
neutron floatingip-create ext-net

echo "Show floating ips:"
neutron floatingip-list

echo "Show neutron ports:"
neutron port-list

floatingip_id=$(neutron floatingip-list | awk 'NR==4 {print $2}')
port_id=$(neutron port-list |grep 10.0.2.3 |awk '{print $2}')

echo "Associate floating ip:"
neutron floatingip-associate $floatingip_id $port_id
