#!/bin/bash
#
# lib/nova_plugins/hypervisor-ironic
# Configure the ironic hypervisor

# Enable with:
# VIRT_DRIVER=ironic

# 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_HYP_IRONIC=$(set +o | grep xtrace)
set +o xtrace

source $TOP_DIR/lib/nova_plugins/functions-libvirt

# Defaults
# --------

# 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 ! is_ironic_hardware; then
        configure_libvirt
    fi
    LIBVIRT_FIREWALL_DRIVER=${LIBVIRT_FIREWALL_DRIVER:-"nova.virt.firewall.NoopFirewallDriver"}

    iniset $NOVA_CONF DEFAULT compute_driver ironic.IronicDriver
    iniset $NOVA_CONF DEFAULT firewall_driver $LIBVIRT_FIREWALL_DRIVER

    # ironic section
    iniset $NOVA_CONF ironic auth_type password
    iniset $NOVA_CONF ironic username admin
    iniset $NOVA_CONF ironic password $ADMIN_PASSWORD
    iniset $NOVA_CONF ironic auth_url $KEYSTONE_AUTH_URI
    iniset $NOVA_CONF ironic project_domain_id default
    iniset $NOVA_CONF ironic user_domain_id default
    iniset $NOVA_CONF ironic project_name demo
    iniset $NOVA_CONF ironic region_name $REGION_NAME

    # These are used with crufty legacy ironicclient
    iniset $NOVA_CONF ironic api_max_retries 300
    iniset $NOVA_CONF ironic api_retry_interval 5
    # These are used with shiny new openstacksdk
    iniset $NOVA_CONF ironic connect_retries 300
    iniset $NOVA_CONF ironic connect_retry_delay 5
    iniset $NOVA_CONF ironic status_code_retries 300
    iniset $NOVA_CONF ironic status_code_retry_delay 5
}

# install_nova_hypervisor() - Install external components
function install_nova_hypervisor {
    if is_ironic_hardware; then
        return
    fi
    install_libvirt
    if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] && is_ubuntu; then
        # Ubuntu packaging+apparmor issue prevents libvirt from loading
        # the ROM from /usr/share/misc.  Workaround by installing it directly
        # to a directory that it can read from. (LP: #1393548)
        sudo rm -rf /usr/share/qemu/sgabios.bin
        sudo cp /usr/share/misc/sgabios.bin /usr/share/qemu/sgabios.bin
    fi
}

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

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