#!/bin/bash
#
# common functions for ovs based plugin
# -------------------------------------

# Save trace setting
_XTRACE_NEUTRON_OVS_BASE=$(set +o | grep xtrace)
set +o xtrace

# Load devstack ovs compliation and loading functions
source ${TOP_DIR}/lib/neutron_plugins/ovs_source

# Defaults
# --------

OVS_BRIDGE=${OVS_BRIDGE:-br-int}
# OVS recognize default 'system' datapath or 'netdev' for userspace datapath
OVS_DATAPATH_TYPE=${OVS_DATAPATH_TYPE:-system}
OVS_TUNNEL_BRIDGE=${OVS_TUNNEL_BRIDGE:-br-tun}

function is_neutron_ovs_base_plugin {
    # Yes, we use OVS.
    return 0
}

function _neutron_ovs_base_add_bridge {
    local bridge=$1
    local addbr_cmd="sudo ovs-vsctl -- --may-exist add-br $bridge"

    if [ "$OVS_DATAPATH_TYPE" != "system" ] ; then
        addbr_cmd="$addbr_cmd -- set Bridge $bridge datapath_type=${OVS_DATAPATH_TYPE}"
    fi

    $addbr_cmd
}

function _neutron_ovs_base_setup_bridge {
    local bridge=$1
    neutron-ovs-cleanup --config-file $NEUTRON_CONF
    _neutron_ovs_base_add_bridge $bridge
    sudo ovs-vsctl --no-wait br-set-external-id $bridge bridge-id $bridge
}

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

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

function _neutron_ovs_base_install_ubuntu_dkms {
    # install Dynamic Kernel Module Support packages if needed
    local kernel_version
    kernel_version=$(uname -r)
    local kernel_major_minor
    kernel_major_minor=`echo $kernel_version | cut -d. -f1-2`
    # From kernel 3.13 on, openvswitch-datapath-dkms is not needed
    if vercmp "$kernel_major_minor" "<" "3.13" ; then
        install_package "dkms openvswitch-datapath-dkms linux-headers-$kernel_version"
    fi
}

function _neutron_ovs_base_install_agent_packages {
    if [ "$Q_BUILD_OVS_FROM_GIT" == "True" ]; then
        remove_ovs_packages
        compile_ovs False /usr/local /var
        load_conntrack_gre_module
        start_new_ovs
    else
        # Install deps
        install_package $(get_packages "openvswitch")
        if is_ubuntu; then
            _neutron_ovs_base_install_ubuntu_dkms
            restart_service openvswitch-switch
        elif is_fedora; then
            restart_service openvswitch
            sudo systemctl enable openvswitch
        fi
    fi
}

function _neutron_ovs_base_configure_firewall_driver {
    if [[ "$Q_USE_SECGROUP" == "True" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver openvswitch
        if ! running_in_container; then
            enable_kernel_bridge_firewall
        fi
    else
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver noop
    fi
}

function _neutron_ovs_base_configure_l3_agent {
    neutron-ovs-cleanup --config-file $NEUTRON_CONF
    if [[ "$Q_USE_PUBLIC_VETH" = "True" ]]; then
        ip link show $Q_PUBLIC_VETH_INT > /dev/null 2>&1 ||
        sudo ip link add $Q_PUBLIC_VETH_INT type veth \
            peer name $Q_PUBLIC_VETH_EX
        sudo ip link set $Q_PUBLIC_VETH_INT up
        sudo ip link set $Q_PUBLIC_VETH_EX up
        sudo ip addr flush dev $Q_PUBLIC_VETH_EX
    else
        _neutron_ovs_base_add_public_bridge
        sudo ovs-vsctl br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE
    fi
}

function _neutron_ovs_base_add_public_bridge {
    _neutron_ovs_base_add_bridge $PUBLIC_BRIDGE
    set_mtu $PUBLIC_BRIDGE $PUBLIC_BRIDGE_MTU
}

function _neutron_ovs_base_configure_nova_vif_driver {
    :
}

# Restore xtrace
$_XTRACE_NEUTRON_OVS_BASE
