#!/bin/bash
NEW_BASE="$BASE/new"
DISKIMAGE_CREATE_DIR=$NEW_BASE/group-based-policy/gbpservice/contrib/nfp/tools/image_builder/

function prepare_nfp_image_builder {
    #setup_develop $NFPSERVICE_DIR
    sudo -H -E pip install -r $DISKIMAGE_CREATE_DIR/requirements.txt
    sudo apt-get install -y --force-yes qemu-utils
}

function create_nfp_image {
    TOP_DIR=$1
    sudo python -c\
 'from gbpservice.contrib.nfp.tools.image_builder import disk_image_create as DIB;\
 DIB.cur_dir = "'$DISKIMAGE_CREATE_DIR'";\
 DIB.conf["ubuntu_release"] = {"release": "wily"};\
 DIB.conf["dib"] = {"image_size": 3, "elements": ["nfp-reference-configurator", "dhcp-all-interfaces", "devuser"], "offline": True, "cache_dir": "'$HOME'/.cache/image-create"};\
 DIB.dib()'
    BUILT_IMAGE_PATH=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path)
    upload_image file://$BUILT_IMAGE_PATH

    openstack --os-cloud=devstack-admin flavor create --ram 512 --disk 3 --vcpus 1 m1.nfp-tiny
}

function assign_user_role_credential {
    TOP_DIR=$1
    source $TOP_DIR/openrc admin admin
    #set -x
    serviceTenantID=`keystone tenant-list | grep "service" | awk '{print $2}'`
    serviceRoleID=`keystone role-list | grep "service" | awk '{print $2}'`
    adminRoleID=`keystone role-list | grep "admin" | awk '{print $2}'`
    keystone user-role-add --user nova --tenant $serviceTenantID --role $serviceRoleID
    keystone user-role-add --user neutron --tenant $serviceTenantID --role $adminRoleID
}

function namespace_delete {
    TOP_DIR=$1
    source $TOP_DIR/openrc neutron service
    #Deletion namespace
    NFP_P=`sudo ip netns | grep "nfp-proxy"`
    if [ ${#NFP_P} -ne 0 ]; then
        sudo ip netns delete nfp-proxy
        echo "namespace removed"
    fi

    #Delete veth peer
    PEER=`ip a | grep pt1`
    if [ ${#PEER} -ne 0 ]; then
        echo "veth peer removed"
        sudo ip link delete pt1
    fi

    #pt1 port removing from ovs
    PORT=`sudo ovs-vsctl show | grep "pt1"`
    if [ ${#PORT} -ne 0 ]; then
        sudo ovs-vsctl del-port br-int pt1
        echo "ovs port ptr1 is removed"
    fi

    echo "nfp-proxy cleaning success.... "
}

function namespace_create {
    TOP_DIR=$1
    #doing it in namespace_delete, so no need to do it again
    #source $1/openrc neutron service
    SERVICE_MGMT_NET="l2p_svc_management_ptg"
    cidr="/24"
    echo "Creating new namespace nfp-proxy...."

    #new namespace with name proxy
    NFP_P=`sudo ip netns add nfp-proxy`
    if [ ${#NFP_P} -eq 0 ]; then
        echo "New namepace nfp-proxt create"
    else
        echo "nfp-proxy creation failed"
        exit 0
    fi

    #Create veth peer
    PEER=`sudo ip link add pt0 type veth peer name pt1`
    if [ ${#PEER} -eq 0 ]; then
        echo "New veth pair created"
    else
        echo "veth pair creation failed"
        exit 0
    fi
    sleep 1

    #move one side of veth into namesape
    sudo ip link set pt0 netns nfp-proxy

    #create new neutron port in service mgmt network
    new_ip=`neutron port-create --name nfp-proxy_port $SERVICE_MGMT_NET | grep "fixed_ips" | awk '{print $7}' | sed 's/^\"\(.*\)\"}$/\1/'`
    if [ ${#new_ip} -lt 5 ]; then
        echo "new_ip =$new_ip"
        echo "Neutron port creation failed (check source) "
        exit 0
    else
        echo "New Neutron Port Created on Service management network with ip =$new_ip"
    fi
    new_ip_cidr+="$new_ip/24"
    sleep 2

    #get the ip address of new port eg : 11.0.0.6 and asign to namespace
    sudo ip netns exec nfp-proxy ip addr add $new_ip_cidr dev pt0

    #move other side of veth into ovs : br-int
    sudo ovs-vsctl add-port br-int pt1

    #get id of service management network
    smn_id=`neutron net-list | grep "$SERVICE_MGMT_NET" | awk '{print $2}'`

    #get the dhcp namespace of service management network
    nm_space=`sudo ip netns | grep "$smn_id"`

    #get port id from router nampace
    port=`sudo ip netns exec $nm_space ip a | grep "tap" | tail -n 1 | awk '{print $7}'`

    #get tag_id  form port in ovs-bridge
    tag_id=`sudo ovs-vsctl list port $port | grep "tag" | tail -n 1 | awk '{print $3}'`

    sudo ovs-vsctl set port pt1 tag=$tag_id

    #up the both ports
    sudo ip netns exec nfp-proxy ip link set pt0 up
    sudo ip netns exec nfp-proxy ip link set lo up
    sudo ip link set pt1 up

    PING=`sudo ip netns exec nfp-proxy ping $2 -q -c 2 > /dev/null`
    if [ ${#PING} -eq 0 ]
    then
        echo "nfp-proxy namespcace creation success and reaching to $2"
    else
        echo "Fails reaching to $2"
    fi

    sudo ip netns exec nfp-proxy /usr/bin/nfp_proxy --config-file=/etc/nfp_proxy.ini
}

function create_nfp_gbp_resources {
   TOP_DIR=$1
   source $TOP_DIR/openrc neutron service
   IMAGE_PATH=$(cat $DISKIMAGE_CREATE_DIR/output/last_built_image_path)
   IMAGE_NAME=`basename "$IMAGE_PATH"`
   IMAGE_NAME_FLAT="${IMAGE_NAME%.*}"
   FLAVOR=m1.nfp-tiny

   gbp network-service-policy-create --network-service-params type=ip_pool,name=vip_ip,value=nat_pool svc_mgmt_fip_policy
   gbp service-profile-create --servicetype LOADBALANCER --insertion-mode l3 --shared True --service-flavor service_vendor=haproxy,device_type=None --vendor NFP base_mode_lb
   gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=vyos,device_type=None --vendor NFP base_mode_fw
   gbp service-profile-create --servicetype FIREWALL --insertion-mode l3 --shared True --service-flavor service_vendor=nfp,device_type=nova,image_name=$IMAGE_NAME_FLAT,flavor=$FLAVOR --vendor NFP base_mode_fw_vm
   gbp group-create svc_management_ptg --service_management True
}

function delete_nfp_gbp_resources {
   TOP_DIR=$1
   source $TOP_DIR/openrc neutron service
 
   neutron port-delete nfp-proxy_port

   gbp ptg-show svc_management_ptg -f value -c policy_targets
   gbp ptg-show svc_management_ptg -f value -c policy_targets | xargs -I {} gbp pt-show {}
   nova list

   gbp group-delete svc_management_ptg
   gbp service-profile-delete base_mode_fw_vm
   gbp service-profile-delete base_mode_fw
   gbp service-profile-delete base_mode_lb
   gbp network-service-policy-delete svc_mgmt_fip_policy
}

function get_router_namespace {
    TOP_DIR=$1
    source $TOP_DIR/openrc neutron service

    GROUP="svc_management_ptg"
    echo "GroupName: $GROUP"

    l2p_id=`gbp ptg-show svc_management_ptg | grep l2_policy_id | awk '{print $4}'`
    l3p_id=`gbp l2p-show $l2p_id | grep l3_policy_id | awk '{print $4}'`
    RouterId=`gbp l3p-show $l3p_id | grep routers | awk '{print $4}'`
}

function copy_nfp_files_and_start_process {
    TOP_DIR=$1
    cd $NEW_BASE/group-based-policy/gbpservice/nfp
    sudo cp -r  bin/nfp /usr/bin/
    sudo chmod +x /usr/bin/nfp
    sudo rm -rf /etc/nfp_*
    sudo cp -r  bin/nfp_orchestrator.ini /etc/
    sudo cp -r  bin/nfp_proxy_agent.ini /etc/
    sudo cp -r  bin/nfp_proxy.ini /etc/nfp_proxy.ini
    sudo cp -r  bin/nfp_proxy /usr/bin/

    IpAddr=127.0.0.1
    echo "Configuring proxy.ini .... with rest_server_address as $IpAddr"
    sudo sed -i "s/rest_server_address=*.*/rest_server_address=$IpAddr/g" /etc/nfp_proxy.ini
    sudo sed -i "s/rest_server_port= *.*/rest_server_port=8080/g" /etc/nfp_proxy.ini
    ipnetns_router=`sudo ip netns |grep $RouterId`

    source $TOP_DIR/functions-common

    echo "Starting orchestrator  >>>> under screen named : orchestrator"
    run_process orchestrator "sudo /usr/bin/nfp  --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/nfp_orchestrator.ini --log-file $DEST/logs/nfp_orchestrator.log"
    sleep 1

    echo "Starting proxy_agent  >>>> under screen named : proxy_agent"
    run_process proxy_agent "sudo /usr/bin/nfp --config-file /etc/nfp_proxy_agent.ini --log-file $DEST/logs/nfp_proxy_agent.log"
    sleep 1

    echo "Starting proxy server under Namespace : nfp-proxy namespace >>>> under screen named : proxy"
    run_process proxy "source $NEW_BASE/devstack/lib/nfp;namespace_delete $TOP_DIR;namespace_create $TOP_DIR $IpAddr"
    sleep 10

    cd pecan/api
    sudo python setup.py develop
    echo "Starting base_configurator  >>>> under screen named : base_configurator"
    run_process base_configurator "cd $NEW_BASE/group-based-policy/gbpservice/nfp/pecan/api;sudo ip netns exec nfp-proxy pecan configurator_decider config.py --mode base"
    sleep 1

    echo "Running gbp-db-manage"

    source $TOP_DIR/openrc neutron service

    gbp-db-manage --config-file /etc/neutron/neutron.conf upgrade head
    sleep 2
    echo "Configuration success ... "
}
function nfp_setup {
    prepare_nfp_image_builder
    create_nfp_image $1
    assign_user_role_credential $1
    create_nfp_gbp_resources $1
    get_router_namespace $1
    copy_nfp_files_and_start_process $1
}
