# Neutron Open vSwitch plugin
# ---------------------------

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

source $TOP_DIR/lib/neutron_plugins/openvswitch_agent

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/openvswitch
    Q_PLUGIN_CONF_FILENAME=ovs_neutron_plugin.ini
    Q_DB_NAME="ovs_neutron"
    Q_PLUGIN_CLASS="neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2"
}

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

    # Override ``OVS_VLAN_RANGES`` and ``OVS_BRIDGE_MAPPINGS`` in ``localrc``
    # for more complex physical network configurations.
    if [[ "$OVS_VLAN_RANGES" == "" ]] && [[ "$PHYSICAL_NETWORK" != "" ]]; then
        OVS_VLAN_RANGES=$PHYSICAL_NETWORK
        if [[ "$TENANT_VLAN_RANGE" != "" ]]; then
            OVS_VLAN_RANGES=$OVS_VLAN_RANGES:$TENANT_VLAN_RANGE
        fi
    fi
    if [[ "$OVS_VLAN_RANGES" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE ovs network_vlan_ranges $OVS_VLAN_RANGES
    fi

    # Enable tunnel networks if selected
    if [[ $OVS_ENABLE_TUNNELING == "True" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE ovs enable_tunneling True
    fi

    _neutron_ovs_base_configure_firewall_driver

    # Define extra "OVS" 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 ovs ${I/=/ }
    done
}

function has_neutron_plugin_security_group {
    return 0
}

# Restore xtrace
$OVS_XTRACE
