# Neutron Cisco plugin
# ---------------------------

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

# Scecify the VSM parameters
Q_CISCO_PLUGIN_VSM_IP=${Q_CISCO_PLUGIN_VSM_IP:-}
# Specify the VSM username
Q_CISCO_PLUGIN_VSM_USERNAME=${Q_CISCO_PLUGIN_VSM_USERNAME:-admin}
# Specify the VSM passward for above username
Q_CISCO_PLUGIN_VSM_PASSWORD=${Q_CISCO_PLUGIN_VSM_PASSWORD:-}
# Specify the uVEM integration bridge name
Q_CISCO_PLUGIN_INTEGRATION_BRIDGE=${Q_CISCO_PLUGIN_INTEGRATION_BRIDGE:-br-int}
# Specify if tunneling is enabled
Q_CISCO_PLUGIN_ENABLE_TUNNELING=${Q_CISCO_PLUGIN_ENABLE_TUNNELING:-True}
# Specify the VXLAN range
Q_CISCO_PLUGIN_VXLAN_ID_RANGES=${Q_CISCO_PLUGIN_VXLAN_ID_RANGES:-5000:10000}
# Specify the VLAN range
Q_CISCO_PLUGIN_VLAN_RANGES=${Q_CISCO_PLUGIN_VLAN_RANGES:-vlan:1:4094}

# Specify ncclient package information
NCCLIENT_DIR=$DEST/ncclient
NCCLIENT_VERSION=${NCCLIENT_VERSION:-0.3.1}
NCCLIENT_REPO=${NCCLIENT_REPO:-git://github.com/CiscoSystems/ncclient.git}
NCCLIENT_BRANCH=${NCCLIENT_BRANCH:-master}

# This routine put a prefix on an existing function name
function _prefix_function {
    declare -F $1 > /dev/null || die "$1 doesn't exist"
    eval "$(echo "${2}_${1}()"; declare -f ${1} | tail -n +2)"
}

function _has_ovs_subplugin {
    local subplugin
    for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
        if [[ "$subplugin" == "openvswitch" ]]; then
            return 0
        fi
    done
    return 1
}

function _has_nexus_subplugin {
    local subplugin
    for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
        if [[ "$subplugin" == "nexus" ]]; then
            return 0
        fi
    done
    return 1
}

function _has_n1kv_subplugin {
    local subplugin
    for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
        if [[ "$subplugin" == "n1kv" ]]; then
            return 0
        fi
    done
    return 1
}

# This routine populates the cisco config file with the information for
# a particular nexus switch
function _config_switch {
    local cisco_cfg_file=$1
    local switch_ip=$2
    local username=$3
    local password=$4
    local ssh_port=$5
    shift 5

    local section="NEXUS_SWITCH:$switch_ip"
    iniset $cisco_cfg_file $section username $username
    iniset $cisco_cfg_file $section password $password
    iniset $cisco_cfg_file $section ssh_port $ssh_port

    while [[ ${#@} != 0 ]]; do
        iniset  $cisco_cfg_file $section $1 $2
        shift 2
    done
}

# Prefix openvswitch plugin routines with "ovs" in order to differentiate from
# cisco plugin routines. This means, ovs plugin routines will coexist with cisco
# plugin routines in this script.
source $TOP_DIR/lib/neutron_plugins/openvswitch
_prefix_function neutron_plugin_create_nova_conf ovs
_prefix_function neutron_plugin_install_agent_packages ovs
_prefix_function neutron_plugin_configure_common ovs
_prefix_function neutron_plugin_configure_debug_command ovs
_prefix_function neutron_plugin_configure_dhcp_agent ovs
_prefix_function neutron_plugin_configure_l3_agent ovs
_prefix_function neutron_plugin_configure_plugin_agent ovs
_prefix_function neutron_plugin_configure_service ovs
_prefix_function neutron_plugin_setup_interface_driver ovs
_prefix_function has_neutron_plugin_security_group ovs

# Check the version of the installed ncclient package
function check_ncclient_version {
python << EOF
version = '$NCCLIENT_VERSION'
import sys
try:
    import pkg_resources
    import ncclient
    module_version = pkg_resources.get_distribution('ncclient').version
    if version != module_version:
        sys.exit(1)
except:
    sys.exit(1)
EOF
}

# Install the ncclient package
function install_ncclient {
    git_clone $NCCLIENT_REPO $NCCLIENT_DIR $NCCLIENT_BRANCH
    (cd $NCCLIENT_DIR; sudo python setup.py install)
}

# Check if the required version of ncclient has been installed
function is_ncclient_installed {
    # Check if the Cisco ncclient repository exists
    if [[ -d $NCCLIENT_DIR ]]; then
        remotes=$(cd $NCCLIENT_DIR; git remote -v | grep fetch | awk '{ print $2}')
        for remote in $remotes; do
            if [[ $remote == $NCCLIENT_REPO ]]; then
                break;
            fi
        done
        if [[ $remote != $NCCLIENT_REPO ]]; then
            return 1
        fi
    else
        return 1
    fi

    # Check if the ncclient is installed with the right version
    if ! check_ncclient_version; then
        return 1
    fi
    return 0
}

function has_neutron_plugin_security_group {
    if _has_ovs_subplugin; then
        ovs_has_neutron_plugin_security_group
    else
        return 1
    fi
}

function is_neutron_ovs_base_plugin {
    # Cisco uses OVS if openvswitch subplugin is deployed
    _has_ovs_subplugin
    return
}

# populate required nova configuration parameters
function neutron_plugin_create_nova_conf {
    if _has_ovs_subplugin; then
        ovs_neutron_plugin_create_nova_conf
    else
        _neutron_ovs_base_configure_nova_vif_driver
    fi
}

function neutron_plugin_install_agent_packages {
    # Cisco plugin uses openvswitch to operate in one of its configurations
    ovs_neutron_plugin_install_agent_packages
}

# Configure common parameters
function neutron_plugin_configure_common {
    # setup default subplugins
    if [ ! -v Q_CISCO_PLUGIN_SUBPLUGINS ]; then
        declare -ga Q_CISCO_PLUGIN_SUBPLUGINS
        Q_CISCO_PLUGIN_SUBPLUGINS=(openvswitch nexus)
    fi
    if _has_ovs_subplugin; then
        ovs_neutron_plugin_configure_common
        Q_PLUGIN_EXTRA_CONF_PATH=etc/neutron/plugins/cisco
        Q_PLUGIN_EXTRA_CONF_FILES=(cisco_plugins.ini)
        # Copy extra config files to /etc so that they can be modified
        # later according to Cisco-specific localrc settings.
        mkdir -p /$Q_PLUGIN_EXTRA_CONF_PATH
        local f
        local extra_conf_file
        for (( f=0; $f < ${#Q_PLUGIN_EXTRA_CONF_FILES[@]}; f+=1 )); do
            extra_conf_file=$Q_PLUGIN_EXTRA_CONF_PATH/${Q_PLUGIN_EXTRA_CONF_FILES[$f]}
            cp $NEUTRON_DIR/$extra_conf_file /$extra_conf_file
        done
    else
        Q_PLUGIN_CONF_PATH=etc/neutron/plugins/cisco
        Q_PLUGIN_CONF_FILENAME=cisco_plugins.ini
    fi
    Q_PLUGIN_CLASS="neutron.plugins.cisco.network_plugin.PluginV2"
}

function neutron_plugin_configure_debug_command {
    if _has_ovs_subplugin; then
        ovs_neutron_plugin_configure_debug_command
    fi
}

function neutron_plugin_configure_dhcp_agent {
    iniset $Q_DHCP_CONF_FILE DEFAULT dhcp_agent_manager neutron.agent.dhcp_agent.DhcpAgentWithStateReport
}

function neutron_plugin_configure_l3_agent {
    if _has_ovs_subplugin; then
        ovs_neutron_plugin_configure_l3_agent
    fi
}

function _configure_nexus_subplugin {
    local cisco_cfg_file=$1

    # Install a known compatible ncclient from the Cisco repository if necessary
    if ! is_ncclient_installed; then
        # Preserve the two global variables
        local offline=$OFFLINE
        local reclone=$RECLONE
        # Change their values to allow installation
        OFFLINE=False
        RECLONE=yes
        install_ncclient
        # Restore their values
        OFFLINE=$offline
        RECLONE=$reclone
    fi

    # Setup default nexus switch information
    if [ ! -v Q_CISCO_PLUGIN_SWITCH_INFO ]; then
        declare -A Q_CISCO_PLUGIN_SWITCH_INFO
        HOST_NAME=$(hostname)
        Q_CISCO_PLUGIN_SWITCH_INFO=([1.1.1.1]=stack:stack:22:${HOST_NAME}:1/10)
    else
        iniset $cisco_cfg_file CISCO nexus_driver neutron.plugins.cisco.nexus.cisco_nexus_network_driver_v2.CiscoNEXUSDriver
    fi

    # Setup the switch configurations
    local nswitch
    local sw_info
    local segment
    local sw_info_array
    declare -i count=0
    for nswitch in ${!Q_CISCO_PLUGIN_SWITCH_INFO[@]}; do
        sw_info=${Q_CISCO_PLUGIN_SWITCH_INFO[$nswitch]}
        sw_info_array=${sw_info//:/ }
        sw_info_array=( $sw_info_array )
        count=${#sw_info_array[@]}
        if [[ $count < 5 || $(( ($count-3) % 2 )) != 0 ]]; then
            die $LINENO "Incorrect switch configuration: ${Q_CISCO_PLUGIN_SWITCH_INFO[$nswitch]}"
        fi
        _config_switch $cisco_cfg_file $nswitch ${sw_info_array[@]}
    done
}

# Configure n1kv plugin
function _configure_n1kv_subplugin {
    local cisco_cfg_file=$1

    # populate the cisco plugin cfg file with the VSM information
    echo "Configuring n1kv in $cisco_cfg_file-- $Q_CISCO_PLUGIN_VSM_IP $Q_CISCO_PLUGIN_VSM_USERNAME $Q_CISCO_PLUGIN_VSM_PASSWORD"
    iniset $cisco_cfg_file N1KV:$Q_CISCO_PLUGIN_VSM_IP username $Q_CISCO_PLUGIN_VSM_USERNAME
    iniset $cisco_cfg_file N1KV:$Q_CISCO_PLUGIN_VSM_IP password $Q_CISCO_PLUGIN_VSM_PASSWORD

    iniset $cisco_cfg_file CISCO_N1K integration_bridge $Q_CISCO_PLUGIN_INTEGRATION_BRIDGE
    iniset $cisco_cfg_file CISCO_N1K enable_tunneling $Q_CISCO_PLUGIN_ENABLE_TUNNELING
    iniset $cisco_cfg_file CISCO_N1K vxlan_id_ranges $Q_CISCO_PLUGIN_VXLAN_ID_RANGES
    iniset $cisco_cfg_file CISCO_N1K network_vlan_ranges $Q_CISCO_PLUGIN_VLAN_RANGES

    # Setup the integration bridge by calling the ovs_base
    OVS_BRIDGE=$Q_CISCO_PLUGIN_INTEGRATION_BRIDGE
    _neutron_ovs_base_setup_bridge $OVS_BRIDGE
}

function neutron_plugin_configure_plugin_agent {
    if _has_ovs_subplugin; then
        ovs_neutron_plugin_configure_plugin_agent
    fi
}

function neutron_plugin_configure_service {
    local subplugin
    local cisco_cfg_file

    if _has_ovs_subplugin; then
        ovs_neutron_plugin_configure_service
        cisco_cfg_file=/${Q_PLUGIN_EXTRA_CONF_FILES[0]}
    else
        cisco_cfg_file=/$Q_PLUGIN_CONF_FILE
    fi

    # Setup the [CISCO_PLUGINS] section
    if [[ ${#Q_CISCO_PLUGIN_SUBPLUGINS[@]} > 2 ]]; then
        die $LINENO "At most two subplugins are supported."
    fi

    if _has_ovs_subplugin && _has_n1kv_subplugin; then
        die $LINENO "OVS subplugin and n1kv subplugin cannot coexist"
    fi

    # Setup the subplugins
    inicomment $cisco_cfg_file CISCO_PLUGINS nexus_plugin
    inicomment $cisco_cfg_file CISCO_PLUGINS vswitch_plugin
    inicomment $cisco_cfg_file CISCO_TEST host
    for subplugin in ${Q_CISCO_PLUGIN_SUBPLUGINS[@]}; do
        case $subplugin in
            nexus) iniset $cisco_cfg_file CISCO_PLUGINS nexus_plugin neutron.plugins.cisco.nexus.cisco_nexus_plugin_v2.NexusPlugin;;
            openvswitch) iniset $cisco_cfg_file CISCO_PLUGINS vswitch_plugin neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2;;
            n1kv) iniset $cisco_cfg_file CISCO_PLUGINS vswitch_plugin neutron.plugins.cisco.n1kv.n1kv_neutron_plugin.N1kvNeutronPluginV2;;
            *) die $LINENO "Unsupported cisco subplugin: $subplugin";;
        esac
    done

    if _has_nexus_subplugin; then
        _configure_nexus_subplugin $cisco_cfg_file
    fi

    if _has_n1kv_subplugin; then
        _configure_n1kv_subplugin $cisco_cfg_file
    fi
}

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

# Restore xtrace
$CISCO_XTRACE
