# Neutron VMware NSX plugin
# -------------------------

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

source $TOP_DIR/lib/neutron_plugins/ovs_base

function setup_integration_bridge {
    _neutron_ovs_base_setup_bridge $OVS_BRIDGE
    # Set manager to NSX controller (1st of list)
    if [[ "$NSX_CONTROLLERS" != "" ]]; then
        # Get the first controller
        controllers=(${NSX_CONTROLLERS//,/ })
        OVS_MGR_IP=${controllers[0]}
    else
        die $LINENO "Error - No controller specified. Unable to set a manager for OVS"
    fi
    sudo ovs-vsctl set-manager ssl:$OVS_MGR_IP
}

function is_neutron_ovs_base_plugin {
    # NSX uses OVS, but not the l3-agent
    return 0
}

function neutron_plugin_create_nova_conf {
    # if n-cpu is enabled, then setup integration bridge
    if is_service_enabled n-cpu; then
        setup_integration_bridge
    fi
}

function neutron_plugin_install_agent_packages {
    # VMware NSX Plugin does not run q-agt, but it currently needs dhcp and metadata agents
    _neutron_ovs_base_install_agent_packages
}

function neutron_plugin_configure_common {
    Q_PLUGIN_CONF_PATH=etc/neutron/plugins/vmware
    Q_PLUGIN_CONF_FILENAME=nsx.ini
    Q_DB_NAME="neutron_nsx"
    Q_PLUGIN_CLASS="neutron.plugins.vmware.plugin.NsxPlugin"
}

function neutron_plugin_configure_debug_command {
    sudo ovs-vsctl --no-wait -- --may-exist add-br $PUBLIC_BRIDGE
    iniset $NEUTRON_TEST_CONFIG_FILE DEFAULT external_network_bridge "$PUBLIC_BRIDGE"
}

function neutron_plugin_configure_dhcp_agent {
    setup_integration_bridge
    iniset $Q_DHCP_CONF_FILE DEFAULT enable_isolated_metadata True
    iniset $Q_DHCP_CONF_FILE DEFAULT enable_metadata_network True
    iniset $Q_DHCP_CONF_FILE DEFAULT ovs_use_veth True
}

function neutron_plugin_configure_l3_agent {
    # VMware NSX plugin does not run L3 agent
    die $LINENO "q-l3 should must not be executed with VMware NSX plugin!"
}

function neutron_plugin_configure_plugin_agent {
    # VMware NSX plugin does not run L2 agent
    die $LINENO "q-agt must not be executed with VMware NSX plugin!"
}

function neutron_plugin_configure_service {
    if [[ "$MAX_LP_PER_BRIDGED_LS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE nsx max_lp_per_bridged_ls $MAX_LP_PER_BRIDGED_LS
    fi
    if [[ "$MAX_LP_PER_OVERLAY_LS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE nsx max_lp_per_overlay_ls $MAX_LP_PER_OVERLAY_LS
    fi
    if [[ "$FAILOVER_TIME" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE nsx failover_time $FAILOVER_TIME
    fi
    if [[ "$CONCURRENT_CONNECTIONS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE nsx concurrent_connections $CONCURRENT_CONNECTIONS
    fi

    if [[ "$DEFAULT_TZ_UUID" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT default_tz_uuid $DEFAULT_TZ_UUID
    else
        die $LINENO "The VMware NSX plugin won't work without a default transport zone."
    fi
    if [[ "$DEFAULT_L3_GW_SVC_UUID" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT default_l3_gw_service_uuid $DEFAULT_L3_GW_SVC_UUID
        Q_L3_ENABLED=True
        Q_L3_ROUTER_PER_TENANT=True
        iniset /$Q_PLUGIN_CONF_FILE nsx metadata_mode access_network
    fi
    if [[ "$DEFAULT_L2_GW_SVC_UUID" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT default_l2_gw_service_uuid $DEFAULT_L2_GW_SVC_UUID
    fi
    # NSX_CONTROLLERS must be a comma separated string
    if [[ "$NSX_CONTROLLERS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT nsx_controllers $NSX_CONTROLLERS
    else
        die $LINENO "The VMware NSX plugin needs at least an NSX controller."
    fi
    if [[ "$NSX_USER" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT nsx_user $NSX_USER
    fi
    if [[ "$NSX_PASSWORD" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT nsx_password $NSX_PASSWORD
    fi
    if [[ "$NSX_REQ_TIMEOUT" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT req_timeout $NSX_REQ_TIMEOUT
    fi
    if [[ "$NSX_HTTP_TIMEOUT" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT http_timeout $NSX_HTTP_TIMEOUT
    fi
    if [[ "$NSX_RETRIES" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT retries $NSX_RETRIES
    fi
    if [[ "$NSX_REDIRECTS" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE DEFAULT redirects $NSX_REDIRECTS
    fi
    if [[ "$AGENT_MODE" != "" ]]; then
        iniset /$Q_PLUGIN_CONF_FILE nsx agent_mode $AGENT_MODE
        if [[ "$AGENT_MODE" == "agentless" ]]; then
            if [[ "$DEFAULT_SERVICE_CLUSTER_UUID" != "" ]]; then
                iniset /$Q_PLUGIN_CONF_FILE DEFAULT default_service_cluster_uuid $DEFAULT_SERVICE_CLUSTER_UUID
            else
                die $LINENO "Agentless mode requires a service cluster."
            fi
            iniset /$Q_PLUGIN_CONF_FILE nsx_metadata metadata_server_address $Q_META_DATA_IP
        fi
    fi
}

function neutron_plugin_setup_interface_driver {
    local conf_file=$1
    iniset $conf_file DEFAULT interface_driver neutron.agent.linux.interface.OVSInterfaceDriver
}

function has_neutron_plugin_security_group {
    # 0 means True here
    return 0
}

function neutron_plugin_check_adv_test_requirements {
    is_service_enabled q-dhcp && return 0
}

# Restore xtrace
$MY_XTRACE
