# 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}

# 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
}

function quantum_plugin_check_adv_test_requirements() {
    is_service_enabled q-agt && is_service_enabled q-dhcp && return 0
}

# Restore xtrace
$MY_XTRACE
