# Neutron MidoNet plugin
# ----------------------

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

function is_neutron_ovs_base_plugin() {
    # MidoNet does not use l3-agent
    # 0 means True here
    return 1
}

function neutron_plugin_create_nova_conf() {
    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"}
}

function neutron_plugin_install_agent_packages() {
    :
}

function neutron_plugin_configure_common() {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/midonet
    Q_PLUGIN_CONF_FILENAME=midonet.ini
    Q_DB_NAME="neutron_midonet"
    Q_PLUGIN_CLASS="neutron.plugins.midonet.plugin.MidonetPluginV2"
}

function neutron_plugin_configure_debug_command() {
    :
}

function neutron_plugin_configure_dhcp_agent() {
    DHCP_DRIVER=${DHCP_DRIVER:-"neutron.plugins.midonet.agent.midonet_driver.DhcpNoOpDriver"}
    DHCP_INTERFACE_DRIVER=${DHCP_INTEFACE_DRIVER:-"neutron.plugins.midonet.agent.midonet_driver.MidonetInterfaceDriver"}
    iniset $Q_DHCP_CONF_FILE DEFAULT dhcp_driver $DHCP_DRIVER
    iniset $Q_DHCP_CONF_FILE DEFAULT interface_driver $DHCP_INTERFACE_DRIVER
    iniset $Q_DHCP_CONF_FILE DEFAULT use_namespaces True
    iniset $Q_DHCP_CONF_FILE DEFAULT enable_isolated_metadata True
    if [[ "$MIDONET_API_URI" != "" ]]; then
        iniset $Q_DHCP_CONF_FILE MIDONET midonet_uri "$MIDONET_API_URI"
    fi
    if [[ "$MIDONET_USERNAME" != "" ]]; then
        iniset $Q_DHCP_CONF_FILE MIDONET username "$MIDONET_USERNAME"
    fi
    if [[ "$MIDONET_PASSWORD" != "" ]]; then
        iniset $Q_DHCP_CONF_FILE MIDONET password "$MIDONET_PASSWORD"
    fi
    if [[ "$MIDONET_PROJECT_ID" != "" ]]; then
        iniset $Q_DHCP_CONF_FILE MIDONET project_id "$MIDONET_PROJECT_ID"
    fi
}

function neutron_plugin_configure_l3_agent() {
    die $LINENO "q-l3 must not be executed with MidoNet plugin!"
}

function neutron_plugin_configure_plugin_agent() {
    die $LINENO "q-agt must not be executed with MidoNet plugin!"
}

function neutron_plugin_configure_service() {
    if [[ "$MIDONET_API_URI" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE MIDONET midonet_uri $MIDONET_API_URI
    fi
    if [[ "$MIDONET_USERNAME" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE MIDONET username $MIDONET_USERNAME
    fi
    if [[ "$MIDONET_PASSWORD" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE MIDONET password $MIDONET_PASSWORD
    fi
    if [[ "$MIDONET_PROJECT_ID" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE MIDONET project_id $MIDONET_PROJECT_ID
    fi
    if [[ "$MIDONET_PROVIDER_ROUTER_ID" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE MIDONET provider_router_id $MIDONET_PROVIDER_ROUTER_ID
    fi
}

function neutron_plugin_setup_interface_driver() {
    # May change in the future
    :
}

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

function neutron_plugin_check_adv_test_requirements() {
    # 0 means True here
    return 1
}

# Restore xtrace
$MY_XTRACE
