# Neutron Linux Bridge L2 agent
# -----------------------------

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

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 {
    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"
    # Define extra "AGENT" configuration options when q-agt is configured by defining
    # the array ``Q_AGENT_EXTRA_AGENT_OPTS``.
    # For Example: ``Q_AGENT_EXTRA_AGENT_OPTS=(foo=true bar=2)``
    for I in "${Q_AGENT_EXTRA_AGENT_OPTS[@]}"; do
        # Replace the first '=' with ' ' for iniset syntax
        iniset /$Q_PLUGIN_CONF_FILE agent ${I/=/ }
    done
    # Define extra "LINUX_BRIDGE" configuration options when q-agt is configured by defining
    # the array ``Q_AGENT_EXTRA_SRV_OPTS``.
    # For Example: ``Q_AGENT_EXTRA_SRV_OPTS=(foo=true bar=2)``
    for I in "${Q_AGENT_EXTRA_SRV_OPTS[@]}"; do
        # Replace the first '=' with ' ' for iniset syntax
        iniset /$Q_PLUGIN_CONF_FILE linux_bridge ${I/=/ }
    done
}

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
