# 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() {
    _neutron_service_plugin_class_add $LBAAS_PLUGIN
}

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
}

function neutron_lbaas_stop() {
    pids=$(ps aux | awk '/haproxy/ { print $2 }')
    [ ! -z "$pids" ] && sudo kill $pids
}

# Restore xtrace
$MY_XTRACE
