Files
nomad/scripts/screenshots/src/index.js
2023-08-10 17:27:09 -05:00

193 lines
5.2 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
const puppeteer = require("puppeteer");
const {
capture,
wait,
error,
click,
clickJob,
clickTab,
clickMainMenu,
clickX
} = require("./utils");
const HOST = process.env.EMBER_HOST || "http://localhost:4200";
console.log(`Using host ${HOST}...`);
const ANSI_YELLOW = "\x1b[33m%s\x1b[0m";
(async () => {
const startTime = Date.now();
console.log("Preparing puppeteer...");
// Create a new browser and tab
const browser = await puppeteer.launch({
// Docker related chrome flags
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--remote-debugging-port=9222",
]
});
const page = await browser.newPage();
// Make sure the page is 4K is high-dpi scaling
page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 });
console.log("Loading Nomad UI...");
console.log(
ANSI_YELLOW,
"\n!! Make sure to use the everyFeature Mirage scenario !!\n"
);
try {
await page.goto(`${HOST}/ui/`);
} catch (err) {
await error(
browser,
"Could not load the Nomad UI. Is the Ember server running?"
);
}
// Give Mirage a chance to settle
console.log("Waiting for Mirage...");
await wait(5000);
console.log("Starting capture sequence!\n");
// DEBUG: log the URL on all navigations
monitorURL(page);
await capture(page, "jobs-list");
await clickJob(page, "service");
await capture(page, "job-detail-service");
await page.goBack();
await clickJob(page, "batch");
await capture(page, "job-detail-batch");
await page.goBack();
await clickJob(page, "system");
await capture(page, "job-detail-system");
await page.goBack();
await clickJob(page, "periodic");
await capture(page, "job-detail-periodic");
await click(page, "tr.job-row");
await capture(page, "job-detail-periodic-child");
await page.goBack();
await page.goBack();
await clickJob(page, "parameterized");
await capture(page, "job-detail-parameterized");
await click(page, "tr.job-row");
await capture(page, "job-detail-parameterized-child");
await page.goBack();
await page.goBack();
await clickJob(page, "service");
await clickTab(page, "Definition");
await capture(page, "job-detail-tab-definition");
await page.click(".boxed-section .button.is-light.is-compact.pull-right");
await capture(page, "job-detail-tab-definition-editing");
await clickTab(page, "Versions");
await capture(page, "job-detail-tab-versions");
await page.click(".timeline-object .button.is-light.is-compact.pull-right");
await capture(page, "job-detail-tab-versions-expanded");
await clickTab(page, "Deployments");
await capture(page, "job-detail-tab-deployments");
await page.click(".timeline-object .button.is-light.is-compact.pull-right");
await capture(page, "job-detail-tab-deployments-expanded");
await clickTab(page, "Allocations");
await capture(page, "job-detail-tab-allocations");
await clickTab(page, "Evaluations");
await capture(page, "job-detail-tab-evaluations");
await clickMainMenu(page, "Jobs");
await page.click(".toolbar-item .button.is-primary");
await capture(page, "job-run-empty");
// Fill in the code editor somehow
// Capture the plan stage
await clickMainMenu(page, "Jobs");
await clickJob(page, "service");
await click(page, ".task-group-row");
await capture(page, "task-group");
await clickMainMenu(page, "Jobs");
await clickJob(page, "service");
const allocCount = await page.$$eval(".allocation-row", s => s.length);
for (let i = 1; i <= allocCount; i++) {
await click(page, `.allocation-row:nth-of-type(${i}) a.is-primary`);
await capture(page, `allocation-${i}`);
await page.goBack();
await wait(2000);
}
await click(page, ".allocation-row a.is-primary");
await click(page, ".task-row");
await capture(page, "task-detail");
await clickTab(page, "Logs");
await capture(page, "task-logs");
await clickMainMenu(page, "Clients");
await capture(page, "clients-list");
const clientCount = await page.$$eval(".client-node-row", s => s.length);
for (let i = 1; i <= clientCount; i++) {
await click(page, `.client-node-row:nth-of-type(${i})`);
await capture(page, `client-detail-${i}`);
await page.goBack();
await wait(500);
}
await clickMainMenu(page, "Servers");
await capture(page, "servers-list");
await click(page, `.server-agent-row:nth-of-type(2)`);
await capture(page, "server-detail");
await clickX(page, '//a[contains(text(), "ACL Tokens")]');
await capture(page, "acl-tokens");
console.log(`All done! ${humanDuration(Date.now() - startTime)}`);
process.exit();
})();
async function* watchURL(page) {
while (true) {
await page.waitForNavigation();
yield page.url();
}
}
async function monitorURL(page) {
for await (let url of watchURL(page)) {
console.log(`=> ${url}`);
}
}
function humanDuration(duration) {
const ms = duration % 1000;
const s = Math.floor((duration / 1000) % 60);
const m = Math.floor(duration / 1000 / 60);
const fs = s < 10 ? `0${s}` : `${s}`;
const fms = ms < 10 ? `00${ms}` : ms < 100 ? `0${ms}` : `${ms}`;
if (m) return `${m}m ${fs}s ${fms}ms`;
else if (s) return `${fs}s ${fms}ms`;
return `${fms}ms`;
}