# Neutron loadbalancer plugin
# ---------------------------

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


AGENT_LBAAS_BINARY="$NEUTRON_BIN_DIR/neutron-lbaas-agent"
LBAAS_PLUGIN=neutron.services.loadbalancer.plugin.LoadBalancerPlugin

function neutron_agent_lbaas_install_agent_packages() {
    if is_ubuntu || is_fedora; then
        install_package haproxy
    elif is_suse; then
        ### FIXME: Find out if package can be pushed to Factory
        echo "HAProxy packages can be installed from server:http project in OBS"
    fi
}

function neutron_agent_lbaas_configure_common() {
    if [[ $Q_SERVICE_PLUGIN_CLASSES == '' ]]; then
        Q_SERVICE_PLUGIN_CLASSES=$LBAAS_PLUGIN
    else
        Q_SERVICE_PLUGIN_CLASSES="$Q_SERVICE_PLUGIN_CLASSES,$LBAAS_PLUGIN"
    fi
}

function neutron_agent_lbaas_configure_agent() {
    LBAAS_AGENT_CONF_PATH=/etc/neutron/services/loadbalancer/haproxy
    mkdir -p $LBAAS_AGENT_CONF_PATH

    LBAAS_AGENT_CONF_FILENAME="$LBAAS_AGENT_CONF_PATH/lbaas_agent.ini"

    cp $NEUTRON_DIR/etc/lbaas_agent.ini $LBAAS_AGENT_CONF_FILENAME

    # ovs_use_veth needs to be set before the plugin configuration
    # occurs to allow plugins to override the setting.
    iniset $LBAAS_AGENT_CONF_FILENAME DEFAULT ovs_use_veth $Q_OVS_USE_VETH

    neutron_plugin_setup_interface_driver $LBAAS_AGENT_CONF_FILENAME

    if is_fedora; then
        iniset $LBAAS_AGENT_CONF_FILENAME DEFAULT user_group "nobody"
    fi
}

# Restore xtrace
$MY_XTRACE
