Initial commit for TF-A CI scripts

Signed-off-by: Fathi Boudra <fathi.boudra@linaro.org>
diff --git a/script/coverity_summary.py b/script/coverity_summary.py
new file mode 100755
index 0000000..f6a2087
--- /dev/null
+++ b/script/coverity_summary.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#
+# Given URL to a job instance, this script walks the job hierarchy, and inspects
+# for Coverity scan report. CIDs from individual reports are collected and
+# printed as a summary of defects for the entire scan.
+
+import argparse
+import coverity_parser
+import job_walker
+import json
+import sys
+import urllib.request
+
+parser = argparse.ArgumentParser()
+parser.add_argument("build_url",
+    help="URL to specific build number to walk")
+opts = parser.parse_args()
+
+# Parse the given job
+top = job_walker.JobInstance(opts.build_url)
+top.parse()
+
+# Iterate through terminal jobs, i.e., those with a config, viz. tf-worker
+merged_issues = {}
+for job in filter(lambda j: j.config, top.walk()):
+    # Collect CIDs from archived defects.json
+    try:
+        # Open json as text, not bytes
+        with job.open_artefact("defects.json", text=True) as fd:
+            issues = json.load(fd)
+    except urllib.error.HTTPError:
+        print("warning: unable to read defects.json from " + job.url,
+                file=sys.stderr)
+        continue
+
+    merged_issues.update({coverity_parser.make_key(i): i for i in issues})
+
+# Sort merged issues by file name, line number, checker, and then CID.
+sorted_issue_keys = sorted(merged_issues.keys())
+
+if sorted_issue_keys:
+    # Generate HTML table with issue description
+    print("""
+<style>
+#coverity-table {
+  display: block;
+  max-height: 600px;
+  overflow-y: auto;
+}
+#coverity-table thead td {
+  font-weight: bold;
+}
+#coverity-table td {
+  font-size: 0.9em;
+}
+#coverity-table .cov-file {
+  color: brown;
+}
+#coverity-table .cov-line {
+  color: darkviolet;
+}
+#coverity-table .cov-cid {
+  color: orangered;
+}
+#coverity-table .cov-mandatory {
+  background-color: #ff4d4d;
+}
+#coverity-table .cov-required {
+  background-color: #ffcccc;
+}
+</style>
+<table id="coverity-table" cellpadding="2">
+<thead>
+<tr>
+  <td>File</td>
+  <td>Line</td>
+  <td>Checker</td>
+  <td>CID</td>
+  <td>Description</td>
+</tr>
+</thead><tbody>""")
+    for key in sorted_issue_keys:
+        print(coverity_parser.format_issue_html(merged_issues[key]))
+    print("</tbody></table>")
+    print('<div style="line-height: 3em; font-weight: bold;">{} defects reported.</div>'.format(
+        len(sorted_issue_keys)))