quality / changes (push) Successful in 6s
quality / commitlint (push) Skipped
quality / openapi (push) Successful in 28s
quality / web (push) Successful in 57s
quality / api (push) Successful in 1m35s
quality / linux-agent-smoke (push) Successful in 24s
quality / docker-check (push) Failing after 3m20s
CD / quality (push) Failing after 6m56s
CD / publish (push) Skipped
37 lines
2.2 KiB
JavaScript
37 lines
2.2 KiB
JavaScript
// Pipe into `docker exec -i CONTAINER node --input-type=module` on a disposable DB.
|
|
import { createRequire } from 'node:module'
|
|
import { createHash } from 'node:crypto'
|
|
import { fileURLToPath } from 'node:url'
|
|
import { resolve } from 'node:path'
|
|
import { realpathSync } from 'node:fs'
|
|
export function fixtureDatabaseConstructor() {
|
|
return createRequire(realpathSync(resolve('node_modules/@evofw/db/package.json')))('better-sqlite3')
|
|
}
|
|
export const benchmarkPrefix = (i, first = 10) => `${first}.${i >>> 16}.${(i >>> 8) & 255}.${i & 255}/32`
|
|
export function seedFixture(db) {
|
|
db.pragma('foreign_keys = ON')
|
|
db.transaction(() => {
|
|
for (const table of ['agents', 'ip_lists', 'agent_telemetry_state', 'agent_stats_samples', 'agent_stats_rollups']) {
|
|
if (db.prepare(`SELECT count(*) AS n FROM ${table}`).get().n !== 0) throw new Error(`Fresh benchmark database required: ${table} is not empty`)
|
|
}
|
|
db.prepare('INSERT INTO ip_lists(id,name,type) VALUES (?,?,?)').run('bench-list', 'Benchmark 50k', 'static')
|
|
db.prepare('INSERT INTO policy_sets(id,name) VALUES (?,?)').run('bench-set', 'Benchmark')
|
|
db.prepare('INSERT INTO policy_rules(id,set_id,priority,action,list_id) VALUES (?,?,?,?,?)').run('bench-rule', 'bench-set', 10, 'deny', 'bench-list')
|
|
const entry = db.prepare('INSERT INTO ip_list_entries(id,list_id,cidr) VALUES (?,?,?)')
|
|
for (let i = 0; i < 50_000; i++) entry.run(`bench-entry-${i}`, 'bench-list', benchmarkPrefix(i))
|
|
const agent = db.prepare('INSERT INTO agents(id,name,token_prefix,token_hash,status) VALUES (?,?,?,?,?)')
|
|
const assign = db.prepare('INSERT INTO agent_policy_sets(agent_id,set_id) VALUES (?,?)')
|
|
for (let i = 0; i < 100; i++) {
|
|
const token = `bench-agent-token-${i}`
|
|
agent.run(`bench-agent-${i}`, `Benchmark ${i}`, token.slice(0, 12), createHash('sha256').update(token).digest('hex'), 'approved')
|
|
assign.run(`bench-agent-${i}`, 'bench-set')
|
|
}
|
|
})()
|
|
return { fixture: { agents: 100, prefixes: 50_000 }, integrity: db.pragma('integrity_check', { simple: true }) }
|
|
}
|
|
if (!process.argv[1] || resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
const Database = fixtureDatabaseConstructor()
|
|
const db = new Database('/data/app.db')
|
|
try { console.log(JSON.stringify(seedFixture(db))) } finally { db.close() }
|
|
}
|