#!/bin/bash
#
# VMware NSX
# ----------

# This third-party addition can be used to configure connectivity between a DevStack instance
# and an NSX Gateway in dev/test environments. In order to use this correctly, the following
# env variables need to be set (e.g. in your localrc file):
#
# * enable_service vmware_nsx        --> to execute this third-party addition
# * PUBLIC_BRIDGE                    --> bridge used for external connectivity, typically br-ex
# * NSX_GATEWAY_NETWORK_INTERFACE    --> interface used to communicate with the NSX Gateway
# * NSX_GATEWAY_NETWORK_CIDR         --> CIDR to configure $PUBLIC_BRIDGE, e.g. 172.24.4.211/24

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

# This is the interface that connects the Devstack instance
# to an network that allows it to talk to the gateway for
# testing purposes
NSX_GATEWAY_NETWORK_INTERFACE=${NSX_GATEWAY_NETWORK_INTERFACE:-eth2}
# Re-declare floating range as it's needed also in stop_vmware_nsx, which
# is invoked by unstack.sh
FLOATING_RANGE=${FLOATING_RANGE:-172.24.4.0/24}

function configure_vmware_nsx {
    :
}

function init_vmware_nsx {
    if ! is_set NSX_GATEWAY_NETWORK_CIDR; then
        NSX_GATEWAY_NETWORK_CIDR=$PUBLIC_NETWORK_GATEWAY/${FLOATING_RANGE#*/}
        echo "The IP address to set on $PUBLIC_BRIDGE was not specified. "
        echo "Defaulting to "$NSX_GATEWAY_NETWORK_CIDR
    fi
    # Make sure the interface is up, but not configured
    sudo ip link set $NSX_GATEWAY_NETWORK_INTERFACE up
    # Save and then flush the IP addresses on the interface
    addresses=$(ip addr show dev $NSX_GATEWAY_NETWORK_INTERFACE | grep inet | awk {'print $2'})
    sudo ip addr flush $NSX_GATEWAY_NETWORK_INTERFACE
    # Use the PUBLIC Bridge to route traffic to the NSX gateway
    # NOTE(armando-migliaccio): if running in a nested environment this will work
    # only with mac learning enabled, portsecurity and security profiles disabled
    # The public bridge might not exist for the NSX plugin if Q_USE_DEBUG_COMMAND is off
    # Try to create it anyway
    sudo ovs-vsctl --may-exist add-br $PUBLIC_BRIDGE
    sudo ovs-vsctl --may-exist add-port $PUBLIC_BRIDGE $NSX_GATEWAY_NETWORK_INTERFACE
    nsx_gw_net_if_mac=$(ip link show $NSX_GATEWAY_NETWORK_INTERFACE | awk '/ether/ {print $2}')
    sudo ip link set address $nsx_gw_net_if_mac dev $PUBLIC_BRIDGE
    for address in $addresses; do
        sudo ip addr add dev $PUBLIC_BRIDGE $address
    done
    sudo ip addr add dev $PUBLIC_BRIDGE $NSX_GATEWAY_NETWORK_CIDR
    sudo ip link set $PUBLIC_BRIDGE up
}

function install_vmware_nsx {
    :
}

function start_vmware_nsx {
    :
}

function stop_vmware_nsx {
    if ! is_set NSX_GATEWAY_NETWORK_CIDR; then
        NSX_GATEWAY_NETWORK_CIDR=$PUBLIC_NETWORK_GATEWAY/${FLOATING_RANGE#*/}
        echo "The IP address expected on $PUBLIC_BRIDGE was not specified. "
        echo "Defaulting to "$NSX_GATEWAY_NETWORK_CIDR
    fi
    sudo ip addr del $NSX_GATEWAY_NETWORK_CIDR dev $PUBLIC_BRIDGE
    # Save and then flush remaining addresses on the interface
    addresses=$(ip addr show dev $PUBLIC_BRIDGE | grep inet | awk {'print $2'})
    sudo ip addr flush $PUBLIC_BRIDGE
    # Try to detach physical interface from PUBLIC_BRIDGE
    sudo ovs-vsctl del-port $NSX_GATEWAY_NETWORK_INTERFACE
    # Restore addresses on NSX_GATEWAY_NETWORK_INTERFACE
    for address in $addresses; do
        sudo ip addr add dev $NSX_GATEWAY_NETWORK_INTERFACE $address
    done
}

function check_vmware_nsx {
    neutron-check-nsx-config $NEUTRON_CONF_DIR/plugins/vmware/nsx.ini
}

# Restore xtrace
$NSX3_XTRACE