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

# Save trace setting
PLUGIN_XTRACE=$(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 {
    iniset $Q_DHCP_CONF_FILE DEFAULT dhcp_agent_manager neutron.agent.dhcp_agent.DhcpAgentWithStateReport
}

function neutron_plugin_configure_l3_agent {
    sudo brctl addbr $PUBLIC_BRIDGE
    iniset $Q_L3_CONF_FILE DEFAULT external_network_bridge
    iniset $Q_L3_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
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver neutron.agent.linux.interface.BridgeInterfaceDriver
}

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

# Restore xtrace
$PLUGIN_XTRACE
