#!/bin/bash
#
# Neutron Linux Bridge L2 agent
# -----------------------------

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

function neutron_lb_cleanup {
    sudo ip link set $PUBLIC_BRIDGE down
    sudo brctl delbr $PUBLIC_BRIDGE

    if [[ "$Q_ML2_TENANT_NETWORK_TYPE" = "vxlan" ]]; then
        for port in $(sudo brctl show | grep -o -e [a-zA-Z\-]*tap[0-9a-f\-]* -e vxlan-[0-9a-f\-]*); do
            sudo ip link delete $port
        done
    elif [[ "$Q_ML2_TENANT_NETWORK_TYPE" = "vlan" ]]; then
        for port in $(sudo brctl show | grep -o -e [a-zA-Z\-]*tap[0-9a-f\-]* -e ${LB_PHYSICAL_INTERFACE}\.[0-9a-f\-]*); do
            sudo ip link delete $port
        done
    fi
    for bridge in $(sudo brctl show |grep -o -e brq[0-9a-f\-]*); do
        sudo ip link set $bridge down
        sudo brctl delbr $bridge
    done
}

function is_neutron_ovs_base_plugin {
    # linuxbridge doesn't use OVS
    return 1
}

function neutron_plugin_create_nova_conf {
    :
}

function neutron_plugin_install_agent_packages {
    install_package bridge-utils
}

function neutron_plugin_configure_dhcp_agent {
    local conf_file=$1
    :
}

function neutron_plugin_configure_l3_agent {
    local conf_file=$1
    sudo brctl addbr $PUBLIC_BRIDGE
    set_mtu $PUBLIC_BRIDGE $PUBLIC_BRIDGE_MTU
}

function neutron_plugin_configure_plugin_agent {
    # Setup physical network interface mappings.  Override
    # ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc`` for more
    # complex physical network configurations.
    if [[ "$LB_INTERFACE_MAPPINGS" == "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]] && [[ "$LB_PHYSICAL_INTERFACE" != "" ]]; then
        LB_INTERFACE_MAPPINGS=$PHYSICAL_NETWORK:$LB_PHYSICAL_INTERFACE
    fi
    if [[ "$PUBLIC_BRIDGE" != "" ]] && [[ "$PUBLIC_PHYSICAL_NETWORK" != "" ]]; then
        if is_service_enabled q-l3 || is_service_enabled neutron-l3; then
            iniset /$Q_PLUGIN_CONF_FILE linux_bridge bridge_mappings "$PUBLIC_PHYSICAL_NETWORK:$PUBLIC_BRIDGE"
        fi
    fi
    if [[ "$LB_INTERFACE_MAPPINGS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE linux_bridge physical_interface_mappings $LB_INTERFACE_MAPPINGS
    fi
    if [[ "$Q_USE_SECGROUP" == "True" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
        if ! running_in_container; then
            enable_kernel_bridge_firewall
        fi
    else
        iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver
    fi
    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-linuxbridge-agent"
    iniset /$Q_PLUGIN_CONF_FILE agent tunnel_types $Q_TUNNEL_TYPES

    # Configure vxlan tunneling
    if [[ "$ENABLE_TENANT_TUNNELS" == "True" ]]; then
        if [[ "$Q_ML2_TENANT_NETWORK_TYPE" == "vxlan" ]]; then
            iniset /$Q_PLUGIN_CONF_FILE vxlan enable_vxlan "True"
            iniset /$Q_PLUGIN_CONF_FILE vxlan local_ip $TUNNEL_ENDPOINT_IP
        else
            iniset /$Q_PLUGIN_CONF_FILE vxlan enable_vxlan "False"
        fi
    else
        iniset /$Q_PLUGIN_CONF_FILE vxlan enable_vxlan "False"
    fi
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver linuxbridge
}

function neutron_plugin_check_adv_test_requirements {
    is_service_enabled q-agt && is_service_enabled q-dhcp && return 0
}

# Restore xtrace
$_XTRACE_NEUTRON_LB
