#!/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

    iniset $NOVA_CONF DEFAULT compute_driver ironic.IronicDriver

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