#!/bin/bash
#
# Neuton Big Switch/FloodLight plugin
# ------------------------------------

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

source $TOP_DIR/lib/neutron_plugins/ovs_base
source $TOP_DIR/lib/neutron_thirdparty/bigswitch_floodlight     # for third party service specific configuration values

function neutron_plugin_create_nova_conf {
    :
}

function neutron_plugin_install_agent_packages {
    _neutron_ovs_base_install_agent_packages
}

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/bigswitch
    Q_PLUGIN_CONF_FILENAME=restproxy.ini
    Q_PLUGIN_CLASS="neutron.plugins.bigswitch.plugin.NeutronRestProxyV2"
    BS_FL_CONTROLLERS_PORT=${BS_FL_CONTROLLERS_PORT:-localhost:80}
    BS_FL_CONTROLLER_TIMEOUT=${BS_FL_CONTROLLER_TIMEOUT:-10}
}

function neutron_plugin_configure_debug_command {
    _neutron_ovs_base_configure_debug_command
}

function neutron_plugin_configure_dhcp_agent {
    :
}

function neutron_plugin_configure_l3_agent {
    _neutron_ovs_base_configure_l3_agent
}

function neutron_plugin_configure_plugin_agent {
    # Set up integration bridge
    _neutron_ovs_base_setup_bridge $OVS_BRIDGE
    iniset /$Q_PLUGIN_CONF_FILE restproxyagent integration_bridge $OVS_BRIDGE
    AGENT_BINARY="$NEUTRON_DIR/neutron/plugins/bigswitch/agent/restproxy_agent.py"

    _neutron_ovs_base_configure_firewall_driver
}

function neutron_plugin_configure_service {
    iniset /$Q_PLUGIN_CONF_FILE restproxy servers $BS_FL_CONTROLLERS_PORT
    iniset /$Q_PLUGIN_CONF_FILE restproxy servertimeout $BS_FL_CONTROLLER_TIMEOUT
    if [ "$BS_FL_VIF_DRIVER" = "ivs" ]; then
        iniset /$Q_PLUGIN_CONF_FILE nova vif_type ivs
    fi
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    if [ "$BS_FL_VIF_DRIVER" = "ivs" ]; then
        iniset $conf_file DEFAULT interface_driver ivs
    else
        iniset $conf_file DEFAULT interface_driver openvswitch
    fi
}


function has_neutron_plugin_security_group {
    # 1 means False here
    return 0
}

function neutron_plugin_check_adv_test_requirements {
    is_service_enabled q-agt && is_service_enabled q-dhcp && return 0
}

# Restore xtrace
$_XTRACE_NEUTRON_BIGSWITCH
