mirror of
https://github.com/kemko/nomad.git
synced 2026-01-03 08:55:43 +03:00
193 lines
5.2 KiB
JavaScript
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`;
|
|
}
|