#!/bin/bash

set -x

source {{ overcloudrc }}

server_user_name={{ server_user_name }}
flavor_name={{ flavor_name }}
image_name={{ image_name }}

openstack image show $image_name
if [ "$?" != "0" ]
then
    if [ ! -f cirros-0.5.2-x86_64-disk.img ]
    then
        curl -Lo cirros-0.5.2-x86_64-disk.img https://github.com/cirros-dev/cirros/releases/download/0.5.2/cirros-0.5.2-x86_64-disk.img
    fi

    openstack image create "cirros-ovn-migration-{{ resource_suffix }}"  --file cirros-0.5.2-x86_64-disk.img \
--disk-format qcow2 --container-format bare --public
    image_name="cirros-ovn-migration-{{ resource_suffix }}"
fi

openstack flavor show $flavor_name
if [ "$?" != "0" ]
then
    openstack flavor create ovn-migration-{{ resource_suffix }} --ram 1024 --disk 1 --vcpus 1
    flavor_name="ovn-migration-{{ resource_suffix }}"
fi

# Cirros doesn't support RSA key (Default on rhel 9) ecsda should be used
ssh-keygen -t ecdsa {{ ovn_migration_temp_dir }}/ovn_migration_ssh_key -q -N ""

openstack keypair create ovn-migration-{{ resource_suffix }} --public-key {{ ovn_migration_temp_dir }}/ovn_migration_ssh_key.pub

openstack security group create ovn-migration-sg-{{ resource_suffix }}

openstack security group rule create --ingress --protocol icmp ovn-migration-sg-{{ resource_suffix }}

openstack security group rule create --ingress --protocol tcp --dst-port 22  ovn-migration-sg-{{ resource_suffix }}

openstack network create ovn-migration-net-{{ resource_suffix }}

neutron net-update ovn-migration-net-{{ resource_suffix }} --mtu 1442

openstack subnet create  --network ovn-migration-net-{{ resource_suffix }}  --subnet-range 172.168.199.0/24 ovn-migration-subnet-{{ resource_suffix }}

openstack router create ovn-migration-router-{{ resource_suffix }}

openstack router set --external-gateway {{ public_network_name }} ovn-migration-router-{{ resource_suffix }}

openstack router add subnet ovn-migration-router-{{ resource_suffix }} ovn-migration-subnet-{{ resource_suffix }}

openstack port create --network ovn-migration-net-{{ resource_suffix }} --security-group ovn-migration-sg-{{ resource_suffix }} ovn-migration-server-port-{{ resource_suffix }}

openstack server create --flavor $flavor_name --image $image_name \
--key-name ovn-migration-{{ resource_suffix }} \
--nic port-id=ovn-migration-server-port-{{ resource_suffix }} ovn-migration-server-{{ resource_suffix }}

server_ip=`openstack floating ip create --port ovn-migration-server-port-{{ resource_suffix }} \
{{ public_network_name }} -c floating_ip_address | grep floating_ip_address \
| awk '{print $4'}`

echo $server_ip > {{ ovn_migration_temp_dir }}/server_public_ip

chmod 0600 {{ ovn_migration_temp_dir }}/ovn_migration_ssh_key

# Wait till the port is ACTIVE

echo "Wait till the port is ACTIVE"
port_status=`openstack port show ovn-migration-server-port-{{ resource_suffix }} -c status | grep status | awk '{print $4}'`

num_attempts=0
while [ "$port_status" != "ACTIVE" ]
do
    num_attempts=$((num_attempts+1))
    sleep 5
    port_status=`openstack port show ovn-migration-server-port-{{ resource_suffix }} -c status | grep status | awk '{print $4}'`
    echo "Port status = $port_status"

    if [ $num_attempts -gt 24 ]
    then
        echo "Port is not up even after 2 minutes. Something is wrong"
        # printing port information for debugging
        openstack port show ovn-migration-server-port-{{ resource_suffix }}
        exit 1
    fi
done

echo "VM is up and the port is ACTIVE"

# Wait till the VM allows ssh connections

vm_status="down"
num_attempts=0
while [ "$vm_status" != "up" ]
do
    num_attempts=$((num_attempts+1))
    sleep 5
    openstack console log show ovn-migration-server-{{ resource_suffix }} | grep "login:"
    if [ "$?" == "0" ]
    then
        vm_status="up"
    else
        if [ $num_attempts -gt 60 ]
        then
            echo "Port is not up even after 5 minutes. Something is wrong."
            # Even though something seems wrong, lets try and ping.
            break
        fi
    fi
done

num_attempts=0
vm_reachable="false"
while [ "$vm_reachable" != "true" ]
do
    num_attempts=$((num_attempts+1))
    sleep 1
    ping -c 3 $server_ip
    if [ "$?" == "0" ]
    then
        vm_reachable="true"
    else
        if [ $num_attempts -gt 60 ]
        then
            echo "VM is not reachable. Something is wrong."
            # printing server information for debugging
            server_id=$(openstack server list -f value | grep $server_ip | awk '{print $1}')
            openstack console log show $server_id
            exit 1
        fi
    fi
done

ssh -i {{ ovn_migration_temp_dir }}/ovn_migration_ssh_key -o StrictHostKeyChecking=no \
-o UserKnownHostsFile=/dev/null  $server_user_name@$server_ip date

rc=$?

echo "Done with the resource creation : exiting with $rc"
# printing server information for debugging
[ "$rc" != "0" ] && openstack console log show $(openstack server list -f value | grep $server_ip | awk '{print $1}')
exit $rc
