#!/bin/bash
#
# lib/nova_plugins/hypervisor-xenserver
# Configure the XenServer hypervisor

# Enable with:
# VIRT_DRIVER=xenserver

# Dependencies:
# ``functions`` file
# ``nova`` configuration

# install_nova_hypervisor - install any external requirements
# configure_nova_hypervisor - make configuration changes, including those to other services
# start_nova_hypervisor - start any external services
# stop_nova_hypervisor - stop any external services
# cleanup_nova_hypervisor - remove transient data and cache

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


# Defaults
# --------

VNCSERVER_PROXYCLIENT_ADDRESS=${VNCSERVER_PROXYCLIENT_ADDRESS=169.254.0.1}


# Entry Points
# ------------

# clean_nova_hypervisor - Clean up an installation
function cleanup_nova_hypervisor {
    # This function intentionally left blank
    :
}

# configure_nova_hypervisor - Set config files, create data dirs, etc
function configure_nova_hypervisor {
    if [ -z "$XENAPI_CONNECTION_URL" ]; then
        die $LINENO "XENAPI_CONNECTION_URL is not specified"
    fi

    # Check os-xenapi plugin is enabled
    local plugins="${DEVSTACK_PLUGINS}"
    local plugin
    local found=0
    for plugin in ${plugins//,/ }; do
        if [[ "$plugin" = "os-xenapi" ]]; then
            found=1
            break
        fi
    done
    if [[ $found -ne 1 ]]; then
        die $LINENO "os-xenapi plugin is not specified. Please enable this plugin in local.conf"
    fi

    read_password XENAPI_PASSWORD "ENTER A PASSWORD TO USE FOR XEN."
    iniset $NOVA_CONF DEFAULT compute_driver "xenapi.XenAPIDriver"
    iniset $NOVA_CONF xenserver connection_url "$XENAPI_CONNECTION_URL"
    iniset $NOVA_CONF xenserver connection_username "$XENAPI_USER"
    iniset $NOVA_CONF xenserver connection_password "$XENAPI_PASSWORD"
    iniset $NOVA_CONF DEFAULT flat_injected "False"
    # Need to avoid crash due to new firewall support
    XEN_FIREWALL_DRIVER=${XEN_FIREWALL_DRIVER:-"nova.virt.firewall.IptablesFirewallDriver"}
    iniset $NOVA_CONF DEFAULT firewall_driver "$XEN_FIREWALL_DRIVER"

    local dom0_ip
    dom0_ip=$(echo "$XENAPI_CONNECTION_URL" | cut -d "/" -f 3-)

    local ssh_dom0
    ssh_dom0="sudo -u $DOMZERO_USER ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@$dom0_ip"

    # install console logrotate script
    tar -czf - -C $NOVA_DIR/tools/xenserver/ rotate_xen_guest_logs.sh |
        $ssh_dom0 'tar -xzf - -C /root/ && chmod +x /root/rotate_xen_guest_logs.sh && mkdir -p /var/log/xen/guest'

    # Create a cron job that will rotate guest logs
    $ssh_dom0 crontab - << CRONTAB
* * * * * /root/rotate_xen_guest_logs.sh >/dev/null 2>&1
CRONTAB

}

# install_nova_hypervisor() - Install external components
function install_nova_hypervisor {
    # xenapi functionality is now included in os-xenapi library which houses the plugin
    # so this function intentionally left blank
    :
}

# start_nova_hypervisor - Start any required external services
function start_nova_hypervisor {
    # This function intentionally left blank
    :
}

# stop_nova_hypervisor - Stop any external services
function stop_nova_hypervisor {
    # This function intentionally left blank
    :
}


# Restore xtrace
$_XTRACE_XENSERVER

# Local variables:
# mode: shell-script
# End:
