Tests: generate_partitions_json.py

Implemented script to generate a json file that is to be used by
'hftest.py':
- To fetch the partitions' image;
- To fetch manifest file and append to spmc manifest, to expand the
'hypervisor' node with the respective partition's info.

Change-Id: I31965864af4e9d13dff781804fd9fa10bf67d654
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/build/image/generate_partitions_json.py b/build/image/generate_partitions_json.py
new file mode 100644
index 0000000..5a36141
--- /dev/null
+++ b/build/image/generate_partitions_json.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+#
+# Copyright 2020 The Hafnium Authors.
+#
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file or at
+# https://opensource.org/licenses/BSD-3-Clause.
+
+import argparse
+import sys
+import os
+import json
+
+"""
+This script aims at generating a json file that contains the artifacts of
+partitions that will execute alongside in the same test setup.
+A partition can be:
+ - Virtual Machine (VM) - to execute in EL1;
+ - Secure Partition (SP) - to execute in S-EL1.
+
+A setup can have multiple VMs and multiple SPs executing alongside.
+The json file shall list the VMs and SPs, such as:
+{
+    "SPs" : [ <SP information>, ... , <SPx Information>],
+    "VMs" : [ <VM information>, ... , <VMx Information>]
+}
+
+Where the information of each partition shall obey the following format:
+{
+     "img" : <path to partition package>.img,
+     "dts" : <path to manifest>.dts
+}
+
+In the arguments of this script provide the path to partition's artifacts
+separated by the character defined as 'ARG_SPLITTER'. Example:
+--sp <path to img>,<path to dts>
+--vm <path to img>,<path to dts>
+"""
+
+ARG_SPLITTER = ','
+ARG_FORMAT = f"<img>{ARG_SPLITTER}<dts>"
+
+def split_partition_arg(sp_arg : str):
+    ret = sp_arg.split(ARG_SPLITTER)
+    if len(ret) != 2:
+        raise Exception(f"Argument should follow format {ARG_FORMAT}")
+    return ret
+
+def partition_info(img, dts):
+    return {"img": img, "dts": dts}
+
+def list_of_partitions(partitions : list):
+    return [partition_info(*split_partition_arg(p)) for p in partitions]
+
+def Main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--sp", action="append")
+    parser.add_argument("--vm", action="append")
+    parser.add_argument("--out", action="store", required=True)
+    args = parser.parse_args()
+
+    #Arguments sanity check:
+    if args.vm is None and args.sp is None:
+        raise Exception("Specify at least one VM (--vm) or one SP (--sp)")
+
+    partitions = dict()
+    if args.sp is not None:
+        partitions["SPs"] = list_of_partitions(args.sp)
+    if args.vm is not None:
+        partitions["VMs"] = list_of_partitions(args.vm)
+
+    json.dump(partitions, open(args.out, "w+"))
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(Main())