Revert "Revert "FVP Linux and TFTF YAML Support""

This reverts commit a2946b2b5d0b3b9daa7ede0780ee4c535f637122.

Signed-off-by: Leonardo Sandoval <leonardo.sandoval@linaro.org>
Change-Id: I44c9b346b5548cc961f88eb40ce723943e66f2d0
diff --git a/fvp_utils.sh b/fvp_utils.sh
index c345af7..c6e8299 100644
--- a/fvp_utils.sh
+++ b/fvp_utils.sh
@@ -207,4 +207,97 @@
 	mv "$fvp_romlib_jmptbl_backup" "${tf_root:?}/plat/arm/board/fvp/jmptbl.i"
 }
 
+
+fvp_gen_bin_url() {
+    local bin_mode="${bin_mode:?}"
+    local bin="${1:?}"
+
+    if upon "$jenkins_run"; then
+        echo "$jenkins_url/job/$JOB_NAME/$BUILD_NUMBER/artifact/artefacts/$bin_mode/$bin"
+    else
+        echo "file://$workspace/artefacts/$bin_mode/$bin"
+    fi
+}
+
+gen_fvp_yaml_template() {
+    local yaml_template_file="$workspace/fvp_template.yaml"
+
+    # must parameters for yaml generation
+    local payload_type="${payload_type:?}"
+
+    "$ci_root/script/gen_fvp_${payload_type}_yaml.sh" > "$yaml_template_file"
+
+    archive_file "$yaml_template_file"
+}
+
+gen_fvp_yaml() {
+    local yaml_template_file="$workspace/fvp_template.yaml"
+    local yaml_file="$workspace/fvp.yaml"
+
+    # must parameters for yaml generation
+    local model="${model:?}"
+    local dtb="${dtb:?}"
+    local container_name="${container_name:?}"
+    local container_model_params="${container_model_params:?}"
+    local container_entrypoint="${container_entrypoint:?}"
+    local archive="${archive:?}"
+
+    # general artefacts
+    bl1="$(fvp_gen_bin_url bl1.bin)"
+    fip="$(fvp_gen_bin_url fip.bin)"
+
+    # linux artefacts
+    dtb="$(fvp_gen_bin_url $dtb)"
+    image="$(fvp_gen_bin_url kernel.bin)"
+    ramdisk="$(fvp_gen_bin_url initrd.bin)"
+
+    # tftf's ns_bl[1|2]u.bin artefacts
+    ns_bl1u="$(fvp_gen_bin_url ns_bl1u.bin)"
+    ns_bl2u="$(fvp_gen_bin_url ns_bl2u.bin)"
+
+    docker_registry="${docker_registry:-}"
+    docker_registry="$(docker_registry_append)"
+
+    docker_name="${docker_registry}$container_name"
+
+    version_string="\"ARM ${model}"' [^\\n]+'"\""
+
+    sed -e "s|\${ACTIONS_DEPLOY_IMAGES_BL1}|${bl1}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_FIP}|${fip}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_DTB}|${dtb}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_IMAGE}|${image}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_RAMDISK}|${ramdisk}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_NS_BL1U}|${ns_bl1u}|" \
+        -e "s|\${ACTIONS_DEPLOY_IMAGES_NS_BL2U}|${ns_bl2u}|" \
+        -e "s|\${BOOT_DOCKER_NAME}|${docker_name}|" \
+        -e "s|\${BOOT_IMAGE}|${container_entrypoint}|" \
+        -e "s|\${BOOT_VERSION_STRING}|${version_string}|" \
+        < "$yaml_template_file" \
+        > "$yaml_file"
+
+    # include the model parameters
+    while read -r line; do
+        if [ -n "$line" ]; then
+	    yaml_line="- \"${line}\""
+            sed -i -e "/\${BOOT_ARGUMENTS}/i \ \ \ \ $yaml_line" "$yaml_file"
+        fi
+    done < "$archive/model_params"
+    sed -i -e '/\${BOOT_ARGUMENTS}/d' "$yaml_file"
+
+    archive_file "$yaml_file"
+}
+
+docker_registry_append() {
+    # if docker_registry is empty, just use local docker registry
+    [ -z "$docker_registry" ] && return
+
+    local last=-1
+    local last_char="${docker_registry:last}"
+
+    if [ "$last_char" != '/' ]; then
+        docker_registry="${docker_registry}/";
+    fi
+    echo "$docker_registry"
+}
+
 set +u
diff --git a/run_config/fvp-cortexa35x4 b/run_config/fvp-cortexa35x4
index 0e33a77..10daf78 100644
--- a/run_config/fvp-cortexa35x4
+++ b/run_config/fvp-cortexa35x4
@@ -6,6 +6,14 @@
 #
 
 post_fetch_tf_resource() {
-	model="cortex-a35x4" gen_model_params
+	local model="cortex-a35x4"
+	model="$model" gen_model_params
 	uart="0" set_expect_variable "num_cpus" "4"
+
+	model="$model" \
+	dtb="fvp-base-gicv3-psci.dtb" \
+	container_name="fvp:fvp_base_cortex-a35x124_11.11_34" \
+	container_model_params="$archive/model_params" \
+	container_entrypoint="/opt/model/FVP_Base_Cortex-A35x124/models/Linux64_GCC-6.4/FVP_Base_Cortex-A35x4" \
+	gen_fvp_yaml
 }
diff --git a/run_config/fvp-linux b/run_config/fvp-linux
index ec823c6..426df4f 100644
--- a/run_config/fvp-linux
+++ b/run_config/fvp-linux
@@ -9,4 +9,6 @@
 	kernel_type="fvp-busybox-uboot" get_kernel
 	initrd_type="default" get_initrd
 	uart="0" file="linux-rd-busybox.exp" track_expect
+
+	payload_type="linux" gen_fvp_yaml_template
 }
diff --git a/run_config/fvp-tftf b/run_config/fvp-tftf
index cbf5086..3d53188 100644
--- a/run_config/fvp-tftf
+++ b/run_config/fvp-tftf
@@ -8,4 +8,6 @@
 fetch_tf_resource() {
 	uart="0" file="tftf.exp" track_expect
 	uart="1" file="hold_uart.exp" track_expect
+
+	payload_type="tftf" gen_fvp_yaml_template
 }
diff --git a/script/gen_fvp_linux_yaml.sh b/script/gen_fvp_linux_yaml.sh
new file mode 100755
index 0000000..7cf1315
--- /dev/null
+++ b/script/gen_fvp_linux_yaml.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# Generate a FVP-Linux model agnostic YAML template. Note that this template is not ready to be
+# sent to LAVA by Jenkins so in order to produce file, variables in ${UPPERCASE} must be replaced
+# to correct values
+
+cat <<EOF
+device_type: fvp
+job_name: tf-fvp
+
+timeouts:
+  connection:
+    minutes: 3
+  job:
+    minutes: 10
+  actions:
+    auto-login-action:
+      minutes: 5
+    http-download:
+      minutes: 2
+    download-retry:
+      minutes: 2
+    fvp-deploy:
+      minutes: 5
+
+priority: medium
+visibility: public
+
+actions:
+- deploy:
+    to: fvp
+    images:
+      bl1:
+        url: \${ACTIONS_DEPLOY_IMAGES_BL1}
+      fip:
+        url: \${ACTIONS_DEPLOY_IMAGES_FIP}
+      dtb:
+        url: \${ACTIONS_DEPLOY_IMAGES_DTB}
+      image:
+        url: \${ACTIONS_DEPLOY_IMAGES_IMAGE}
+      ramdisk:
+        url: \${ACTIONS_DEPLOY_IMAGES_RAMDISK}
+
+- boot:
+    method: fvp
+    docker:
+      name: \${BOOT_DOCKER_NAME}
+      local: true
+    image: \${BOOT_IMAGE}
+    version_string: \${BOOT_VERSION_STRING}
+    timeout:
+      minutes: 7
+    console_string: 'terminal_0: Listening for serial connection on port (?P<PORT>\d+)'
+    arguments:
+\${BOOT_ARGUMENTS}
+    prompts:
+    - '/ #'
+EOF
diff --git a/script/gen_fvp_tftf_yaml.sh b/script/gen_fvp_tftf_yaml.sh
new file mode 100755
index 0000000..56b10ad
--- /dev/null
+++ b/script/gen_fvp_tftf_yaml.sh
@@ -0,0 +1,78 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# Generate a FVP-TFTF model agnostic YAML template. Note that this template is not ready to be
+# sent to LAVA by Jenkins so in order to produce file, variables in ${UPPERCASE} must be replaced
+# to correct values
+
+cat <<EOF
+device_type: fvp
+job_name: tf-fvp
+
+timeouts:
+  connection:
+    minutes: 3
+  job:
+    minutes: 10
+  actions:
+    auto-login-action:
+      minutes: 5
+    http-download:
+      minutes: 2
+    download-retry:
+      minutes: 2
+    fvp-deploy:
+      minutes: 5
+
+priority: medium
+visibility: public
+
+actions:
+- deploy:
+    to: fvp
+    images:
+      bl1:
+        url: \${ACTIONS_DEPLOY_IMAGES_BL1}
+      fip:
+        url: \${ACTIONS_DEPLOY_IMAGES_FIP}
+      ns_bl1u:
+        url: \${ACTIONS_DEPLOY_IMAGES_NS_BL1U}
+      ns_bl2u:
+        url: \${ACTIONS_DEPLOY_IMAGES_NS_BL2U}
+
+- boot:
+    method: fvp
+    docker:
+      name: \${BOOT_DOCKER_NAME}
+      local: true
+    image: \${BOOT_IMAGE}
+    version_string: \${BOOT_VERSION_STRING}
+    timeout:
+      minutes: 30
+
+    monitors:
+    - name: TFTF
+      # LAVA looks for a testsuite start string...
+      start: 'Booting trusted firmware test framework'
+      # ...and a testsuite end string.
+      end: 'Exiting tests.'
+
+      # For each test case, LAVA looks for a string which includes the testcase
+      # name and result.
+      pattern: "(?s)> Executing '(?P<test_case_id>.+?(?='))'(.*)  TEST COMPLETE\\\s+(?P<result>(Skipped|Passed|Failed|Crashed))"
+
+      # Teach to LAVA how to interpret the TFTF Tests results.
+      fixupdict:
+        Passed: pass
+        Failed: fail
+        Crashed: fail
+        Skipped: skip
+
+    arguments:
+\${BOOT_ARGUMENTS}
+
+EOF
diff --git a/utils.sh b/utils.sh
index c0fd619..47a2df9 100644
--- a/utils.sh
+++ b/utils.sh
@@ -337,6 +337,8 @@
 "--hfa"
 )
 
+docker_registry="${docker_registry:-}"
+
 # Define toolchain version and toolchain binary paths
 toolchain_version="9.2-2019.12"