# Neutron Linux Bridge plugin
# ---------------------------

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

source $TOP_DIR/lib/neutron_plugins/linuxbridge_agent

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/linuxbridge
    Q_PLUGIN_CONF_FILENAME=linuxbridge_conf.ini
    Q_DB_NAME="neutron_linux_bridge"
    Q_PLUGIN_CLASS="neutron.plugins.linuxbridge.lb_neutron_plugin.LinuxBridgePluginV2"
}

function neutron_plugin_configure_service {
    if [[ "$ENABLE_TENANT_VLANS" = "True" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE vlans tenant_network_type vlan
    else
        echo "WARNING - The linuxbridge plugin is using local tenant networks, with no connectivity between hosts."
    fi

    # Override ``LB_VLAN_RANGES`` and ``LB_INTERFACE_MAPPINGS`` in ``localrc``
    # for more complex physical network configurations.
    if [[ "$LB_VLAN_RANGES" = "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
        LB_VLAN_RANGES=$PHYSICAL_NETWORK
        if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
            LB_VLAN_RANGES=$LB_VLAN_RANGES:$TENANT_VLAN_RANGE
        fi
    fi
    if [[ "$LB_VLAN_RANGES" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE vlans network_vlan_ranges $LB_VLAN_RANGES
    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

    # Define extra "LINUX_BRIDGE" configuration options when q-svc is configured by defining
    # the array ``Q_SRV_EXTRA_OPTS``.
    # For Example: ``Q_SRV_EXTRA_OPTS=(foo=true bar=2)``
    for I in "${Q_SRV_EXTRA_OPTS[@]}"; do
        # Replace the first '=' with ' ' for iniset syntax
        iniset /$Q_PLUGIN_CONF_FILE linux_bridge ${I/=/ }
    done
}

function has_neutron_plugin_security_group {
    # 0 means True here
    return 0
}

# Restore xtrace
$LBRIDGE_XTRACE
