diff options
Diffstat (limited to 'src/onaptests/templates/status')
-rw-r--r-- | src/onaptests/templates/status/base.html.j2 | 261 | ||||
-rw-r--r-- | src/onaptests/templates/status/container_log.html.j2 | 104 | ||||
-rw-r--r-- | src/onaptests/templates/status/container_versions.html.j2 | 38 | ||||
-rw-r--r-- | src/onaptests/templates/status/daemonset.html.j2 | 15 | ||||
-rw-r--r-- | src/onaptests/templates/status/deployment.html.j2 | 15 | ||||
-rw-r--r-- | src/onaptests/templates/status/index.html.j2 | 376 | ||||
-rw-r--r-- | src/onaptests/templates/status/job.html.j2 | 15 | ||||
-rw-r--r-- | src/onaptests/templates/status/pod.html.j2 | 101 | ||||
-rw-r--r-- | src/onaptests/templates/status/raw_output.txt.j2 | 28 | ||||
-rw-r--r-- | src/onaptests/templates/status/replicaset.html.j2 | 15 | ||||
-rw-r--r-- | src/onaptests/templates/status/service.html.j2 | 45 | ||||
-rw-r--r-- | src/onaptests/templates/status/statefulset.html.j2 | 15 | ||||
-rw-r--r-- | src/onaptests/templates/status/version.html.j2 | 28 |
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 %} |