puppetboard: Adding PuppetDB 3.x support
Some excerpts from CHANGELOG.rst include: - Increasing the pypuppetdb requirements from 0.1.x to 0.2.x - The Reports page now lists reports from the reports endpoint instead of a link to a PuppetDB issue with a feature request - Adding a Catalogs page to view either individual node catalogs or compare them against other nodes - New environment awareness adds a new query parameter to all applicable endpoints to filter results based on the current environment. If the default environment 'production' is not available, or any other unavailable environment, the user is redirected to the first known environment. - Adding pagination functionality for reports (for now) based on the value of the REPORTS_COUNT configuration option (used for the limit and the offset calculation). Implementation also makes it possible for other UI enhancements. - Removing the limit_reports function from puppetboard/utils.py since paging parameters are now accepted by the pypuppetdb endpoint functions. - Bumping the version to 0.1.0
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
{% macro facts_table(facts, autofocus=False, condensed=False, show_node=False, show_value=True, link_facts=False, margin_top=20, margin_bottom=20) -%}
|
||||
{% macro facts_table(facts, current_env, autofocus=False, condensed=False, show_node=False, show_value=True, link_facts=False, margin_top=20, margin_bottom=20) -%}
|
||||
<div class="ui fluid icon input hide" style="margin-bottom:20px">
|
||||
<input {% if autofocus %} autofocus="autofocus" {% endif %} class="filter-table" placeholder="Type here to filter...">
|
||||
</div>
|
||||
@@ -19,16 +19,24 @@
|
||||
{% for fact in facts %}
|
||||
<tr>
|
||||
{% if show_node %}
|
||||
<td><a href="{{url_for('node', node_name=fact.node)}}">{{fact.node}}</a></td>
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=fact.node)}}">{{fact.node}}</a></td>
|
||||
{% else %}
|
||||
<td><a href="{{url_for('fact', fact=fact.name)}}">{{fact.name}}</a></td>
|
||||
<td><a href="{{url_for('fact', env=current_env, fact=fact.name)}}">{{fact.name}}</a></td>
|
||||
{% endif %}
|
||||
{% if show_value %}
|
||||
<td style="word-wrap:break-word">
|
||||
{% if link_facts %}
|
||||
<a href="{{url_for('fact_value', fact=fact.name, value=fact.value)}}">{{fact.value}}</a>
|
||||
{% if fact.value is mapping %}
|
||||
<a href="{{url_for('fact_value', env=current_env, fact=fact.name, value=fact.value)}}"><pre>{{fact.value|jsonprint}}</pre></a>
|
||||
{% else %}
|
||||
<a href="{{url_for('fact_value', env=current_env, fact=fact.name, value=fact.value)}}">{{fact.value}}</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{{fact.value}}
|
||||
{% if fact.value is mapping %}
|
||||
<pre>{{fact.value|jsonprint}}</pre>
|
||||
{% else %}
|
||||
{{fact.value}}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
@@ -70,30 +78,40 @@
|
||||
</script>
|
||||
{%- endmacro %}
|
||||
|
||||
{% macro reports_table(reports, nodename, reports_count, condensed=False, hash_truncate=False, show_conf_col=True, show_agent_col=True, show_host_col=True) -%}
|
||||
{% macro reports_table(reports, reports_count, report_event_counts, current_env, condensed=False, hash_truncate=False, show_conf_col=True, show_agent_col=True, show_host_col=True, show_run_col=False, show_full_col=False, show_search_bar=False, searchable=False) -%}
|
||||
{% if show_search_bar %}
|
||||
<div class="ui fluid icon input hide" style="margin-bottom:20px">
|
||||
<input autofocus="autofocus" class="filter-table" placeholder="Type here to filter...">
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="ui info message">
|
||||
|
||||
Only showing the last {{reports_count}} reports.
|
||||
Only showing {{reports_count}} reports sorted by Start Time.
|
||||
|
||||
</div>
|
||||
<table class='ui table basic {% if condensed %}compact{% endif %}'>
|
||||
<table class='ui table basic {% if condensed %}compact{% endif %} report'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Start time</th>
|
||||
<th>Status</th>
|
||||
{% if show_host_col %}
|
||||
<th>Hostname</th>
|
||||
{% endif %}
|
||||
{% if show_run_col %}
|
||||
<th>Run time</th>
|
||||
{% endif %}
|
||||
{% if show_full_col %}
|
||||
<th>Full report</th>
|
||||
{% endif %}
|
||||
{% if show_conf_col %}
|
||||
<th>Configuration version</th>
|
||||
{% endif %}
|
||||
{% if show_agent_col %}
|
||||
<th>Agent version</th>
|
||||
{% endif %}
|
||||
{% if show_host_col %}
|
||||
<th>Hostname</th>
|
||||
{% endif %}
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tbody {% if searchable %}class="searchable" {% endif %}>
|
||||
{% for report in reports %}
|
||||
{% if hash_truncate %}
|
||||
{% set rep_hash = "%s…"|format(report.hash_[0:10])|safe %}
|
||||
@@ -105,21 +123,78 @@
|
||||
{% else %}
|
||||
<tr>
|
||||
{% endif %}
|
||||
<td rel="utctimestamp">{{report.start}}</td>
|
||||
<td rel="utctimestamp">{{report.start}}</td>
|
||||
<td>
|
||||
{% call status_counts(status=report.status, node_name=report.node, events=report_event_counts[report.hash_], report_hash=report.hash_, current_env=current_env) %}{% endcall %}
|
||||
</td>
|
||||
{% if show_host_col %}
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=report.node)}}">{{ report.node }}</a></td>
|
||||
{% endif %}
|
||||
{% if show_run_col %}
|
||||
<td>{{report.run_time}}</td>
|
||||
|
||||
<td><a href="{{url_for('report', node_name=nodename, report_id=report.hash_)}}">{{rep_hash}}</a></td>
|
||||
{% endif %}
|
||||
{% if show_full_col %}
|
||||
<td><a href="{{url_for('report', env=current_env, node_name=report.node, report_id=report.hash_)}}">{{rep_hash}}</a></td>
|
||||
{% endif %}
|
||||
{% if show_conf_col %}
|
||||
<td>{{report.version}}</td>
|
||||
{% endif %}
|
||||
{% if show_agent_col %}
|
||||
<td>{{report.agent_version}}</td>
|
||||
{% endif %}
|
||||
{% if show_host_col %}
|
||||
<td><a href="{{url_for('node', node_name=report.node)}}">{{ report.node }}</a></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{%- endmacro %}
|
||||
{% macro status_counts(caller, status, node_name, events, current_env, unreported_time=False, report_hash=False) -%}
|
||||
<a class="ui small status label
|
||||
{% if status == 'failed' -%}
|
||||
red
|
||||
{% elif status == 'changed' -%}
|
||||
green
|
||||
{% elif status == 'unreported' -%}
|
||||
black
|
||||
{% elif status == 'noop' -%}
|
||||
blue
|
||||
{% endif -%}
|
||||
" href="
|
||||
{% if report_hash -%}
|
||||
{{url_for('report', env=current_env, node_name=node_name, report_id=report_hash)}}
|
||||
{% else -%}
|
||||
{{url_for('report_latest', env=current_env, node_name=node_name)}}
|
||||
{% endif -%}
|
||||
">
|
||||
{{status}}
|
||||
</a>
|
||||
{% if status == 'unreported' %}
|
||||
<span class="ui small label status"> {{ unreported_time }} </span>
|
||||
{% else %}
|
||||
{% if events['failures'] %}<span class="ui small count label red">{{events['failures']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% if events['successes'] %}<span class="ui small count label green">{{events['successes']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% if events['skips'] %}<span class="ui small count label orange">{{events['skips']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
{% macro render_pagination(pagination) -%}
|
||||
<div class="pagination">
|
||||
{% if pagination.has_prev %}
|
||||
<a href="{{url_for_pagination(1)}}">« First</a>
|
||||
<a href="{{url_for_pagination(pagination.page - 1)}}">Prev</a>
|
||||
{% endif %}
|
||||
{% for page in pagination.iter_pages() %}
|
||||
{% if page %}
|
||||
{% if page != pagination.page %}
|
||||
<a href="{{url_for_pagination(page)}}">{{page}}</a>
|
||||
{% else %}
|
||||
<span style="font-weight:bold;">{{page}}</span>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<span class="ellipsis">...</span>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if pagination.has_next %}
|
||||
<a href="{{url_for_pagination(pagination.page + 1)}}">Next</a>
|
||||
<a href="{{url_for_pagination(pagination.pages)}}">Last »</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endmacro %}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="{{url_for('node', node_name=catalog.node)}}">{{catalog.node}}</a></td>
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=catalog.node)}}">{{catalog.node}}</a></td>
|
||||
<td>{{catalog.version}}</td>
|
||||
<td>{{catalog.transaction_uuid}}</td>
|
||||
</tr>
|
||||
|
||||
87
puppetboard/templates/catalog_compare.html
Normal file
87
puppetboard/templates/catalog_compare.html
Normal file
@@ -0,0 +1,87 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% block content %}
|
||||
<table class="ui basic table">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th><h1>Comparing</h1></th>
|
||||
<th><h1>Against</h1></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{compare.node}}</td>
|
||||
<td>{{against.node}}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="ui basic table compact catalog">
|
||||
<thead>
|
||||
<tr><th>Resources</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for resource in compare.get_resources() %}
|
||||
<tr>
|
||||
<td>{{resource.type_}}[{{resource.name}}]</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<table class="ui basic table compact catalog">
|
||||
<thead>
|
||||
<tr><th>Resources</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for resource in against.get_resources() %}
|
||||
<tr>
|
||||
<td>{{resource.type_}}[{{resource.name}}]</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<table class="ui basic table compact catalog">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Edges</th>
|
||||
<th>-></th>
|
||||
<th>Target</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for edge in compare.get_edges() %}
|
||||
<tr>
|
||||
<td>{{edge.source}}</td>
|
||||
<td>{{edge.relationship}}</td>
|
||||
<td>{{edge.target}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
<table class="ui basic table compact catalog">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Edge</th>
|
||||
<th>-></th>
|
||||
<th>Target</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for edge in against.get_edges() %}
|
||||
<tr>
|
||||
<td>{{edge.source}}</td>
|
||||
<td>{{edge.relationship}}</td>
|
||||
<td>{{edge.target}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock content %}
|
||||
40
puppetboard/templates/catalogs.html
Normal file
40
puppetboard/templates/catalogs.html
Normal file
@@ -0,0 +1,40 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import '_macros.html' as macros %}
|
||||
{% block content %}
|
||||
<div class="ui fluid icon input hide" style="margin-bottom:20px">
|
||||
<input autofocus="autofocus" class="filter-table" placeholder="Type here to filter...">
|
||||
</div>
|
||||
<table class='ui compact basic table nodes'>
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Hostname</th>
|
||||
<th>Compile Time</th>
|
||||
<th>Compare With</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="searchable">
|
||||
{% for node in nodes %}
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=node.name)}}">{{node.name}}</a></td>
|
||||
<td><a rel="utctimestamp" href="{{url_for('catalog_node', env=current_env, node_name=node.name)}}">{{node.catalog_timestamp}}</a></td>
|
||||
<td>
|
||||
{% if node.form %}
|
||||
<div class="ui form">
|
||||
<form method="POST" action="{{url_for('catalog_submit', env=current_env)}}">
|
||||
{{node.form.csrf_token}}
|
||||
<div class="field inline">
|
||||
{{node.form.compare}}
|
||||
{{node.form.against}}
|
||||
<input type="submit" class="ui submit button" style="height:auto;" value="Compare"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock content %}
|
||||
@@ -6,8 +6,8 @@
|
||||
{{macros.facts_graph(facts, autofocus=True, show_node=True, margin_bottom=10)}}
|
||||
{% endif %}
|
||||
{% if value %}
|
||||
{{macros.facts_table(facts, autofocus=True, show_node=True, show_value=False, margin_bottom=10)}}
|
||||
{{macros.facts_table(facts, current_env=current_env, autofocus=True, show_node=True, show_value=False, margin_bottom=10)}}
|
||||
{% else %}
|
||||
{{macros.facts_table(facts, autofocus=True, show_node=True, link_facts=True, margin_bottom=10)}}
|
||||
{{macros.facts_table(facts, current_env=current_env, autofocus=True, show_node=True, link_facts=True, margin_bottom=10)}}
|
||||
{% endif %}
|
||||
{% endblock content %}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<span class='ui label darkblue'>{{key}}</span>
|
||||
<ul class="searchable">
|
||||
{%- for fact in facts_list %}
|
||||
<li><a href="{{url_for('fact', fact=fact)}}">{{fact}}</a></li>
|
||||
<li><a href="{{url_for('fact', env=current_env, fact=fact)}}">{{fact}}</a></li>
|
||||
{%- endfor %}
|
||||
</ul>
|
||||
{% endfor %}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import '_macros.html' as macros %}
|
||||
{% block content %}
|
||||
<div class="ui vertical grid">
|
||||
<div class="four column row">
|
||||
<div class="column">
|
||||
<a href="nodes?status=failed">
|
||||
<a href="{{url_for('nodes', env=current_env, status='failed')}}">
|
||||
<h1 class="ui red header no-margin-bottom">
|
||||
{{stats['failed']}}
|
||||
<small>{% if stats['failed']== 1 %} node {% else %} nodes {% endif %}</small>
|
||||
@@ -12,7 +13,7 @@
|
||||
<span>with status failed</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<a href="nodes?status=noop">
|
||||
<a href="{{url_for('nodes', env=current_env, status='noop')}}">
|
||||
<h1 class="ui header purple no-margin-bottom">
|
||||
{{stats['noop']}}
|
||||
<small>{% if stats['noop']== 1 %} node {% else %} nodes {% endif %}</small>
|
||||
@@ -21,7 +22,7 @@
|
||||
<span>with status pending</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<a href="nodes?status=changed">
|
||||
<a href="{{url_for('nodes', env=current_env, status='changed')}}">
|
||||
<h1 class="ui header green no-margin-bottom">
|
||||
{{stats['changed']}}
|
||||
<small>{% if stats['changed']== 1 %} node {% else %} nodes {% endif %}</small>
|
||||
@@ -30,7 +31,7 @@
|
||||
<span>with status changed</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<a href="nodes?status=unreported">
|
||||
<a href="{{url_for('nodes', env=current_env, status='unreported')}}">
|
||||
<h1 class="ui header black no-margin-bottom">
|
||||
{{ stats['unreported'] }}
|
||||
<small>{% if stats['unreported']== 1 %} node {% else %} nodes {% endif %}</small>
|
||||
@@ -41,6 +42,7 @@
|
||||
</div>
|
||||
<div class="four column row">
|
||||
<div class="column">
|
||||
<span>Global Metrics:</span>
|
||||
</div>
|
||||
<div class="column">
|
||||
<h1 class="ui header darkblue no-margin-bottom">{{metrics['num_nodes']}}</h1>
|
||||
@@ -75,40 +77,21 @@
|
||||
{% if node.status != 'unchanged' %}
|
||||
<tr>
|
||||
<td>
|
||||
<a class="ui small status label
|
||||
{% if node.status == 'failed' %}
|
||||
red
|
||||
{% elif node.status == 'changed' %}
|
||||
green
|
||||
{% elif node.status == 'unreported' %}
|
||||
black
|
||||
{% elif node.status == 'noop' %}
|
||||
blue
|
||||
{% endif %}
|
||||
" href="{{url_for('report_latest', node_name=node.name)}}">
|
||||
{{node.status}}
|
||||
</a>
|
||||
{% if node.status=='unreported'%}
|
||||
<span class="ui small label status"> {{ node.unreported_time }} </span>
|
||||
{% else %}
|
||||
{% if node.events['failures'] %}<span class="ui small count label red">{{node.events['failures']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% if node.events['successes'] %}<span class="ui small count label green">{{node.events['successes']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% if node.events['skips'] %}<span class="ui small count label yellow">{{node.events['skips']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% endif %}
|
||||
{{macros.status_counts(status=node.status, node_name=node.name, events=node.events, unreported_time=node.unreported_time, current_env=current_env)}}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{url_for('node', node_name=node.name)}}">{{ node.name }}</a>
|
||||
<a href="{{url_for('node', env=current_env, node_name=node.name)}}">{{ node.name }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{% if node.report_timestamp %}
|
||||
<a href="{{url_for('report_latest', node_name=node.name)}}" rel='utctimestamp'>{{ node.report_timestamp }}</a>
|
||||
<a href="{{url_for('report_latest', env=current_env, node_name=node.name)}}" rel='utctimestamp'>{{ node.report_timestamp }}</a>
|
||||
{% else %}
|
||||
<i class="large ban circle icon"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if node.report_timestamp %}
|
||||
<a title='Reports' href="{{url_for('reports_node', node_name=node.name)}}"><i class='large darkblue book icon'></i></a>
|
||||
<a title='Reports' href="{{url_for('reports_node', env=current_env, node_name=node.name)}}"><i class='large darkblue book icon'></i></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -34,12 +34,22 @@
|
||||
('reports', 'Reports'),
|
||||
('metrics', 'Metrics'),
|
||||
('inventory', 'Inventory'),
|
||||
('catalogs', 'Catalogs'),
|
||||
('query', 'Query'),
|
||||
] %}
|
||||
<a {% if endpoint == request.endpoint %} class="active item" {% else %} class="item" {% endif %}
|
||||
href="{{ url_for(endpoint) }}">{{ caption }}</a>
|
||||
href="{{ url_for(endpoint, env=current_env) }}">{{ caption }}</a>
|
||||
{%- endfor %}
|
||||
<div class="item" style="float:right"><a href="https://github.com/puppet-community/puppetboard" target="_blank">v0.0.5</a></div>
|
||||
{% if envs|length > 0 %}
|
||||
<div class="item">
|
||||
<select id="switch_env" name="switch_env">
|
||||
{% for env in envs %}
|
||||
<option value="{{env}}" {% if current_env == env %}selected="selected" {% endif %}>{{env}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="item" style="float:right"><a href="https://github.com/puppet-community/puppetboard" target="_blank">v0.1.0</a></div>
|
||||
</nav>
|
||||
<div class="ui grid padding-bottom">
|
||||
<div class="one wide column"></div>
|
||||
@@ -80,6 +90,7 @@
|
||||
<script src="{{ url_for('static', filename='js/lists.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/tables.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/scroll.top.js') }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/environments.js') }}"></script>
|
||||
|
||||
{% block script %} {% endblock script %}
|
||||
</body>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<h1>Metrics</h1>
|
||||
<ul>
|
||||
{% for key,value in metrics %}
|
||||
<li><a href="{{url_for('metric', metric=value)}}">{{key}}</li>
|
||||
<li><a href="{{url_for('metric', env=current_env, metric=value)}}">{{key}}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endblock content %}
|
||||
|
||||
@@ -28,12 +28,12 @@
|
||||
</div>
|
||||
<div class='row'>
|
||||
<h1>Reports</h1>
|
||||
{{ macros.reports_table(reports, node.name, reports_count, condensed=True, hash_truncate=True, show_conf_col=False, show_agent_col=False, show_host_col=False)}}
|
||||
{{ macros.reports_table(reports, reports_count, report_event_counts, condensed=True, hash_truncate=True, show_conf_col=False, show_agent_col=False, show_host_col=False, current_env=current_env)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class='column'>
|
||||
<h1>Facts</h1>
|
||||
{{macros.facts_table(facts, link_facts=True, condensed=True)}}
|
||||
{{macros.facts_table(facts, link_facts=True, condensed=True, current_env=current_env)}}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import '_macros.html' as macros %}
|
||||
{% block content %}
|
||||
<div class="ui fluid icon input hide" style="margin-bottom:20px">
|
||||
<input autofocus="autofocus" class="filter-table" placeholder="Type here to filter...">
|
||||
@@ -17,40 +18,20 @@
|
||||
{% for node in nodes %}
|
||||
<tr>
|
||||
<td>
|
||||
<a class="ui small status label
|
||||
{% if node.status == 'failed' %}
|
||||
red
|
||||
{% elif node.status == 'changed' %}
|
||||
green
|
||||
{% elif node.status == 'unreported' %}
|
||||
black
|
||||
{% elif node.status == 'noop' %}
|
||||
blue
|
||||
{% endif %}
|
||||
" href="{{url_for('report_latest', node_name=node.name)}}">
|
||||
{{node.status}}
|
||||
</a>
|
||||
{% if node.status=='unreported'%}
|
||||
<span class="ui small label status"> {{ node.unreported_time }} </label>
|
||||
{% else %}
|
||||
<span>{% if node.events['failures'] %}<span class="ui small count label red">{{node.events['failures']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% if node.events['successes'] %}<span class="ui small count label green">{{node.events['successes']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}</span>
|
||||
{% if node.events['skips'] %}<span class="ui small count label yellow">{{node.events['skips']}}</span>{% else %}<span class="ui small count label">0</span>{% endif%}
|
||||
{% endif %}
|
||||
{{macros.status_counts(status=node.status, node_name=node.name, events=node.events, unreported_time=node.unreported_time, current_env=current_env)}}
|
||||
</td>
|
||||
<td><a href="{{url_for('node', node_name=node.name)}}">{{node.name}}</a></td>
|
||||
<td><a rel="utctimestamp" href="{{url_for('catalog_node', node_name=node.name)}}">{{node.catalog_timestamp}}</a></td>
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=node.name)}}">{{node.name}}</a></td>
|
||||
<td><a rel="utctimestamp" href="{{url_for('catalog_node', env=current_env, node_name=node.name)}}">{{node.catalog_timestamp}}</a></td>
|
||||
<td>
|
||||
{% if node.report_timestamp %}
|
||||
<a href="{{url_for('report_latest', node_name=node.name)}}" rel='utctimestamp'>{{ node.report_timestamp }}</a>
|
||||
<a href="{{url_for('report_latest', env=current_env, node_name=node.name)}}" rel='utctimestamp'>{{ node.report_timestamp }}</a>
|
||||
{% else %}
|
||||
<i class="large ban circle icon"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if node.report_timestamp %}
|
||||
<a title='Reports' href="{{url_for('reports_node', node_name=node.name)}}"><i class='large darkblue book icon'></i></a>
|
||||
<i class='large darkblue trash icon'></i>
|
||||
<a title='Reports' href="{{url_for('reports_node', env=current_env, node_name=node.name, page=1)}}"><i class='large darkblue book icon'></i></a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<div class="ui form">
|
||||
<form method="POST" action="{{ url_for('query') }}">
|
||||
<form method="POST" action="{{ url_for('query', env=current_env) }}">
|
||||
{{ form.csrf_token }}
|
||||
<div class="field {% if form.query.errors %} error {% endif %}">
|
||||
{{ form.query(autofocus="autofocus", rows=5, placeholder="Enter your query: [\"=\", \"certname\", \"hostname\"]. You may omit the opening and closing bracket.") }}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="{{url_for('node', node_name=report.node)}}">{{ report.node }}</a></td>
|
||||
<td><a href="{{url_for('node', env=current_env, node_name=report.node)}}">{{ report.node }}</a></td>
|
||||
<td>
|
||||
{{report.version}}
|
||||
</td>
|
||||
@@ -48,26 +48,62 @@
|
||||
<td>{{event.item['old']}}</td>
|
||||
<td>{{event.item['new']}}</td>
|
||||
</tr>
|
||||
{# <tr>
|
||||
<td class='message' colspan='4'>
|
||||
<div id='message-event-{{loop.index}}'>
|
||||
{{event.item['message']}}
|
||||
</div>
|
||||
</td>
|
||||
</tr>#}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h1>Logs</h1>
|
||||
<table class="ui basic table compact">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Timestamp</th>
|
||||
<th>Source</th>
|
||||
<th>Tags</th>
|
||||
<th>Message</th>
|
||||
<th>Location</th>
|
||||
<tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for log in logs %}
|
||||
{% if log.level == 'info' or log.level == 'notice' %}
|
||||
<tr class='positive'>
|
||||
{% elif log.level == 'warning' %}
|
||||
<tr class='warning'>
|
||||
{% else %}
|
||||
<tr class='error'>
|
||||
{% endif %}
|
||||
<td rel="utctimestamp">{{log.time}}</td>
|
||||
<td>{{log.source}}</td>
|
||||
<td>{{log.tags|join(', ')}}</td>
|
||||
<td>{{log.message}}</td>
|
||||
{% if log.file != None and log.line != None %}
|
||||
<td>{{log.file}}:{{log.line}}</td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h1>Metrics</h1>
|
||||
<table class="ui basic table compact">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Category</th>
|
||||
<th>Name</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for metric in metrics %}
|
||||
<tr>
|
||||
<td>{{metric.category}}</td>
|
||||
<td>{{metric.name}}</td>
|
||||
<td>{{metric.value|round(2)}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% endblock content %}
|
||||
{% block script %}
|
||||
<script type='text/javascript'>
|
||||
jQuery(function ($) {
|
||||
$("[rel=tooltip]").tooltip();
|
||||
$(".event").click(function() {
|
||||
$("#message-" + this.id).slideToggle(200);
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock script %}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import '_macros.html' as macros %}
|
||||
{% block content %}
|
||||
<div class="ui warning message">
|
||||
Pending <a href="https://tickets.puppetlabs.com/browse/PDB-201">#PDB-201</a>. You can access reports for a node or individual reports through the <a href="{{url_for('nodes')}}">Nodes</a> tab.
|
||||
</div>
|
||||
{{ macros.reports_table(reports, reports_count, report_event_counts, condensed=False, hash_truncate=False, show_conf_col=True, show_agent_col=True, show_host_col=True, show_search_bar=True, searchable=True)}}
|
||||
{{ macros.render_pagination(pagination)}}
|
||||
{% endblock content %}
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{% extends 'layout.html' %}
|
||||
{% import '_macros.html' as macros %}
|
||||
{% block content %}
|
||||
{{ macros.reports_table(reports, nodename, reports_count, condensed=False, hash_truncate=False, show_conf_col=True, show_agent_col=True, show_host_col=True)}}
|
||||
{% endblock content %}
|
||||
Reference in New Issue
Block a user