#!/bin/bash


# cleanup_onos() - Remove residual data files, anything left over
# from previous runs that a clean run would need to clean up
function cleanup_onos {
    # Wipe out the data and journal directories ... grumble grumble grumble
    rm -rf $ONOS_DIR/$ONOS_NAME/data
    rm -rf $ONOS_DIR/$ONOS_NAME/${ONOS_KARAF_DIR}/data

    # Remove existing logfiles
    rm -f "/opt/stack/logs/$ONOS_KARAF_LOG_BASE*"
    unbind_onos_controller
}


# configure_neutron_onos() - Set Neutron config files according to ONOS settings
function configure_neutron_onos {
    echo "Configuring ML2 for ONOS"
    populate_ml2_config /$Q_PLUGIN_CONF_FILE onos url_path=$ONOS_ENDPOINT
    populate_ml2_config /$Q_PLUGIN_CONF_FILE onos username=$ONOS_USERNAME
    populate_ml2_config /$Q_PLUGIN_CONF_FILE onos password=$ONOS_PASSWORD

    echo "Setting onos config"
    neutron_server_config_add $NETWORKING_ONOS_DIR/etc/conf_onos.ini
}

# installs docker
function install_docker {
    wget -qO- https://get.docker.com/ | sudo sh
    # We need to logout and relogin to make it effective
    sudo usermod -aG docker $USER
    # It is an ugly hack to give permission to docker
    sudo chmod 666 /var/run/docker.sock
}

# configure the existing conf_onos.ini file
function setup_onos_conf {
    sed -i 's/HOST_IP/'$HOST_IP'/g' $NETWORKING_ONOS_DIR/etc/conf_onos.ini
}


# init_onos() - Initialize databases, etc.
function init_onos {
    # clean up from previous (possibly aborted) runs
    # create required data files
    :
}


# install_onos() - Collect source and prepare
function install_onos {
    echo "Installing ONOS and dependent packages"

    echo "Installing docker"
    install_docker

    echo "Installing networking-onos"
    install_onos_neutron_thin_ml2_driver
}


# install_onos_neutron_thin_ml2_driver() - Install the ML2 driver
function install_onos_neutron_thin_ml2_driver {
    cd $NETWORKING_ONOS_DIR
    echo "Installing the Networking-ONOS driver for ONOS"
    sudo python setup.py install
}


# install_onos_compute() - Make sure OVS is installed
function install_onos_compute {
    # packages are the same as for Neutron OVS agent
    _neutron_ovs_base_install_agent_packages
}

# pushes the SONA configuration file
function push_sona_config {
    curl --user onos:rocks -X POST -H "Content-Type:application/json" -d "@/tmp/sona_config" http://$HOST_IP:8181/onos/openstacknode/configure
}

# creates a SONA configuration file
function compose_sona_config_file {
    rm -rf /tmp/sona_config
    echo "{" > /tmp/sona_config
    echo " \"nodes\" : [ " >> /tmp/sona_config
    echo "     {\"hostname\" : \"compute-01\"," >> /tmp/sona_config
    echo "      \"type\" : \"COMPUTE\"," >> /tmp/sona_config
    echo "      \"managementIp\" : \"$HOST_IP\"," >> /tmp/sona_config
    echo "      \"dataIp\" : \"$HOST_IP\"," >> /tmp/sona_config
    echo "      \"integrationBridge\" : \"of:00000000000000a1\" }," >> /tmp/sona_config
    echo "      {" >> /tmp/sona_config
    echo "      \"hostname\" : \"controller\"," >> /tmp/sona_config
    echo "      \"type\" : \"CONTROLLER\"," >> /tmp/sona_config
    echo "      \"managementIp\" : \"$HOST_IP\"," >> /tmp/sona_config
    echo "      \"keystoneConfig\" : {" >> /tmp/sona_config
    echo "          \"endpoint\" : \"$HOST_IP/identity/v3\"," >> /tmp/sona_config
    echo "          \"authentication\" : {" >> /tmp/sona_config
    echo "              \"version\" : \"v3\"," >> /tmp/sona_config
    echo "              \"protocol\" : \"HTTP\"," >> /tmp/sona_config
    echo "              \"project\" : \"admin\"," >> /tmp/sona_config
    echo "              \"username\" : \"admin\"," >> /tmp/sona_config
    echo "              \"password\" : \"nova\"," >> /tmp/sona_config
    echo "              \"perspective\" : \"PUBLIC\"" >> /tmp/sona_config
    echo "          } }" >> /tmp/sona_config
    echo "      }" >> /tmp/sona_config
    echo "      ]" >> /tmp/sona_config
    echo "}" >> /tmp/sona_config
}

# start_onos() - Start running processes, including screen
function start_onos {
    echo "Starting ONOS"

    echo "Invoking docker sona"
    sudo docker run --name onos --network host -itd  opensona/onos-sona-nightly-docker

    echo "Composing sona configuration file"
    compose_sona_config_file

    echo "Waiting until ONOS boots up"
    sleep 20

    sudo apt-get install -y sshpass

    # Change OVS DB port to 6650
    sudo rm -rf ~/.ssh/known_hosts
    sshpass -p karaf ssh -o "StrictHostKeyChecking=no" -p 8101 karaf@localhost cfg set org.onosproject.openstacknode.impl.DefaultOpenstackNodeHandler ovsdbPortNum 6650
    sleep 2

    echo "Setting OVS manager port to 6650"
    bind_onos_controller
    sleep 2

    echo "Pushing sona configuration file to $HOST_IP"
    push_sona_config
    sleep 2

    echo "Initializing all the openstack nodes"
    sshpass -p karaf ssh -o "StrictHostKeyChecking=no" -p 8101 karaf@localhost openstack-node-init -a
}



# stop_onos() - Stop running processes (non-screen)
function stop_onos {
    # Stop the karaf container
    sudo docker stop onos
    sudo docker rm onos
}


# cleanup_onos_compute() - Remove all OVS ports, bridges and disconnects
# controller from switch
function cleanup_onos_compute {
    # Remove the patch ports
    for port in $(sudo ovs-vsctl show | grep Port | awk '{print $2}'  | cut -d '"' -f 2 | grep patch); do
        sudo ovs-vsctl del-port ${port}
    done

    # remove all OVS ports that look like Neutron created ports
    for port in $(sudo ovs-vsctl list port | grep -o -e tap[0-9a-f\-]* -e q[rg]-[0-9a-f\-]*); do
        sudo ovs-vsctl del-port ${port}
    done

    # Remove all the vxlan ports
    for port in $(sudo ovs-vsctl list port | grep name | grep vxlan | awk '{print $3}'  | cut -d '"' -f 2); do
        sudo ovs-vsctl del-port ${port}
    done

    # Disconnect controller from switch
    unbind_onos_controller

    # remove all OVS bridges created by ONOS
    for bridge in $(sudo ovs-vsctl list-br | grep -o -e ${OVS_BR} -e ${PUBLIC_BRIDGE}); do
        sudo ovs-vsctl del-br ${bridge}
    done
}


# bind_onos_controller() - set control manager to OVS
function bind_onos_controller {
    echo_summary "Initializing ONOS"
    ONOS_LOCAL_IP=${ONOS_LOCAL_IP:-$HOST_IP}
    ONOS_MGR_PORT=${ONOS_MGR_PORT:-6650}
    sudo ovs-vsctl set-manager ptcp:$ONOS_MGR_PORT
}


# unbind_onos_controller() - disconnect controller from switch and clear bridges
function unbind_onos_controller {
    sudo ovs-vsctl del-manager
    BRIDGES=$(sudo ovs-vsctl list-br)
    for bridge in $BRIDGES ; do
        sudo ovs-vsctl del-controller $bridge
    done
    local _ONOSEXTPORT=$(ip link | grep $ONOS_EXTERNAL_NIC)
    if [[ "$ONOS_EXTERNAL_VETH" == "True" && $_ONOSEXTPORT != "" ]]; then
        sudo ip link delete ${ONOS_EXTERNAL_NIC} type veth
    fi
}

# configure cell information after openstack is completely installed
function configure_cell_setup {
    nova-manage cell_v2 map_cell0 --database_connection mysql+pymysql://root:nova@$HOST_IP/nova_cell0?charset=utf8
    nova-manage cell_v2 simple_cell_setup --transport-url rabbit://stackrabbit:nova@$HOST_IP:5672/
    nova-manage cell_v2 discover_hosts
}

