# common functions for ovs based plugin
# -------------------------------------

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

OVS_BRIDGE=${OVS_BRIDGE:-br-int}
PUBLIC_BRIDGE=${PUBLIC_BRIDGE:-br-ex}

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

function _neutron_ovs_base_setup_bridge() {
    local bridge=$1
    neutron-ovs-cleanup
    sudo ovs-vsctl --no-wait -- --may-exist add-br $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 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}); do
        sudo ovs-vsctl del-br ${bridge}
    done
}

function _neutron_ovs_base_install_agent_packages() {
    local kernel_version
    # Install deps
    # FIXME add to ``files/apts/neutron``, but don't install if not needed!
    if is_ubuntu; then
        kernel_version=`cat /proc/version | cut -d " " -f3`
        install_package make fakeroot dkms openvswitch-switch openvswitch-datapath-dkms linux-headers-$kernel_version
    elif is_fedora; then
        install_package openvswitch
        # Ensure that the service is started
        restart_service openvswitch
    elif is_suse; then
        install_package openvswitch
        restart_service openvswitch-switch
        restart_service openvswitch-controller
    fi
}

function _neutron_ovs_base_configure_debug_command() {
    iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE
}

function _neutron_ovs_base_configure_firewall_driver() {
    if [[ "$Q_USE_SECGROUP" == "True" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
    else
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver
    fi
}

function _neutron_ovs_base_configure_l3_agent() {
    iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge $PUBLIC_BRIDGE

    neutron-ovs-cleanup
    sudo ovs-vsctl --no-wait -- --may-exist add-br $PUBLIC_BRIDGE
    sudo ovs-vsctl --no-wait br-set-external-id $PUBLIC_BRIDGE bridge-id $PUBLIC_BRIDGE
    # ensure no IP is configured on the public bridge
    sudo ip addr flush dev $PUBLIC_BRIDGE
}

function _neutron_ovs_base_configure_nova_vif_driver() {
    # The hybrid VIF driver needs to be specified when Neutron Security Group
    # is enabled (until vif_security attributes are supported in VIF extension)
    if [[ "$Q_USE_SECGROUP" == "True" ]]; then
        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtHybridOVSBridgeDriver"}
    else
        NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"}
    fi
}

# Restore xtrace
$MY_XTRACE
