#!/bin/bash
#
# Brocade Neutron Plugin
# ----------------------

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

function is_neutron_ovs_base_plugin {
    return 1
}

function neutron_plugin_create_nova_conf {
    :
}

function neutron_plugin_install_agent_packages {
    install_package bridge-utils
}

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/brocade
    Q_PLUGIN_CONF_FILENAME=brocade.ini
    Q_PLUGIN_CLASS="neutron.plugins.brocade.NeutronPlugin.BrocadePluginV2"
}

function neutron_plugin_configure_service {

    if [[ "$BROCADE_SWITCH_OS_VERSION" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE switch osversion $BROCADE_SWITCH_OS_VERSION
    fi

    if [[ "$BROCADE_SWITCH_OS_TYPE" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE switch ostype $BROCADE_SWITCH_OS_TYPE
    fi

    if [[ "$BROCADE_SWITCH_PASSWORD" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE switch password $BROCADE_SWITCH_PASSWORD
    fi

    if [[ "$BROCADE_SWITCH_USERNAME" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE switch username $BROCADE_SWITCH_USERNAME
    fi

    if [[ "$BROCADE_SWITCH_IPADDR" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE switch address $BROCADE_SWITCH_IPADDR
    fi

}

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

function neutron_plugin_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-linuxbridge-agent"
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver linuxbridge
}

function has_neutron_plugin_security_group {
    # 0 means True here
    return 0
}

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

# Restore xtrace
$_XTRACE_NEUTRON_BROCADE
