#!/bin/bash
#
# Neutron IBM SDN-VE plugin
# ---------------------------

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

source $TOP_DIR/lib/neutron_plugins/ovs_base

function neutron_plugin_install_agent_packages {
    _neutron_ovs_base_install_agent_packages
}

function _neutron_interface_setup {
    # Setup one interface on the integration bridge if needed
    # The plugin agent to be used if more than one interface is used
    local bridge=$1
    local interface=$2
    sudo ovs-vsctl --no-wait -- --may-exist add-port $bridge $interface
}

function neutron_setup_integration_bridge {
    # Setup integration bridge if needed
    if [[ "$SDNVE_INTEGRATION_BRIDGE" != "" ]]; then
        neutron_ovs_base_cleanup
        _neutron_ovs_base_setup_bridge $SDNVE_INTEGRATION_BRIDGE
        if [[ "$SDNVE_INTERFACE_MAPPINGS" != "" ]]; then
            interfaces=(${SDNVE_INTERFACE_MAPPINGS//[,:]/ })
            _neutron_interface_setup $SDNVE_INTEGRATION_BRIDGE ${interfaces[1]}
        fi
    fi

    # Set controller to SDNVE controller (1st of list) if exists
    if [[ "$SDNVE_CONTROLLER_IPS" != "" ]]; then
        # Get the first controller
        controllers=(${SDNVE_CONTROLLER_IPS//[\[,\]]/ })
        SDNVE_IP=${controllers[0]}
        sudo ovs-vsctl set-controller $SDNVE_INTEGRATION_BRIDGE tcp:$SDNVE_IP
    fi
}

function neutron_plugin_create_nova_conf {
    NOVA_VIF_DRIVER=${NOVA_VIF_DRIVER:-"nova.virt.libvirt.vif.LibvirtGenericVIFDriver"}
    # if n-cpu is enabled, then setup integration bridge
    if is_service_enabled n-cpu; then
        neutron_setup_integration_bridge
    fi
}

function is_neutron_ovs_base_plugin {
    if [[ "$SDNVE_INTEGRATION_BRIDGE" != "" ]]; then
        # Yes, we use OVS.
        return 0
    else
        # No, we do not use OVS.
        return 1
    fi
}

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/ibm
    Q_PLUGIN_CONF_FILENAME=sdnve_neutron_plugin.ini
    Q_PLUGIN_CLASS="neutron.plugins.ibm.sdnve_neutron_plugin.SdnvePluginV2"
}

function neutron_plugin_configure_service {
    # Define extra "SDNVE" configuration options when q-svc is configured

    iniset /$Q_PLUGIN_CONF_FILE securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver

    if [[ "$SDNVE_CONTROLLER_IPS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve controller_ips $SDNVE_CONTROLLER_IPS
    fi

    if [[ "$SDNVE_INTEGRATION_BRIDGE" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve integration_bridge $SDNVE_INTEGRATION_BRIDGE
    fi

    if [[ "$SDNVE_RESET_BRIDGE" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve reset_bridge $SDNVE_RESET_BRIDGE
    fi

    if [[ "$SDNVE_OUT_OF_BAND" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve out_of_band $SDNVE_OUT_OF_BAND
    fi

    if [[ "$SDNVE_INTERFACE_MAPPINGS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve interface_mappings $SDNVE_INTERFACE_MAPPINGS
    fi

    if [[ "$SDNVE_FAKE_CONTROLLER" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE sdnve use_fake_controller $SDNVE_FAKE_CONTROLLER
    fi


    iniset $NEUTRON_CONF DEFAULT notification_driver neutron.openstack.common.notifier.no_op_notifier

}

function neutron_plugin_configure_plugin_agent {
    AGENT_BINARY="$NEUTRON_BIN_DIR/neutron-ibm-agent"
}

function neutron_plugin_configure_debug_command {
    :
}

function neutron_plugin_setup_interface_driver {
    return 0
}

function has_neutron_plugin_security_group {
    # Does not support Security Groups
    return 1
}

function neutron_ovs_base_cleanup {
    if [[ "$SDNVE_RESET_BRIDGE" != False ]]; then
        # remove all OVS ports that look like Neutron created ports
        for port in $(sudo ovs-vsctl list port | grep -o -e tap[0-9a-f\-]* -e q[rg]-[0-9a-f\-]*); do
            sudo ovs-vsctl del-port ${port}
        done

        # remove integration bridge created by Neutron
        for bridge in $(sudo ovs-vsctl list-br | grep -o -e ${SDNVE_INTEGRATION_BRIDGE}); do
            sudo ovs-vsctl del-br ${bridge}
        done
    fi
}

# Restore xtrace
$IBM_XTRACE
