# Quantum Linux Bridge plugin
# ---------------------------

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

function quantum_plugin_configure_common() {
    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/linuxbridge
    Q_PLUGIN_CONF_FILENAME=linuxbridge_conf.ini
    Q_DB_NAME="quantum_linux_bridge"
    Q_PLUGIN_CLASS="quantum.plugins.linuxbridge.lb_quantum_plugin.LinuxBridgePluginV2"
}

function quantum_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 quantum.agent.linux.iptables_firewall.IptablesFirewallDriver
    else
        iniset /$Q_PLUGIN_CONF_FILE SECURITYGROUP firewall_driver quantum.agent.firewall.NoopFirewallDriver
    fi
}

function has_quantum_plugin_security_group() {
    # 0 means True here
    return 0
}

# Restore xtrace
$MY_XTRACE
