#!/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 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_debug_command {
    iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge
}

function neutron_plugin_configure_dhcp_agent {
    local conf_file=$1
    iniset $conf_file DEFAULT dhcp_agent_manager neutron.agent.dhcp_agent.DhcpAgentWithStateReport
}

function neutron_plugin_configure_l3_agent {
    local conf_file=$1
    sudo brctl addbr $PUBLIC_BRIDGE
    iniset $conf_file DEFAULT external_network_bridge
    iniset $conf_file DEFAULT l3_agent_manager neutron.agent.l3_agent.L3NATAgentWithStateReport
}

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 [[ "$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
    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
