# Quantum NEC OpenFlow plugin
# ---------------------------

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

# Configuration parameters
OFC_HOST=${OFC_HOST:-127.0.0.1}
OFC_PORT=${OFC_PORT:-8888}

OFC_API_HOST=${OFC_API_HOST:-$OFC_HOST}
OFC_API_PORT=${OFC_API_PORT:-$OFC_PORT}
OFC_OFP_HOST=${OFC_OFP_HOST:-$OFC_HOST}
OFC_OFP_PORT=${OFC_OFP_PORT:-6633}
OFC_DRIVER=${OFC_DRIVER:-trema}
OFC_RETRY_MAX=${OFC_RETRY_MAX:-0}
OFC_RETRY_INTERVAL=${OFC_RETRY_INTERVAL:-1}

OVS_BRIDGE=${OVS_BRIDGE:-br-int}

# Main logic
# ---------------------------

source $TOP_DIR/lib/quantum_plugins/ovs_base

function quantum_plugin_create_nova_conf() {
    _quantum_ovs_base_configure_nova_vif_driver
}

function quantum_plugin_install_agent_packages() {
    # SKIP_OVS_INSTALL is useful when we want to use Open vSwitch whose
    # version is different from the version provided by the distribution.
    if [[ "$SKIP_OVS_INSTALL" = "True" ]]; then
        echo "You need to install Open vSwitch manually."
        return
    fi
    _quantum_ovs_base_install_agent_packages
}

function quantum_plugin_configure_common() {
    Q_PLUGIN_CONF_PATH=etc/quantum/plugins/nec
    Q_PLUGIN_CONF_FILENAME=nec.ini
    Q_DB_NAME="quantum_nec"
    Q_PLUGIN_CLASS="quantum.plugins.nec.nec_plugin.NECPluginV2"
}

function quantum_plugin_configure_debug_command() {
    _quantum_ovs_base_configure_debug_command
}

function quantum_plugin_configure_dhcp_agent() {
    :
}

function quantum_plugin_configure_l3_agent() {
    _quantum_ovs_base_configure_l3_agent
}

function quantum_plugin_configure_plugin_agent() {
    if [[ "$SKIP_OVS_BRIDGE_SETUP" = "True" ]]; then
        return
    fi
    # Set up integration bridge
    _quantum_ovs_base_setup_bridge $OVS_BRIDGE
    sudo ovs-vsctl --no-wait set-controller $OVS_BRIDGE tcp:$OFC_OFP_HOST:$OFC_OFP_PORT
    # Generate datapath ID from HOST_IP
    local dpid=$(printf "0x%07d%03d%03d%03d\n" ${HOST_IP//./ })
    sudo ovs-vsctl --no-wait set Bridge $OVS_BRIDGE other-config:datapath-id=$dpid
    sudo ovs-vsctl --no-wait set-fail-mode $OVS_BRIDGE secure
    if [ -n "$OVS_INTERFACE" ]; then
        sudo ovs-vsctl --no-wait -- --may-exist add-port $OVS_BRIDGE $OVS_INTERFACE
    fi
    _quantum_setup_ovs_tunnels $OVS_BRIDGE
    AGENT_BINARY="$QUANTUM_DIR/bin/quantum-nec-agent"

    _quantum_ovs_base_configure_firewall_driver
}

function quantum_plugin_configure_service() {
    iniset $QUANTUM_CONF DEFAULT api_extensions_path quantum/plugins/nec/extensions/
    iniset /$Q_PLUGIN_CONF_FILE OFC host $OFC_API_HOST
    iniset /$Q_PLUGIN_CONF_FILE OFC port $OFC_API_PORT
    iniset /$Q_PLUGIN_CONF_FILE OFC driver $OFC_DRIVER
    iniset /$Q_PLUGIN_CONF_FILE OFC api_retry_max OFC_RETRY_MAX
    iniset /$Q_PLUGIN_CONF_FILE OFC api_retry_interval OFC_RETRY_INTERVAL
}

function quantum_plugin_setup_interface_driver() {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver quantum.agent.linux.interface.OVSInterfaceDriver
    iniset $conf_file DEFAULT ovs_use_veth True
}

# Utility functions
# ---------------------------

# Setup OVS tunnel manually
function _quantum_setup_ovs_tunnels() {
    local bridge=$1
    local id=0
    GRE_LOCAL_IP=${GRE_LOCAL_IP:-$HOST_IP}
    if [ -n "$GRE_REMOTE_IPS" ]; then
         for ip in ${GRE_REMOTE_IPS//:/ }
         do
             if [[ "$ip" == "$GRE_LOCAL_IP" ]]; then
                 continue
             fi
             sudo ovs-vsctl --no-wait add-port $bridge gre$id -- \
                 set Interface gre$id type=gre options:remote_ip=$ip
             id=`expr $id + 1`
         done
    fi
}

function has_quantum_plugin_security_group() {
    # 0 means True here
    return 0
}

# Restore xtrace
$MY_XTRACE
