Static Jenkins Site Generator

- Private Jenkins job scraping w/API key
- Added Gilroy font to match main public website
- Link back to ONF website for products
- Add more products

Change-Id: I3ed2dc1e371c564ee483ab83fd110a88d818bca7
diff --git a/templates/base.html b/templates/base.html
new file mode 100644
index 0000000..ca9bf0f
--- /dev/null
+++ b/templates/base.html
@@ -0,0 +1,31 @@
+{#
+SPDX-FileCopyrightText: &copy; 2020 Open Networking Foundation <support@opennetworking.org>
+SPDX-License-Identifier: Apache-2.0
+#}
+<html>
+<head>
+  {% block head %}
+  <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,400;1,700&display=swap" rel="stylesheet">
+  <link rel="stylesheet" href="/style.css" />
+  <script src="/scripts/list.min.js"></script>
+  <title>{% block title %}{{ title }}{% endblock %}</title>
+  {% endblock %}
+</head>
+<body>
+  <div class="header">
+    <a href="/"><img class="logo" src="/images/onf_logo.png" height="30px" width="30px"/></a>
+    <h1>{% block header %}{{ title }}{% endblock %}</h1>
+  </div>
+  <div class="content">
+    {% block content %}
+    <p>Base content, replace this block</p>
+    {% endblock %}
+  </div>
+  <footer class="footer">
+    {% block footer %}
+    &copy; 2020 <a href="https://opennetworking.org/">Open Networking Foundation</a><br/>
+    <div class="buildtime">Page generated at {{ buildtime }}.</right>
+    {% endblock %}
+  </footer>
+</body>
+</html>
diff --git a/templates/index.html b/templates/index.html
new file mode 100644
index 0000000..d01eff6
--- /dev/null
+++ b/templates/index.html
@@ -0,0 +1,22 @@
+{#
+SPDX-FileCopyrightText: &copy; 2020 Open Networking Foundation <support@opennetworking.org>
+SPDX-License-Identifier: Apache-2.0
+#}
+{% extends "base.html" %}
+{% block title %}ONF Continuous Certification Program{% endblock %}
+{% block header %}ONF Continuous Certification Program{% endblock %}
+{% block content %}
+
+<p>
+ONF's Continuous Certification Program is continually re-verifying supply chain products on a daily basis against the most recent versions of ONF open source software platforms, ensuring operators have a vibrant ecosystem of options for deploying ONF open source platforms.
+</p>
+
+<h2>ONF's CC Enabled Projects</h2>
+
+<ul>
+{% for project in projects | sort %}
+<li><a href="{{ project | replace(" ", "_") }}">{{ project }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/templates/product.html b/templates/product.html
new file mode 100644
index 0000000..27fecbd
--- /dev/null
+++ b/templates/product.html
@@ -0,0 +1,42 @@
+{#
+SPDX-FileCopyrightText: &copy; 2020 Open Networking Foundation <support@opennetworking.org>
+SPDX-License-Identifier: Apache-2.0
+#}
+{% extends "base.html" %}
+{% block title %}ONF Continuous Certification - {{ product_name }}{% endblock %}
+{% block header %}ONF Continuous Certification - {{ product_name }}{% endblock %}
+{% block content %}
+
+<p>
+<em>Certification Program:</em> {{ onf_project }}<br/>
+<em>Product Name:</em> <a href="{{ product_link }}">{{ product_name }}</a>
+</p>
+
+<div class="ccresults">
+{% for group_name, jobs in groups.items() %}
+<strong>Version: {{ group_name }}</strong><br/>
+{% for job_name, builds in jobs.items() %}
+<em>Job: {{ job_name }}</em><br/>
+{% set timebox = builds | timebox(24,10) %}
+<ul>
+{% for tb in timebox %}
+<li class="{{ tb.result }}">
+  {{ tb.box_start | tsdate }} - {{ tb.outcome }}<br/>
+  {% for build in tb.builds %}
+  {% if "build_url" in build %}
+  <a href="{{ build.build_url }}" class="{{ build.result }}">{{ build.id }}</a>
+  {% else %}
+  <span class="{{ build.result }}">{{ build.id }}</span>
+  {% endif %}
+  {% else %}
+  No Builds
+  {% endfor %}
+</li>
+{% endfor %}
+</ul>
+{% endfor %}
+{% else %}
+No Tests Currently Available
+{% endfor %}
+</div>
+{% endblock %}
diff --git a/templates/project.html b/templates/project.html
new file mode 100644
index 0000000..febda68
--- /dev/null
+++ b/templates/project.html
@@ -0,0 +1,46 @@
+{#
+SPDX-FileCopyrightText: &copy; 2020 Open Networking Foundation <support@opennetworking.org>
+SPDX-License-Identifier: Apache-2.0
+#}
+{% extends "base.html" %}
+{% block title %}ONF Continuous Certification - {{ project_name }}{% endblock %}
+{% block header %}ONF Continuous Certification - {{ project_name }}{% endblock %}
+{% block content %}
+
+<h2>Test Results</h2>
+
+{% for product in products | sort(attribute="product_name")%}
+<strong><a href="{{ product.product_name | replace(" ", "_") }}">{{ product.product_name }}</a></strong>
+{% set groups = product['groups'] %}
+
+<div class="ccresults">
+{% for group_name, jobs in groups.items() %}
+<strong>Version: {{ group_name }}</strong><br/>
+{% for job_name, builds in jobs.items() %}
+<em>Job: {{ job_name }}</em><br/>
+
+{% set timebox = builds | timebox(24,10) %}
+<ul>
+{% for tb in timebox %}
+<li class="{{ tb.result }}">
+  {{ tb.box_start | tsdate }} - {{ tb.outcome }}<br/>
+  {% for build in tb.builds %}
+  {% if "build_url" in build %}
+  <a href="{{ build.build_url }}" class="{{ build.result }}">{{ build.id }}</a>
+  {% else %}
+  <span class="{{ build.result }}">{{ build.id }}</span>
+  {% endif %}
+  {% else %}
+  No Builds
+  {% endfor %}
+</li>
+{% endfor %}
+</ul>
+{% endfor %}
+{% else %}
+No Tests Currently Available
+{% endfor %}
+</div>
+<br/>
+{% endfor %}
+{% endblock %}