# lib/tempest
# Install and configure Tempest

# Dependencies:
# ``functions`` file
# ``lib/nova`` service is runing
# <list other global vars that are assumed to be defined>
# - ``DEST``, ``FILES``
# - ``ADMIN_PASSWORD``
# - ``DEFAULT_IMAGE_NAME``
# - ``S3_SERVICE_PORT``
# - ``SERVICE_HOST``
# - ``BASE_SQL_CONN`` ``lib/database`` declares
# - ``PUBLIC_NETWORK_NAME``
# - ``Q_USE_NAMESPACE``
# - ``Q_ROUTER_NAME``
# - ``VIRT_DRIVER``
# - ``LIBVIRT_TYPE``
# - ``KEYSTONE_SERVICE_PROTOCOL``, ``KEYSTONE_SERVICE_HOST`` from lib/keystone
# Optional Dependencies:
# ALT_* (similar vars exists in keystone_data.sh)
# ``LIVE_MIGRATION_AVAILABLE``
# ``USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION``
# ``DEFAULT_INSTANCE_TYPE``
# ``DEFAULT_INSTANCE_USER``
# ``stack.sh`` calls the entry points in this order:
#
# install_tempest
# configure_tempest
# init_tempest

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


# Defaults
# --------

# Set up default directories
TEMPEST_DIR=$DEST/tempest
TEMPEST_CONF_DIR=$TEMPEST_DIR/etc
TEMPEST_CONF=$TEMPEST_CONF_DIR/tempest.conf

NOVA_SOURCE_DIR=$DEST/nova

BUILD_INTERVAL=3
BUILD_TIMEOUT=400


BOTO_MATERIALS_PATH="$FILES/images/s3-materials/cirros-0.3.0"

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

# configure_tempest() - Set config files, create data dirs, etc
function configure_tempest() {
    setup_develop $TEMPEST_DIR
    local image_lines
    local images
    local num_images
    local image_uuid
    local image_uuid_alt
    local errexit
    local password
    local line
    local flavors
    local flavors_ref
    local flavor_lines
    local public_network_id
    local public_router_id
    local tenant_networks_reachable
    local boto_instance_type="m1.tiny"

    # TODO(afazekas):
    # sudo python setup.py deploy

    # This function exits on an error so that errors don't compound and you see
    # only the first error that occured.
    errexit=$(set +o | grep errexit)
    set -o errexit

    # Save IFS
    ifs=$IFS

    # Glance should already contain images to be used in tempest
    # testing. Here we simply look for images stored in Glance
    # and set the appropriate variables for use in the tempest config
    # We ignore ramdisk and kernel images, look for the default image
    # ``DEFAULT_IMAGE_NAME``. If not found, we set the ``image_uuid`` to the
    # first image returned and set ``image_uuid_alt`` to the second,
    # if there is more than one returned...
    # ... Also ensure we only take active images, so we don't get snapshots in process
    declare -a images

    while read -r IMAGE_NAME IMAGE_UUID; do
        if [ "$IMAGE_NAME" = "$DEFAULT_IMAGE_NAME" ]; then
            image_uuid="$IMAGE_UUID"
            image_uuid_alt="$IMAGE_UUID"
        fi
        images+=($IMAGE_UUID)
    done < <(glance image-list --status=active | awk -F'|' '!/^(+--)|ID|aki|ari/ { print $3,$2 }')

    case "${#images[*]}" in
        0)
            echo "Found no valid images to use!"
            exit 1
            ;;
        1)
            if [ -z "$image_uuid" ]; then
                image_uuid=${images[0]}
                image_uuid_alt=${images[0]}
            fi
            ;;
        *)
            if [ -z "$image_uuid" ]; then
                image_uuid=${images[0]}
                image_uuid_alt=${images[1]}
            fi
            ;;
    esac

    # Create tempest.conf from tempest.conf.sample
    # copy every time, because the image UUIDS are going to change
    cp $TEMPEST_CONF.sample $TEMPEST_CONF

    password=${ADMIN_PASSWORD:-secrete}

    # See files/keystone_data.sh where alt_demo user
    # and tenant are set up...
    ALT_USERNAME=${ALT_USERNAME:-alt_demo}
    ALT_TENANT_NAME=${ALT_TENANT_NAME:-alt_demo}

    # If the ``DEFAULT_INSTANCE_TYPE`` not declared, use the new behavior
    # Tempest creates instane types for himself
    if  [[ -z "$DEFAULT_INSTANCE_TYPE" ]]; then
        nova flavor-create m1.nano 42 64 0 1
        flavor_ref=42
        boto_instance_type=m1.nano
        nova flavor-create m1.micro 84 128 0 1
        flavor_ref_alt=84
    else
        # Check Nova for existing flavors and, if set, look for the
        # ``DEFAULT_INSTANCE_TYPE`` and use that.
        boto_instance_type=$DEFAULT_INSTANCE_TYPE
        flavor_lines=`nova flavor-list`
        IFS=$'\r\n'
        flavors=""
        for line in $flavor_lines; do
            f=$(echo $line | awk "/ $DEFAULT_INSTANCE_TYPE / { print \$2 }")
            flavors="$flavors $f"
        done

        for line in $flavor_lines; do
            flavors="$flavors `echo $line | grep -v "^\(|\s*ID\|+--\)" | cut -d' ' -f2`"
        done

        IFS=" "
        flavors=($flavors)
        num_flavors=${#flavors[*]}
        echo "Found $num_flavors flavors"
        if [[ $num_flavors -eq 0 ]]; then
            echo "Found no valid flavors to use!"
            exit 1
        fi
        flavor_ref=${flavors[0]}
        flavor_ref_alt=$flavor_ref
        if [[ $num_flavors -gt 1 ]]; then
            flavor_ref_alt=${flavors[1]}
        fi
    fi

    if [ "$Q_USE_NAMESPACE" != "False" ]; then
        tenant_networks_reachable=false
    else
        tenant_networks_reachable=true
    fi

    if is_service_enabled q-l3; then
        public_network_id=$(quantum net-list | grep $PUBLIC_NETWORK_NAME | \
            awk '{print $2}')
        if [ "$Q_USE_NAMESPACE" == "False" ]; then
            # If namespaces are disabled, devstack will create a single
            # public router that tempest should be configured to use.
            public_router_id=$(quantum router-list | awk "/ $Q_ROUTER_NAME / \
               { print \$2 }")
        fi
    fi

    # Timeouts
    iniset $TEMPEST_CONF compute build_timeout $BUILD_TIMEOUT
    iniset $TEMPEST_CONF volume build_timeout $BUILD_TIMEOUT
    iniset $TEMPEST_CONF boto build_timeout $BUILD_TIMEOUT
    iniset $TEMPEST_CONF compute build_interval $BUILD_INTERVAL
    iniset $TEMPEST_CONF volume build_interval $BUILD_INTERVAL
    iniset $TEMPEST_CONF boto build_interval $BUILD_INTERVAL
    iniset $TEMPEST_CONF boto http_socket_timeout 5

    # Identity
    iniset $TEMPEST_CONF identity uri "$KEYSTONE_SERVICE_PROTOCOL://$KEYSTONE_SERVICE_HOST:5000/v2.0/"
    iniset $TEMPEST_CONF identity password "$password"
    iniset $TEMPEST_CONF identity alt_username $ALT_USERNAME
    iniset $TEMPEST_CONF identity alt_password "$password"
    iniset $TEMPEST_CONF identity alt_tenant_name $ALT_TENANT_NAME
    iniset $TEMPEST_CONF identity admin_password "$password"

    # Compute
    iniset $TEMPEST_CONF compute password "$password" # DEPRECATED
    iniset $TEMPEST_CONF compute alt_username $ALT_USERNAME # DEPRECATED
    iniset $TEMPEST_CONF compute alt_password "$password" # DEPRECATED
    iniset $TEMPEST_CONF compute alt_tenant_name $ALT_TENANT_NAME # DEPRECATED
    iniset $TEMPEST_CONF compute resize_available False
    iniset $TEMPEST_CONF compute change_password_available False
    iniset $TEMPEST_CONF compute compute_log_level ERROR
    # Note(nati) current tempest don't create network for each tenant
    # so reuse same tenant for now
    if is_service_enabled quantum; then
        TEMPEST_ALLOW_TENANT_ISOLATION=${TEMPEST_ALLOW_TENANT_ISOLATION:-False}
    fi
    iniset $TEMPEST_CONF compute allow_tenant_isolation ${TEMPEST_ALLOW_TENANT_ISOLATION:-True}
    #Skip until #1074039 is fixed
    iniset $TEMPEST_CONF compute run_ssh False
    iniset $TEMPEST_CONF compute ssh_user ${DEFAULT_INSTANCE_USER:-cirros} # DEPRECATED
    iniset $TEMPEST_CONF compute network_for_ssh $PRIVATE_NETWORK_NAME
    iniset $TEMPEST_CONF compute ip_version_for_ssh 4
    iniset $TEMPEST_CONF compute ssh_timeout $BUILD_TIMEOUT
    iniset $TEMPEST_CONF compute image_ref $image_uuid
    iniset $TEMPEST_CONF compute image_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
    iniset $TEMPEST_CONF compute image_ref_alt $image_uuid_alt
    iniset $TEMPEST_CONF compute image_alt_ssh_user ${DEFAULT_INSTANCE_USER:-cirros}
    iniset $TEMPEST_CONF compute flavor_ref $flavor_ref
    iniset $TEMPEST_CONF compute flavor_ref_alt $flavor_ref_alt
    iniset $TEMPEST_CONF compute live_migration_available ${LIVE_MIGRATION_AVAILABLE:-False}
    iniset $TEMPEST_CONF compute use_block_migration_for_live_migration ${USE_BLOCK_MIGRATION_FOR_LIVE_MIGRATION:-False}
    iniset $TEMPEST_CONF compute source_dir $NOVA_SOURCE_DIR # DEPRECATED
    iniset $TEMPEST_CONF compute bin_dir $NOVA_BIN_DIR # DEPRECATED
    iniset $TEMPEST_CONF compute path_to_private_key $TEMPEST_DIR/id_rsa # DEPRECATED
    iniset $TEMPEST_CONF compute db_uri $BASE_SQL_CONN/nova # DEPRECATED

    # Whitebox
    iniset $TEMPEST_CONF whitebox source_dir $NOVA_SOURCE_DIR
    iniset $TEMPEST_CONF whitebox bin_dir $NOVA_BIN_DIR
    # TODO(jaypipes): Create the key file here... right now, no whitebox
    # tests actually use a key.
    iniset $TEMPEST_CONF whitebox path_to_private_key $TEMPEST_DIR/id_rsa
    iniset $TEMPEST_CONF whitebox db_uri $BASE_SQL_CONN/nova


    # image
    iniset $TEMPEST_CONF image password "$password" # DEPRECATED

    # identity-admin
    iniset $TEMPEST_CONF "identity-admin" password "$password" # DEPRECATED

    # compute admin
    iniset $TEMPEST_CONF "compute-admin" password "$password" # DEPRECATED

    # network admin
    iniset $TEMPEST_CONF "network-admin" password "$password" # DEPRECATED

    # network
    iniset $TEMPEST_CONF network api_version 2.0
    iniset $TEMPEST_CONF network password "$password" # DEPRECATED
    iniset $TEMPEST_CONF network tenant_networks_reachable "$tenant_networks_reachable"
    iniset $TEMPEST_CONF network public_network_id "$public_network_id"
    iniset $TEMPEST_CONF network public_router_id "$public_router_id"

    #boto
    iniset $TEMPEST_CONF boto ec2_url "http://$SERVICE_HOST:8773/services/Cloud"
    iniset $TEMPEST_CONF boto s3_url "http://$SERVICE_HOST:${S3_SERVICE_PORT:-3333}"
    iniset $TEMPEST_CONF boto s3_materials_path "$BOTO_MATERIALS_PATH"
    iniset $TEMPEST_CONF boto instance_type "$boto_instance_type"
    iniset $TEMPEST_CONF boto http_socket_timeout 30
    iniset $TEMPEST_CONF boto ssh_user ${DEFAULT_INSTANCE_USER:-cirros}

    echo "Created tempest configuration file:"
    cat $TEMPEST_CONF

    # Restore IFS
    IFS=$ifs
    #Restore errexit
    $errexit
}

# install_tempest() - Collect source and prepare
function install_tempest() {
    git_clone $TEMPEST_REPO $TEMPEST_DIR $TEMPEST_BRANCH

    # Tempest doesn't satisfy its dependencies on its own, so
    # install them here instead.
    pip_install -r $TEMPEST_DIR/tools/pip-requires
}

# init_tempest() - Initialize ec2 images
function init_tempest() {
    local base_image_name=cirros-0.3.0-x86_64
    # /opt/stack/devstack/files/images/cirros-0.3.0-x86_64-uec
    local image_dir="$FILES/images/${base_image_name}-uec"
    local kernel="$image_dir/${base_image_name}-vmlinuz"
    local ramdisk="$image_dir/${base_image_name}-initrd"
    local disk_image="$image_dir/${base_image_name}-blank.img"
    # if the cirros uec downloaded and the system is uec capable
    if [ -f "$kernel" -a -f "$ramdisk" -a -f "$disk_image" -a  "$VIRT_DRIVER" != "openvz" \
         -a \( "$LIBVIRT_TYPE" != "lxc" -o "$VIRT_DRIVER" != "libvirt" \) ]; then
       echo "Prepare aki/ari/ami Images"
       ( #new namespace
           # tenant:demo ; user: demo
           source $TOP_DIR/accrc/demo/demo
           euca-bundle-image -i "$kernel" --kernel true -d "$BOTO_MATERIALS_PATH"
           euca-bundle-image -i "$ramdisk" --ramdisk true -d "$BOTO_MATERIALS_PATH"
           euca-bundle-image -i "$disk_image" -d "$BOTO_MATERIALS_PATH"
       ) 2>&1 </dev/null | cat
    else
        echo "Boto materials are not prepared"
    fi
}

# Restore xtrace
$XTRACE
