#!/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 {
    configure_libvirt
    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
    iniset $NOVA_CONF DEFAULT scheduler_host_manager ironic_host_manager

    if [[ "$IRONIC_USE_RESOURCE_CLASSES" == "False" ]]; then
        iniset $NOVA_CONF filter_scheduler use_baremetal_filters True
        iniset $NOVA_CONF filter_scheduler host_subset_size 999
        iniset $NOVA_CONF DEFAULT ram_allocation_ratio 1.0
        iniset $NOVA_CONF DEFAULT reserved_host_memory_mb 0
    fi

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

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