aboutsummaryrefslogtreecommitdiffstats
path: root/src/onaptests/templates
diff options
context:
space:
mode:
Diffstat (limited to 'src/onaptests/templates')
-rw-r--r--src/onaptests/templates/status/base.html.j2261
-rw-r--r--src/onaptests/templates/status/container_log.html.j2104
-rw-r--r--src/onaptests/templates/status/container_versions.html.j238
-rw-r--r--src/onaptests/templates/status/daemonset.html.j215
-rw-r--r--src/onaptests/templates/status/deployment.html.j215
-rw-r--r--src/onaptests/templates/status/index.html.j2376
-rw-r--r--src/onaptests/templates/status/job.html.j215
-rw-r--r--src/onaptests/templates/status/pod.html.j2101
-rw-r--r--src/onaptests/templates/status/raw_output.txt.j228
-rw-r--r--src/onaptests/templates/status/replicaset.html.j215
-rw-r--r--src/onaptests/templates/status/service.html.j245
-rw-r--r--src/onaptests/templates/status/statefulset.html.j215
-rw-r--r--src/onaptests/templates/status/version.html.j228
13 files changed, 1056 insertions, 0 deletions
diff --git a/src/onaptests/templates/status/base.html.j2 b/src/onaptests/templates/status/base.html.j2
new file mode 100644
index 0000000..41e55de
--- /dev/null
+++ b/src/onaptests/templates/status/base.html.j2
@@ -0,0 +1,261 @@
+{% macro color(failing, total) %}
+{% if failing == 0 %}
+is-success
+{% else %}
+{% if (failing / total) <= 0.1 %}
+is-warning
+{% else %}
+is-danger
+{% endif %}
+{% endif %}
+{% endmacro %}
+
+{% macro percentage(failing, total) %}
+{{ ((total - failing) / total) | round }}
+{% endmacro %}
+
+{% macro statistic(resource_name, failing, total) %}
+{% set success = total - failing %}
+<div class="level-item has-text-centered">
+ <div>
+ <p class="heading">{{ resource_name | capitalize }}</p>
+ <p class="title">{{ success }}/{{ total }}</p>
+ <progress class="progress {{ color(failing, total) }}" value="{{ success }}" max="{{ total }}">{{ percentage(failing, total) }}</progress>
+ </div>
+ </div>
+{% endmacro %}
+
+{% macro pods_table(pods) %}
+<div id="pods" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Ready</th>
+ <th>Status</th>
+ <th>Reason</th>
+ <th>Restarts</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for pod in pods %}
+ <tr>
+ <td><a href="./pod-{{ pod.name }}.html" title="{{ pod.name }}">{{ pod.k8s.metadata.name }}</a></td>
+ {% if pod.init_done %}
+ <td>{{ pod.running_containers }}/{{ (pod.containers | length) }}</td>
+ {% else %}
+ <td>Init:{{ pod.runned_init_containers }}/{{ (pod.init_containers | length) }}</td>
+ {% endif %}
+ <td>{{ pod.k8s.status.phase }}</td>
+ <td>{{ pod.k8s.status.reason }}</td>
+ {% if pod.init_done %}
+ <td>{{ pod.restart_count }}</td>
+ {% else %}
+ <td>{{ pod.init_restart_count }}</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+</div>
+{% endmacro %}
+
+{% macro key_value_description_list(title, dict) %}
+<dt><strong>{{ title | capitalize }}:</strong></dt>
+<dd>
+ {% if dict %}
+ {% for key, value in dict.items() %}
+ {% if loop.first %}
+ <dl>
+ {% endif %}
+ <dt>{{ key }}:</dt>
+ <dd>{{ value }}</dd>
+ {% if loop.last %}
+ </dl>
+ {% endif %}
+ {% endfor %}
+ {% endif %}
+</dd>
+{% endmacro %}
+
+{% macro description(k8s) %}
+<div class="container">
+ <h1 class="title is-1">Description</h1>
+ <div class="content">
+ <dl>
+ {% if k8s.spec.type %}
+ <dt><strong>Type:</strong></dt>
+ <dd>{{ k8s.spec.type }}</dd>
+ {% if (k8s.spec.type | lower) == "clusterip" %}
+ <dt><strong>Headless:</strong></dt>
+ <dd>{% if (k8s.spec.cluster_ip | lower) == "none" %}Yes{% else %}No{% endif %}</dd>
+ {% endif %}
+ {% endif %}
+ {{ key_value_description_list('Labels', k8s.metadata.labels) | indent(width=6) }}
+ {{ key_value_description_list('Annotations', k8s.metadata.annotations) | indent(width=6) }}
+ {% if k8s.spec.selector %}
+ {% if k8s.spec.selector.match_labels %}
+ {{ key_value_description_list('Selector', k8s.spec.selector.match_labels) | indent(width=6) }}
+ {% else %}
+ {{ key_value_description_list('Selector', k8s.spec.selector) | indent(width=6) }}
+ {% endif %}
+ {% endif %}
+ {% if k8s.phase %}
+ <dt><strong>Status:</strong></dt>
+ <dd>{{ k8s.phase }}</dd>
+ {% endif %}
+ {% if k8s.metadata.owner_references %}
+ <dt><strong>Controlled By:</strong></dt>
+ <dd>{{ k8s.metadata.owner_references[0].kind }}/{{ k8s.metadata.owner_references[0].name }}</dd>
+ {% endif %}
+ </dl>
+ </div>
+</div>
+{% endmacro %}
+
+{% macro pods_container(pods, parent, has_title=True) %}
+<div class="container">
+ {% if has_title %}
+ <h1 class="title is-1">Pods</h1>
+ {% endif %}
+ {% if (pods | length) > 0 %}
+ {{ pods_table(pods) | indent(width=2) }}
+ {% else %}
+ <div class="notification is-warning">{{ parent }} has no pods!</div>
+ {% endif %}
+</div>
+{% endmacro %}
+
+{% macro two_level_breadcrumb(title, name) %}
+<section class="section">
+ <div class="container">
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li><a href="./index.html">Summary</a></li>
+ <li class="is-active"><a href="#" aria-current="page">{{ title | capitalize }} {{ name }}</a></li>
+ </ul>
+ </nav>
+ </div>
+</section>
+{% endmacro %}
+
+{% macro pod_parent_summary(title, name, failed_pods, pods) %}
+{{ summary(title, name, [{'title': 'Pod', 'failing': failed_pods, 'total': (pods | length)}]) }}
+{% endmacro %}
+
+{% macro number_ok(number, none_value, total=None) %}
+{% if number %}
+{% if total and number < total %}
+<span class="tag is-warning">{{ number }}</span>
+{% else %}
+{{ number }}
+{% endif %}
+{% else %}
+<span class="tag is-warning">{{ none_value }}</span>
+{% endif %}
+{% endmacro %}
+
+{% macro summary(title, name, statistics) %}
+<section class="hero is-light">
+ <div class="hero-body">
+ <div class="container">
+ <h1 class="title is-1">
+ {{ title | capitalize }} {{ name }} Summary
+ </h1>
+ <nav class="level">
+ {% for stat in statistics %}
+ {% if stat.total > 0 %}
+ {{ statistic(stat.title, stat.failing, stat.total) | indent(width=8) }}
+ {% endif %}
+ {% endfor %}
+ </nav>
+ </div>
+ </div>
+</section>
+{% endmacro %}
+
+{% macro events(events) %}
+{% if events %}
+<div class="container">
+ <h1 class="title is-1">Events</h1>
+ <div class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Type</th>
+ <th>Count</th>
+ <th>Reason</th>
+ <th>Message</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for event in events %}
+ <tr>
+ <td><span class="tag {% if (event.type | lower) == 'normal' %}is-info{% else %}is-warning{% endif %}">{{ event.type }}</span></td>
+ <td>{{ event.count }}</td>
+ <td>{{ event.reason }}</td>
+ <td>{{ event.message }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+</div>
+{% endif %}
+{% endmacro %}
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Tests results - {% block title %}{% endblock %}</title>
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css">
+ <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
+ {% block more_head %}{% endblock %}
+ </head>
+ <body>
+ <nav class="navbar" role="navigation" aria-label="main navigation">
+ <div class="navbar-brand">
+ <a class="navbar-item" href="https://www.onap.org">
+ <img src="https://www.onap.org/wp-content/uploads/sites/20/2017/02/logo_onap_2017.png">
+ </a>
+
+ <a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample">
+ <span aria-hidden="true"></span>
+ <span aria-hidden="true"></span>
+ <span aria-hidden="true"></span>
+ </a>
+ </div>
+
+ <div id="navbarBasicExample" class="navbar-menu">
+ <div class="navbar-start" href="./index.html">
+ <a class="navbar-item">
+ Summary
+ </a>
+ </div>
+ </div>
+ </nav>
+
+ {% block content %}{% endblock %}
+
+ <footer class="footer">
+ <div class="container">
+ <div class="columns">
+ <div class="column">
+ <p class="has-text-grey-light">
+ <a href="https://bulma.io/made-with-bulma/">
+ <img src="https://bulma.io/images/made-with-bulma.png" alt="Made with Bulma" width="128" height="24">
+ </a>
+ </div>
+ <div class="column">
+ <a class="has-text-grey" href="https://gitlab.com/Orange-OpenSource/lfn/tools/kubernetes-status" style="border-bottom: 1px solid currentColor;">
+ Improve this page on Gitlab
+ </a>
+ </p>
+ </div>
+ </div>
+ </div>
+ </footer>
+ </body>
+</html>
diff --git a/src/onaptests/templates/status/container_log.html.j2 b/src/onaptests/templates/status/container_log.html.j2
new file mode 100644
index 0000000..454dee7
--- /dev/null
+++ b/src/onaptests/templates/status/container_log.html.j2
@@ -0,0 +1,104 @@
+{% extends "base.html.j2" %}
+{% block title %}Container {{ container.name }} from pod {{ pod_name }} logs{% endblock %}
+{% block content %}
+ <section class="section">
+ <div class="container">
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li><a href="./index.html">Summary</a></li>
+ <li><a href="./pod-{{ pod_name }}.html" title="{{ pod_name }}">Pod {{pod_name }}</a></li>
+ <li class="is-active"><a href="#" aria-current="page">Container {{ container.name }} logs</a></li>
+ </ul>
+ </nav>
+ </div>
+ </section>
+ <section class="section">
+ <div class="container">
+ <h1 class="title is-1">
+ Results
+ </h1>
+ <p class="subtitle">
+ By type
+ </p>
+ <div class="tabs is-centered">
+ <ul>
+ <li id="logs_toggle"><a onclick="toggleVisibility('logs')">Logs</a></li>
+ {% if old_logs %}
+ <li id="old_logs_toggle"><a onclick="toggleVisibility('old_logs')">Previous Logs</a></li>
+ {% endif %}
+ {% if log_files %}
+ {% for file in log_files %}
+ <li id="{{ file.split('.')[0].split('/')[-1] }}_toggle"><a onclick="toggleVisibility('{{ file.split('.')[0].split('/')[-1] }}')">{{ file }}</a></li>
+ {% endfor %}
+ {% endif %}
+ </ul>
+ </div>
+ <section class="section">
+ <div id="logs" class="container">
+ <div class="columns is-mobile is-centered">
+ <div class="column is-half">
+ <a class="button is-link is-fullwidth" href="./pod-{{ pod_name }}-{{ container.name }}.log">raw version</a>
+ </div>
+ </div>
+ <pre>
+ <code>{{ logs }}</code>
+ <pre>
+ </div>
+ {% if old_logs %}
+ <div id="old_logs" class="container">
+ <div class="columns is-mobile is-centered">
+ <div class="column is-half">
+ <a class="button is-link is-fullwidth" href="./pod-{{ pod_name }}-{{ container.name }}.old.log">raw version</a>
+ </div>
+ </div>
+ <pre>
+ <code>{{ old_logs }}</code>
+ <pre>
+ </div>
+ {% endif %}
+ {% if log_files %}
+ {% for file in log_files %}
+ <div id="{{ file.split('.')[0].split('/')[-1] }}" class="container">
+ <div class="columns is-mobile is-centered">
+ <div class="column is-half">
+ <a class="button is-link is-fullwidth" href="./pod-{{ pod_name }}-{{ container.name }}-{{ file.split('.')[0].split('/')[-1] }}.log">raw version</a>
+ </div>
+ </div>
+ <pre>
+ <code>{{ log_files[file] }}</code>
+ <pre>
+ </div>
+ {% endfor %}
+ {% endif %}
+ </section>
+{% endblock %}
+
+{% block more_head %}
+ <script language="JavaScript">
+ function toggleVisibility(id) {
+ document.getElementById('logs').style.display = 'none';
+ {% if old_logs %}
+ document.getElementById('old_logs').style.display = 'none';
+ {% endif %}
+ {% if log_files %}
+ {% for file in log_files %}
+ document.getElementById('{{ file.split('.')[0].split('/')[-1] }}').style.display = 'none';
+ {% endfor %}
+ {% endif %}
+ document.getElementById(id).style.display = 'inline';
+ document.getElementById('logs_toggle').classList.remove("is-active");
+ {% if old_logs %}
+ document.getElementById('old_logs_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if log_files %}
+ {% for file in log_files %}
+ document.getElementById('{{ file.split('.')[0].split('/')[-1] }}_toggle').classList.remove("is-active");
+ {% endfor %}
+ {% endif %}
+ document.getElementById(id + '_toggle').classList.add("is-active");
+ }
+ document.addEventListener('readystatechange', () => {
+ if (document.readyState == 'complete') toggleVisibility('logs');
+ });
+ </script>
+{% endblock %}
diff --git a/src/onaptests/templates/status/container_versions.html.j2 b/src/onaptests/templates/status/container_versions.html.j2
new file mode 100644
index 0000000..d3d283d
--- /dev/null
+++ b/src/onaptests/templates/status/container_versions.html.j2
@@ -0,0 +1,38 @@
+
+{% extends "base.html.j2" %}
+{% block title %}ONAP Docker Versions{% endblock %}
+
+{% block content %}
+<section class="section">
+ <div class=container>
+ <h1 class="title is-1">ONAP Docker versions</h1>
+ <table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth">
+ <thead>
+ <tr>
+ <th>Container</th>
+ <th>Version</th>
+ <th>Repositories</th>
+ <th>Components using it</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for container in containers.keys()|sort %}
+ <tr>
+ <td class="container" rowspan="{{ containers[container]['number_components'] }}">{{ container }}</td>
+ {% for version in containers[container]['versions'].keys()|sort %}
+ <td class="version" rowspan="{{ containers[container]['versions'][version]['components']|length }}">{{ version }}</td>
+ <td class="repositories" rowspan="{{ containers[container]['versions'][version]['components']|length }}">{% for repository in containers[container]['versions'][version]['repositories'] %}{{ repository }}{% if not loop.last %}, {% endif %}{% endfor %}</td>
+ {% for component in containers[container]['versions'][version]['components']|sort %}
+ {% if not loop.first %}
+ <tr>
+ {% endif %}
+ <td class="component">{{ component }}</td>
+ </tr>
+ {% endfor %}
+ {% endfor %}
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+</section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/daemonset.html.j2 b/src/onaptests/templates/status/daemonset.html.j2
new file mode 100644
index 0000000..2d76280
--- /dev/null
+++ b/src/onaptests/templates/status/daemonset.html.j2
@@ -0,0 +1,15 @@
+{% extends "base.html.j2" %}
+{% block title %}DaemonSet {{ daemonset.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('DaemonSet', daemonset.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('DaemonSet', daemonset.name, daemonset.failed_pods, daemonset.pods) }}
+
+ <section class="section">
+ {{ description(daemonset.k8s) | indent(width=6) }}
+
+ {{ pods_container(daemonset.pods, "DaemonSet") | indent(width=6) }}
+
+ {{ events(daemonset.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/deployment.html.j2 b/src/onaptests/templates/status/deployment.html.j2
new file mode 100644
index 0000000..53a0bbb
--- /dev/null
+++ b/src/onaptests/templates/status/deployment.html.j2
@@ -0,0 +1,15 @@
+{% extends "base.html.j2" %}
+{% block title %}Deployment {{ deployment.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('Deployment', deployment.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('Deployment', deployment.name, deployment.failed_pods, deployment.pods) }}
+
+ <section class="section">
+ {{ description(deployment.k8s) | indent(width=6) }}
+
+ {{ pods_container(deployment.pods, "Deployment") | indent(width=6) }}
+
+ {{ events(deployment.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/index.html.j2 b/src/onaptests/templates/status/index.html.j2
new file mode 100644
index 0000000..fe49abf
--- /dev/null
+++ b/src/onaptests/templates/status/index.html.j2
@@ -0,0 +1,376 @@
+{% extends "base.html.j2" %}
+{% block title %}Summary{% endblock %}
+{% block content %}
+ <section class="section">
+ <div class="container">
+ <nav class="breadcrumb" aria-label="breadcrumbs">
+ <ul>
+ <li class="is-active"><a href="./index.html" aria-current="page">Summary</a></li>
+ <li><a href="./versions.html" aria-current="page">Versions</a></li>
+ </ul>
+ </nav>
+ </div>
+ </section>
+
+ {{ summary('Results', "", [
+ { 'title': 'Jobs', 'failing': (ns.failing_jobs | length), 'total': (ns.jobs | length)},
+ { 'title': 'Deployments', 'failing': (ns.failing_deployments | length), 'total': (ns.deployments | length)},
+ { 'title': 'Replicasets', 'failing': (ns.failing_replicasets | length), 'total': (ns.replicasets | length)},
+ { 'title': 'StatefulSets', 'failing': (ns.failing_statefulsets | length), 'total': (ns.statefulsets | length)},
+ { 'title': 'DaemonSets', 'failing': (ns.failing_daemonsets | length), 'total': (ns.daemonsets | length)},
+ { 'title': 'Persistent Volume Claims', 'failing': (ns.failing_pvcs | length), 'total': (ns.pvcs | length)}])
+ }}
+
+ <section class="section">
+ <div class="container">
+ <h1 class="title is-1">
+ Results
+ </h1>
+ <p class="subtitle">
+ By type
+ </p>
+ <div class="tabs is-centered">
+ <ul>
+ <li id="pods_toggle"><a onclick="toggleVisibility('pods')">Pods</a></li>
+ <li id="services_toggle"><a onclick="toggleVisibility('services')">Services</a></li>
+ {% if (ns.jobs | length) > 0 %}
+ <li id="jobs_toggle"><a onclick="toggleVisibility('jobs')">Jobs</a></li>
+ {% endif %}
+ {% if (ns.deployments | length) > 0 %}
+ <li id="deployments_toggle"><a onclick="toggleVisibility('deployments')">Deployments</a></li>
+ {% endif %}
+ {% if (ns.replicasets | length) > 0 %}
+ <li id="replicasets_toggle"><a onclick="toggleVisibility('replicasets')">Replicasets</a></li>
+ {% endif %}
+ {% if (ns.statefulsets | length) > 0 %}
+ <li id="statefulsets_toggle"><a onclick="toggleVisibility('statefulsets')">StatefulSets</a></li>
+ {% endif %}
+ {% if (ns.daemonsets | length) > 0 %}
+ <li id="daemonsets_toggle"><a onclick="toggleVisibility('daemonsets')">DaemonSets</a></li>
+ {% endif %}
+ {% if (ns.pvcs | length) > 0 %}
+ <li id="pvcs_toggle"><a onclick="toggleVisibility('pvcs')">Persistent Volume Claims</a></li>
+ {% endif %}
+ {% if (ns.configmaps | length) > 0 %}
+ <li id="configmaps_toggle"><a onclick="toggleVisibility('configmaps')">Config Maps</a></li>
+ {% endif %}
+ {% if (ns.secrets | length) > 0 %}
+ <li id="secrets_toggle"><a onclick="toggleVisibility('secrets')">Secrets</a></li>
+ {% endif %}
+ {% if (ns.ingresses | length) > 0 %}
+ <li id="ingresses_toggle"><a onclick="toggleVisibility('ingresses')">Ingresses</a></li>
+ {% endif %}
+ </ul>
+ </div>
+
+ <!-- Pods table -->
+ {{ pods_container(ns.pods, "Namespace", has_title=False) | indent(width=6) }}
+
+ <!-- Services table -->
+ <div id="services" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Type</th>
+ <th>Ports</th>
+ <th>Pods selected</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for service in ns.services %}
+ <tr>
+ <td><a href="./service-{{ service.name }}.html" title="{{ service.name }}">{{ service.name }}</a></td>
+ <td>{{ service.type }}</td>
+ <td>
+ {% if service.k8s.spec.ports %}
+ {% for port in service.k8s.spec.ports %}
+ {{ port.port }}{% if port.node_port %}:{{ port.node_port }}{% endif %}/{{ port.protocol }}{% if not loop.last %},{% endif %}
+ {% endfor %}
+ {% else %}
+ <span class="tag is-warning">No Ports!</span>
+ {% endif %}
+ </td>
+ <td>{% if (service.pods | length) > 0 %}{{ service.pods | length }}{% else %}<span class="tag is-warning">0</span>{% endif %}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+
+ {% if (ns.jobs | length) > 0 %}
+ <!-- Jobs table -->
+ <div id="jobs" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Completions</th>
+ <th>Duration</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for job in ns.jobs %}
+ <tr>
+ <td><a href="./job-{{ job.name }}.html" title="{{ job.name }}">{{ job.name }}</a></td>
+ <td>{% if job.k8s.status.succeeded %}{{ job.k8s.status.succeeded }}{% else %}0{% endif %}/{{ job.k8s.spec.completions }}</td>
+ <td>{% if job.k8s.status.completion_time %}{{ delta(job.k8s.status.completion_time, job.k8s.status.start_time)[0] }}{% else %}<span class="tag is-warning">N/A</span>{% endif %}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.deployments | length) > 0 %}
+ <!-- Deployments table -->
+ <div id="deployments" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Ready</th>
+ <th>Up to Date</th>
+ <th>Available</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for deployment in ns.deployments %}
+ <tr>
+ <td><a href="./deployment-{{ deployment.name }}.html" title="{{ deployment.name }}">{{ deployment.name }}</a></td>
+ <td>{% if deployment.k8s.status.ready_replicas %}{{ deployment.k8s.status.ready_replicas }}{% else %}0{% endif %}/{{ deployment.k8s.spec.replicas }}</td>
+ <td>{{ number_ok(deployment.k8s.status.updated_replicas, '0', total=deployment.k8s.spec.replicas) }}</td>
+ <td>{{ number_ok(deployment.k8s.status.available_replicas, '0', total=deployment.k8s.spec.replicas) }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.replicasets | length) > 0 %}
+ <!-- ReplicaSets table -->
+ <div id="replicasets" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Ready</th>
+ <th>Available</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for rs in ns.replicasets %}
+ <tr>
+ <td><a href="./replicaset-{{ rs.name }}.html" title="{{ rs.name }}">{{ rs.name }}</a></td>
+ <td>{% if rs.k8s.status.ready_replicas %}{{ rs.k8s.status.ready_replicas }}{% else %}0{% endif %}/{{ rs.k8s.spec.replicas }}</td>
+ <td>{{ number_ok(rs.k8s.status.available_replicas, '0', total=rs.k8s.spec.replicas) }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.statefulsets | length) > 0 %}
+ <!-- StatefulSets table -->
+ <div id="statefulsets" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Ready</th>
+ <th>Up to Date</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for sts in ns.statefulsets %}
+ <tr>
+ <td><a href="./statefulset-{{ sts.name }}.html" title="{{ sts.name }}">{{ sts.name }}</a></td>
+ <td>{% if sts.k8s.status.ready_replicas %}{{ sts.k8s.status.ready_replicas }}{% else %}0{% endif %}/{{ sts.k8s.spec.replicas }}</td>
+ <td>{{ number_ok(sts.k8s.status.updated_replicas, '0', total=sts.k8s.spec.replicas) }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.daemonsets | length) > 0 %}
+ <!-- DaemonSets table -->
+ <div id="daemonsets" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Desired</th>
+ <th>Current</th>
+ <th>Ready</th>
+ <th>Up to Date</th>
+ <th>Available</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for ds in ns.daemonsets %}
+ <tr>
+ <td><a href="./daemoset-{{ ds.name }}.html" title="{{ ds.name }}">{{ ds.name }}</a></td>
+ <td>{{ sts.k8s.status.desired_number_scheduled }}</td>
+ <td>{{ number_ok(sts.k8s.status.current_number_scheduled, '0', total=sts.k8s.spec.desired_number_scheduled) }}</td>
+ <td>{{ number_ok(sts.k8s.status.number_ready, '0', total=sts.k8s.spec.desired_number_scheduled) }}</td>
+ <td>{{ number_ok(sts.k8s.status.updated_number_scheduled, '0', total=sts.k8s.spec.desired_number_scheduled) }}</td>
+ <td>{{ number_ok(sts.k8s.status.number_available, '0', total=sts.k8s.spec.desired_number_scheduled) }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.pvcs | length) > 0 %}
+ <!-- PVCs table -->
+ <div id="pvcs" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Status</th>
+ <th>Volume</th>
+ <th>Capacity</th>
+ <th>Access Modes</th>
+ <th>Storage Class</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for pvc in ns.pvcs %}
+ <tr>
+ <td>{{ pvc.name }}</td>
+ <td>{% if (pvc.k8s.status.phase | lower) == "bound" %}{{ pvc.k8s.status.phase }}{% else %}<span class="tag is-warning">{{ pvc.k8s.status.phase }}</span>{% endif %}</td>
+ <td>{% if pvc.k8s.spec.volume_name %}{{ pvc.k8s.spec.volume_name }}{% endif %}</td>
+ <td>{% if pvc.k8s.status.capacity %}{{ pvc.k8s.status.capacity.storage }}{% endif %}</td>
+ <td>{% if pvc.k8s.status.access_modes %}{{ pvc.k8s.status.capacity.access_modes | join(', ') }}{% endif %}</td>
+ <td>{% if pvc.k8s.spec.storage_class_name %}{{ pvc.k8s.spec.storage_class_name }}{% endif %}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.configmaps | length) > 0 %}
+ <!-- ConfigMaps table -->
+ <div id="configmaps" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for cm in ns.configmaps %}
+ <tr>
+ <td>{{ cm.name }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.secrets | length) > 0 %}
+ <!-- Secrets table -->
+ <div id="secrets" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for secret in ns.secrets %}
+ <tr>
+ <td>{{ secret.name }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% endif %}
+
+ {% if (ns.ingresses | length) > 0 %}
+ <div id="ingresses"></div>
+ {% endif %}
+
+ </div>
+{% endblock %}
+
+{% block more_head %}
+ <script language="JavaScript">
+ function toggleVisibility(id) {
+ document.getElementById('pods').style.display = 'none';
+ document.getElementById('services').style.display = 'none';
+ {% if (ns.jobs | length) > 0 %}
+ document.getElementById('jobs').style.display = 'none';
+ {% endif %}
+ {% if (ns.deployments | length) > 0 %}
+ document.getElementById('deployments').style.display = 'none';
+ {% endif %}
+ {% if (ns.replicasets | length) > 0 %}
+ document.getElementById('replicasets').style.display = 'none';
+ {% endif %}
+ {% if (ns.statefulsets | length) > 0 %}
+ document.getElementById('statefulsets').style.display = 'none';
+ {% endif %}
+ {% if (ns.daemonsets | length) > 0 %}
+ document.getElementById('daemonsets').style.display = 'none';
+ {% endif %}
+ {% if (ns.pvcs | length) > 0 %}
+ document.getElementById('pvcs').style.display = 'none';
+ {% endif %}
+ {% if (ns.configmaps | length) > 0 %}
+ document.getElementById('configmaps').style.display = 'none';
+ {% endif %}
+ {% if (ns.secrets | length) > 0 %}
+ document.getElementById('secrets').style.display = 'none';
+ {% endif %}
+ {% if (ns.ingresses | length) > 0 %}
+ document.getElementById('ingresses').style.display = 'none';
+ {% endif %}
+ document.getElementById(id).style.display = 'inline';
+ document.getElementById('pods_toggle').classList.remove("is-active");
+ document.getElementById('services_toggle').classList.remove("is-active");
+ {% if (ns.jobs | length) > 0 %}
+ document.getElementById('jobs_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.deployments | length) > 0 %}
+ document.getElementById('deployments_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.replicasets | length) > 0 %}
+ document.getElementById('replicasets_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.statefulsets | length) > 0 %}
+ document.getElementById('statefulsets_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.daemonsets | length) > 0 %}
+ document.getElementById('daemonsets_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.pvcs | length) > 0 %}
+ document.getElementById('pvcs_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.configmaps | length) > 0 %}
+ document.getElementById('configmaps_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.secrets | length) > 0 %}
+ document.getElementById('secrets_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.ingresses | length) > 0 %}
+ document.getElementById('ingresses_toggle').classList.remove("is-active");
+ {% endif %}
+ {% if (ns.deployments | length) > 0 %}
+ document.getElementById(id + '_toggle').classList.add("is-active");
+ {% endif %}
+ }
+ document.addEventListener('readystatechange', () => {
+ if (document.readyState == 'complete') toggleVisibility('pods');
+ });
+ </script>
+{% endblock %}
diff --git a/src/onaptests/templates/status/job.html.j2 b/src/onaptests/templates/status/job.html.j2
new file mode 100644
index 0000000..7915ff2
--- /dev/null
+++ b/src/onaptests/templates/status/job.html.j2
@@ -0,0 +1,15 @@
+{% extends "base.html.j2" %}
+{% block title %}Job {{ job.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('Job', job.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('Job', job.name, job.failed_pods, job.pods) }}
+
+ <section class="section">
+ {{ description(job.k8s) | indent(width=6) }}
+
+ {{ pods_container(job.pods, "Job") | indent(width=6) }}
+
+ {{ events(job.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/pod.html.j2 b/src/onaptests/templates/status/pod.html.j2
new file mode 100644
index 0000000..d922206
--- /dev/null
+++ b/src/onaptests/templates/status/pod.html.j2
@@ -0,0 +1,101 @@
+{% macro container_table(title, containers_list) %}
+<div class="container">
+ <h1 class="title is-1">{{ title }}</h1>
+ <div class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Image</th>
+ <th>State</th>
+ <th>Ready</th>
+ <th>Restart Count</th>
+ </tr>
+ <tbody>
+ {% for container in containers_list %}
+ <tr>
+ <td><a href="./pod-{{ pod.name }}-{{ container.name }}-logs.html" title="{{ pod.name }}-{{ container.name }}-logs">{{ container.name }}</a></td>
+ <td>{{ container.image }}</td>
+ <td>{{ container.status }}</td>
+ <td>{{ container.ready }}</td>
+ <td>{{ container.restart_count }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+</div>
+{% endmacro %}
+
+{% extends "base.html.j2" %}
+{% block title %}Pod {{ pod.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('Pod', pod.name) | indent(width=4) }}
+
+ {{ summary('Pod', pod.name, [
+ {
+ 'title': 'Init containers',
+ 'failing': ((pod.init_containers | length) - pod.runned_init_containers),
+ 'total': (pod.init_containers | length)
+ },
+ {
+ 'title': 'Containers',
+ 'failing': ((pod.containers | length) - pod.running_containers),
+ 'total': (pod.containers | length)
+ }])
+ }}
+
+ <section class="section">
+ {{ description(pod.k8s) | indent(width=6) }}
+
+ {% if (pod.init_containers | length) > 0 %}
+ {{ container_table("Init Containers", pod.init_containers) | indent(width=6) }}
+ {% endif %}
+
+
+ {% if (pod.containers | length) > 0 %}
+ {{ container_table("Containers", pod.containers) | indent(width=8) }}
+ {% endif %}
+
+ {% if pod.k8s.spec.volumes %}
+ <div class="container">
+ <h1 class="title is-1">Volumes</h1>
+ <div class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Type</th>
+ <th>Properties</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for volume_name, volume in pod.volumes.items() %}
+ {% for volume_type, details in volume.items() %}
+ <tr>
+ <td>{{ volume_name }}</td>
+ <td>{{ volume_type }}</td>
+ <td>
+ <table class="table is-narrow">
+ <tbody>
+ {% for key, value in details.items() %}
+ <tr>
+ <th>{{ key }}</th>
+ <td>{{ value }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ {% endfor %}
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ {% endif %}
+
+ {{ events(pod.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/raw_output.txt.j2 b/src/onaptests/templates/status/raw_output.txt.j2
new file mode 100644
index 0000000..1c52531
--- /dev/null
+++ b/src/onaptests/templates/status/raw_output.txt.j2
@@ -0,0 +1,28 @@
+{%- macro statistic(resource_name, failing, total, failing_list) %}
+>>> Nb {{ resource_name }}: {{ total }}
+>>> Nb Failed {{ resource_name }}: {{ failing }}
+{%- if failing > 0 %}
+>>> List of Failed {{ resource_name }}: [{{ failing_list | map(attribute='name') | join(", ") }}]
+{%- endif %}
+{%- endmacro %}
+------------------------------------------------
+------- {{ namespace }} kubernetes tests ------------------
+------------------------------------------------
+{%- if (ns.jobs | length) > 0 %}
+{{ statistic("Jobs", (ns.failing_jobs | length), (ns.jobs | length), ns.failing_jobs) }}
+{%- endif %}
+{%- if (ns.deployments | length) > 0 %}
+{{ statistic("Deployments", (ns.failing_deployments | length), (ns.deployments | length), ns.failing_deployments) }}
+{%- endif %}
+{%- if (ns.statefulsets | length) > 0 %}
+{{ statistic("StatefulSets", (ns.failing_statefulsets | length), (ns.statefulsets | length), ns.failing_statefulsets) }}
+{%- endif %}
+{%- if (ns.daemonsets | length) > 0 %}
+{{ statistic("DaemonSets", (ns.failing_daemonsets | length), (ns.daemonsets | length), ns.failing_daemonsets) }}
+{%- endif %}
+{%- if (ns.pvcs | length) > 0 %}
+{{ statistic("Persistent Volume Claims", (ns.failing_pvcs | length), (ns.pvcs | length), ns.failing_pvcs) }}
+{%- endif %}
+------------------------------------------------
+------------------------------------------------
+------------------------------------------------
diff --git a/src/onaptests/templates/status/replicaset.html.j2 b/src/onaptests/templates/status/replicaset.html.j2
new file mode 100644
index 0000000..f26f2fd
--- /dev/null
+++ b/src/onaptests/templates/status/replicaset.html.j2
@@ -0,0 +1,15 @@
+{% extends "base.html.j2" %}
+{% block title %}ReplicaSet {{ replicaset.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('ReplicaSet', replicaset.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('ReplicaSet', replicaset.name, replicaset.failed_pods, replicaset.pods) }}
+
+ <section class="section">
+ {{ description(replicaset.k8s) | indent(width=6) }}
+
+ {{ pods_container(replicaset.pods, "ReplicaSet") | indent(width=6) }}
+
+ {{ events(replicaset.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/service.html.j2 b/src/onaptests/templates/status/service.html.j2
new file mode 100644
index 0000000..31b239a
--- /dev/null
+++ b/src/onaptests/templates/status/service.html.j2
@@ -0,0 +1,45 @@
+{% extends "base.html.j2" %}
+{% block title %}Service {{ service.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('Service', service.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('Service', service.name, service.failed_pods, service.pods) }}
+
+ <section class="section">
+ {{ description(service.k8s) | indent(width=6) }}
+
+ {{ pods_container(service.pods, "Service") | indent(width=6) }}
+
+ <div class="container">
+ <h1 class="title is-1">Ports</h1>
+ {% if service.k8s.spec.ports %}
+ <div id="ports" class="table-container">
+ <table class="table is-fullwidth is-striped is-hoverable">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Port</th>
+ <th>Node Port</th>
+ <th>Target Port</th>
+ <th>Protocol</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for port in service.k8s.spec.ports %}
+ <tr>
+ <td>{{ port.name }}</td>
+ <td>{{ port.port }}</td>
+ <td>{{ port.node_port }}</td>
+ <td>{{ port.target_port }}</td>
+ <td>{{ port.protocol }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ </div>
+ {% else %}
+ <div class="notification is-warning">Service has no ports!</div>
+ {% endif %}
+ </div>
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/statefulset.html.j2 b/src/onaptests/templates/status/statefulset.html.j2
new file mode 100644
index 0000000..1aac8eb
--- /dev/null
+++ b/src/onaptests/templates/status/statefulset.html.j2
@@ -0,0 +1,15 @@
+{% extends "base.html.j2" %}
+{% block title %}StatefulSet {{ statefulset.name }}{% endblock %}
+{% block content %}
+ {{ two_level_breadcrumb('StatefulSet', statefulset.name) | indent(width=4) }}
+
+ {{ pod_parent_summary('StatefulSet', statefulset.name, statefulset.failed_pods, statefulset.pods) }}
+
+ <section class="section">
+ {{ description(statefulset.k8s) | indent(width=6) }}
+
+ {{ pods_container(statefulset.pods, "StatefulSet") | indent(width=6) }}
+
+ {{ events(statefulset.events) }}
+ </section>
+{% endblock %}
diff --git a/src/onaptests/templates/status/version.html.j2 b/src/onaptests/templates/status/version.html.j2
new file mode 100644
index 0000000..40348a4
--- /dev/null
+++ b/src/onaptests/templates/status/version.html.j2
@@ -0,0 +1,28 @@
+
+{% extends "base.html.j2" %}
+{% block title %}ONAP Docker Versions{% endblock %}
+
+{% block content %}
+<h1 class="title is-1">ONAP Docker versions</h1>
+<table class="table is-bordered is-striped is-narrow is-hoverable is-fullwidth">
+ <thead>
+ <tr>
+ <th>Component</th>
+ <th>Container</th>
+ <th>Image</th>
+ <th>Version</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ {% for pod in pod_versions %}
+ <tr>
+ <td>{{ pod.component }}</td>
+ <td>{{ pod.container }}</td>
+ <td>{{ pod.image }}</td>
+ <td>{{ pod.version }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+{% endblock %}