mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-11 04:36:48 +00:00
refactor(templates): the host pages' scripts load from static files
The host pages lose their last inline scripts: the overview's charts (host_graphs.js), the New pool, New network and New interface dialogs (pool_dialog.js, network_dialog.js, interface_dialog.js), a network's and a network filter's XML editors and dialogs (network_page.js, nwfilter_page.js, nwfilters_page.js), the secrets page's labels (secrets_page.js, its texts from the view as usage_texts) and a pool's page with the ISO upload (storage_page.js). Their URLs and messages are data attributes of the elements they belong to; the upload reads its token and address from its form. No template has an inline script or an inline event handler any more.
This commit is contained in:
parent
946629b035
commit
50dcaba699
23 changed files with 431 additions and 407 deletions
|
|
@ -108,7 +108,7 @@
|
|||
</div>
|
||||
<div class="small text-body-secondary mt-2 mb-4">
|
||||
{% trans "The last 10 readings, one every 5 seconds. Memory in use leaves out the host's buffers and cache." %}
|
||||
<span id="graph_state" data-updated="{% trans "Updated at %(time)s." %}"
|
||||
<span id="graph_state" data-url="{% url 'compute_graph' compute.id %}" data-average-over="{% trans "average over" %}" data-updated="{% trans "Updated at %(time)s." %}"
|
||||
data-stale="{% trans "Not updated since %(time)s: the host did not answer." %}">{% trans "Waiting for the first reading." %}</span>
|
||||
</div>
|
||||
|
||||
|
|
@ -194,61 +194,6 @@
|
|||
<script src="{% static "js/chart.umd.min.js" %}"></script>
|
||||
<script src="{% static "js/charts.js" %}"></script>
|
||||
<script src="{% static "js/poll.js" %}"></script>
|
||||
<script>
|
||||
{% trans "average over" as average_over %}
|
||||
// the seconds each CPU point averages
|
||||
var cpuWindows = [];
|
||||
var cpuChart = lineChart(document.getElementById("cpuChart"), "%", ["Usage"], {
|
||||
max: 100,
|
||||
tooltip: function (context, text) {
|
||||
var span = cpuWindows[context.dataIndex];
|
||||
return span ? text + ' ({{ average_over|escapejs }} ' + span + ' s)' : text;
|
||||
},
|
||||
});
|
||||
var memChart = lineChart(document.getElementById("memChart"), "GB", ["Usage"]);
|
||||
var cpuNow = document.getElementById("cpu_now");
|
||||
var memNow = document.getElementById("mem_now");
|
||||
var state = document.getElementById("graph_state");
|
||||
var lastUpdate = "–";
|
||||
|
||||
function gb(bytes) {
|
||||
return Math.round(bytes / 107374182.4) / 10;
|
||||
}
|
||||
|
||||
// a failed reading leaves the charts as they were: say since when
|
||||
function stale() {
|
||||
state.textContent = state.dataset.stale.replace("%(time)s", lastUpdate);
|
||||
state.classList.add("text-danger");
|
||||
}
|
||||
|
||||
// the CPU sample of the previous answer: usage is taken since then
|
||||
var cpuSample = null;
|
||||
pollWhileVisible(5000, function () {
|
||||
return $.getJSON('{% url 'compute_graph' compute.id %}', cpuSample ? {cpu_sample: cpuSample} : {}).fail(stale);
|
||||
}, function (data) {
|
||||
cpuSample = data.cpu_sample || null;
|
||||
cpuWindows.push(data.window);
|
||||
if (cpuWindows.length > CHART_POINTS) {
|
||||
cpuWindows.shift();
|
||||
}
|
||||
addPoint(cpuChart, data.timeline, [data.cpudata]);
|
||||
// a host that could not be read gives no values: a gap, same axis
|
||||
if (data.memdata.total) {
|
||||
memChart.options.scales.y.max = gb(data.memdata.total);
|
||||
addPoint(memChart, data.timeline, [gb(data.memdata.usage)]);
|
||||
memNow.textContent = gb(data.memdata.usage) + " / " + gb(data.memdata.total) + " GB";
|
||||
} else {
|
||||
addPoint(memChart, data.timeline, [null]);
|
||||
}
|
||||
if (data.cpudata == null) {
|
||||
stale();
|
||||
return;
|
||||
}
|
||||
cpuNow.textContent = data.cpudata + " %";
|
||||
lastUpdate = data.timeline;
|
||||
state.textContent = state.dataset.updated.replace("%(time)s", data.timeline);
|
||||
state.classList.remove("text-danger");
|
||||
}, 0);
|
||||
</script>
|
||||
<script src="{% static 'js/host_graphs.js' %}"></script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
|
|
|||
|
|
@ -143,12 +143,17 @@ class GraphScriptTestCase(TestCase):
|
|||
details.return_value.get_node_info.return_value = ("h", "x86_64", 1024, 2, "cpu", "qemu+tcp://h/system")
|
||||
details.return_value.get_cpu_topology.return_value = TOPOLOGY
|
||||
page = self.client.get(reverse("overview", args=[compute.id])).content.decode()
|
||||
script = next(s for s in html.fromstring(page).xpath("//script[not(@src)]/text()") if "pollWhileVisible(" in s)
|
||||
doc = html.fromstring(page)
|
||||
self.assertIn("/static/js/host_graphs.js", doc.xpath("//script/@src"))
|
||||
(state,) = doc.xpath("//span[@id='graph_state']")
|
||||
dataset = {"url": state.get("data-url"), "averageOver": state.get("data-average-over"),
|
||||
"updated": "Updated at %(time)s.", "stale": "Not updated since %(time)s."}
|
||||
script = (settings.BASE_DIR / "static/js/host_graphs.js").read_text()
|
||||
js = """
|
||||
const vm = require("vm");
|
||||
const charts = [], requests = [];
|
||||
const element = (dataset) => ({dataset, textContent: "", classList: {add: () => {}, remove: () => {}}});
|
||||
const elements = {graph_state: element({updated: "Updated at %(time)s.", stale: "Not updated since %(time)s."}),
|
||||
const elements = {graph_state: element(DATASET),
|
||||
cpu_now: element({}), mem_now: element({})};
|
||||
let poll;
|
||||
const page = {
|
||||
|
|
@ -180,7 +185,8 @@ class GraphScriptTestCase(TestCase):
|
|||
console.log(JSON.stringify({requests, label, shown, state: elements.graph_state.textContent,
|
||||
cpu: charts[0].data.datasets[0].data,
|
||||
mem: charts[1].data.datasets[0].data, memMax: charts[1].options.scales.y.max}));
|
||||
""".replace("SCRIPT", json.dumps(script)).replace("CHARTS", json.dumps(CHARTS_JS.read_text()))
|
||||
""".replace("SCRIPT", json.dumps(script)).replace("CHARTS", json.dumps(CHARTS_JS.read_text())).replace(
|
||||
"DATASET", json.dumps(dataset))
|
||||
out = subprocess.run(["node", "-e", js], capture_output=True, text=True, timeout=30)
|
||||
self.assertEqual(out.returncode, 0, out.stderr)
|
||||
result = json.loads(out.stdout)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue