#!/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 delete $PUBLIC_BRIDGE

    bridge_list=`ls /sys/class/net/*/bridge/bridge_id 2>/dev/null | cut -f5 -d/`
    if [[ -z "$bridge_list" ]]; then
        return
    fi
    if [[ "$Q_ML2_TENANT_NETWORK_TYPE" = "vxlan" ]]; then
        for port in $(echo $bridge_list | 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 $(echo $bridge_list | 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 $(echo $bridge_list |grep -o -e brq[0-9a-f\-]*); do
        sudo ip link delete $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 {
    :
}

function neutron_plugin_configure_dhcp_agent {
    local conf_file=$1
    :
}

function neutron_plugin_configure_l3_agent {
    local conf_file=$1
    sudo ip link add $PUBLIC_BRIDGE type 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 neutron-agent && is_service_enabled q-dhcp neutron-dhcp && return 0
}

# Restore xtrace
$_XTRACE_NEUTRON_LB
