#!/usr/bin/env bash
#
# Copyright (c) 2021 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

# Given the name of the release (e.g., 18.04), this script downloads all
# Linaro release archives to the current directory, verifies, extracts, and
# finally removes the archive files.

# FVP launcher: Script that generates docker and baremetal commands based on LAVA
# log stored at [TF Open CI](http://ci.trustedfirmware.org/)
#
# Usage:
# Run the `fvp-launcher.sh` script, providing a https://ci.trustedfirmware.org/view/TF-A/job/tf-a-builder/
# job as parameter, for example
#
# $ ./fvp-launcher.sh https://ci.trustedfirmware.org/job/tf-a-builder/252606/
#
# executon will fetch all artefacts locally and finally generating the two commands: docker and baremetal commands,
# any can be run depending on the scenario.


# safe execution
set -ue

function r_curl(){
    local target="$1"
    local source="$2"
    curl --connect-timeout 5 --retry 5 --retry-delay 1 -fsSLo "$1" "$2"
}

declare -A saveas
declare -A urls

## Must params
JENKINS_PUBLIC_URL="${1:?}"


## Optional params passed through env variables
USE_LOCAL_IMAGE="${USE_LOCAL_IMAGE:-false}"
NO_ARM_LICENSE="${NO_ARM_LICENSE:-true}"
NO_TTY="${NO_TTY:-true}"
LAVA_LOG="${LAVA_LOG:-./lava.log}"
DOCKER_CMDS_FILE="${DOCKER_CMDS_FILE:-./docker.txt}"
BM_CMDS_FILE="${BM_CMDS_FILE:-./bm.txt}"

JENKINS_PUBLIC_URL="${JENKINS_PUBLIC_URL}/artifact/lava.log"


# Fetch the LAVA log
r_curl "${LAVA_LOG}" "${JENKINS_PUBLIC_URL}"

# Get download directories from the lava log
i=1
for sa in $(awk '/saving as/ {print $4}' $LAVA_LOG); do
    # NOTE the leading dot, which modifies original LAVA paths
    saveas[$i]=".$sa"
    i=$((i + 1))
done

i=1
# Get the artefacts from the lava log
for url in $(awk '/downloading/ {print $3}' $LAVA_LOG); do
    urls[$i]="$url"
    i=$((i + 1))
done

total=$((i -1))

# Fetch artefacts and place it under top dir
mkdir -p $PWD/lava
i=1
for i in $(seq $total); do
    u=${urls[$i]}
    o=${saveas[$i]}

    mkdir -p $(dirname $o)

    # Just fetch in case artefact is not present
    if [ ! -f $o ]; then
       r_curl "$o" "$u"
    fi
    cp -f $o $PWD/lava
done

# allow docker to use local X windows
xhost + > /dev/null

rm -f ${DOCKER_CMDS_FILE} ${BM_CMDS_FILE}

grep -o -E 'docker run .*' $LAVA_LOG | tail -1 | while read line; do
    cmd="$line"
    cmd="$(echo $cmd | sed -e 's;docker run;docker run --env="DISPLAY" --net=host ;g')"

    if [[ "${NO_TTY}" == "true" ]]; then
        cmd="$(echo $cmd | sed 's/--tty//g')"
    fi

    if [[ "${NO_ARM_LICENSE}" == "true" ]]; then
        cmd="$(echo $cmd | sed 's/-e ARMLMD_LICENSE_FILE=27000@ci.trustedfirmware.org//g')"
    fi

    if [[ "${USE_LOCAL_IMAGE}" == "true" ]]; then
        cmd="$(echo $cmd | sed 's/${PRIVATE_CONTAINER_REGISTRY}\///g')"
    fi

    docker_cmd="$(echo $cmd | sed "s;--volume /;--volume $PWD/;g")"

    # Point model parameters to local lava folder
    bm_cmd=""
    for token in $docker_cmd; do
        bm_token="$(echo $token | sed "s;=/lava.*/;=$PWD/lava/;g")"
        bm_cmd="$bm_cmd $bm_token "
    done

    # trim the docker leading code
    bm_cmd="$(echo "${bm_cmd}" | sed 's;.* /opt/model;/opt/model;g')"

    echo "$docker_cmd" >> $DOCKER_CMDS_FILE
    echo "$bm_cmd" >> $BM_CMDS_FILE

done

echo "Docker command"
echo
cat $DOCKER_CMDS_FILE
echo

echo "Baremetal command"
echo
cat $BM_CMDS_FILE
echo

