#!/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
    :
}

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

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
        iniset /$Q_PLUGIN_CONF_FILE linux_bridge bridge_mappings "$PUBLIC_PHYSICAL_NETWORK:$PUBLIC_BRIDGE"
    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
        enable_kernel_bridge_firewall
    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
