# Neutron One Convergence plugin
# ------------------------------

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

source $TOP_DIR/lib/neutron_plugins/ovs_base

Q_L3_ENABLED=true
Q_L3_ROUTER_PER_TENANT=true
Q_USE_NAMESPACE=true

function neutron_plugin_install_agent_packages {
    _neutron_ovs_base_install_agent_packages
}
# Configure common parameters
function neutron_plugin_configure_common {

    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/oneconvergence
    Q_PLUGIN_CONF_FILENAME=nvsdplugin.ini
    Q_PLUGIN_CLASS="neutron.plugins.oneconvergence.plugin.OneConvergencePluginV2"
}

# Configure plugin specific information
function neutron_plugin_configure_service {
    iniset /$Q_PLUGIN_CONF_FILE nvsd nvsd_ip $NVSD_IP
    iniset /$Q_PLUGIN_CONF_FILE nvsd nvsd_port $NVSD_PORT
    iniset /$Q_PLUGIN_CONF_FILE nvsd nvsd_user $NVSD_USER
    iniset /$Q_PLUGIN_CONF_FILE nvsd nvsd_passwd $NVSD_PASSWD
}

function neutron_plugin_configure_debug_command {
    _neutron_ovs_base_configure_debug_command
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver neutron.agent.linux.interface.OVSInterfaceDriver
}

function has_neutron_plugin_security_group {
    # 1 means False here
    return 0
}

function setup_integration_bridge {
    _neutron_ovs_base_setup_bridge $OVS_BRIDGE
}

function neutron_plugin_configure_dhcp_agent {
    setup_integration_bridge
    iniset $Q_DHCP_CONF_FILE DEFAULT dhcp_agent_manager neutron.agent.dhcp_agent.DhcpAgentWithStateReport
}

function neutron_plugin_configure_l3_agent {
    _neutron_ovs_base_configure_l3_agent
    iniset $Q_L3_CONF_FILE DEFAULT l3_agent_manager neutron.agent.l3_agent.L3NATAgentWithStateReport
}

function neutron_plugin_configure_plugin_agent {

    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-nvsd-agent"

    _neutron_ovs_base_configure_firewall_driver
}

function neutron_plugin_create_nova_conf {
    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"}
    if ( is_service_enabled n-cpu && ! ( is_service_enabled q-dhcp )) ; then
        setup_integration_bridge
    fi
}

# Restore xtrace
$OC_XTRACE
