Files
baiyue-firstleg/scripts/fleet-capacity-pool-gray.mjs
2026-10-08 17:07:57 +08:00

47 lines
3.2 KiB
JavaScript

import { dirname, resolve } from 'node:path'
import { fileURLToPath, pathToFileURL } from 'node:url'
import { runPoolAcceptance, poolPlan } from './fleet-capacity-pool-test-env.mjs'
import { runFleetPoolGrayCrossCustomer } from './fleet-cross-customer-test-env.mjs'
const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..')
export function parseGrayPoolArguments(args) {
const config = { execute: false, environment: 'GRAY', runId: 'plan', warehouseId: '', destinationWarehouseId: '' }
const seen = new Set()
for (let index = 0; index < args.length; index++) {
const name = args[index]
if (['--execute', '--plan'].includes(name)) {
if (seen.has('action')) throw Error('Duplicate execution mode')
seen.add('action'); config.execute = name === '--execute'; continue
}
const field = { '--environment': 'environment', '--run-id': 'runId', '--warehouse-id': 'warehouseId',
'--destination-warehouse-id': 'destinationWarehouseId' }[name]
if (!field || seen.has(name) || !args[index + 1] || args[index + 1].startsWith('--')) throw Error('Unsupported or duplicate gray pool argument')
seen.add(name); config[field] = args[++index]
}
if (config.environment !== 'GRAY' || !/^[A-Za-z0-9][A-Za-z0-9_-]{0,47}$/.test(config.runId)
|| [config.warehouseId, config.destinationWarehouseId].some(value => value && !/^[1-9][0-9]{0,19}$/.test(value))
|| config.execute && (!seen.has('--environment') || config.runId === 'plan' || !config.warehouseId || !config.destinationWarehouseId))
throw Error('Explicit GRAY, fresh run-id and warehouse/destination IDs required')
return config
}
export async function runGrayPoolAcceptance(config, { env = process.env, outputRoot = ROOT, execute = runPoolAcceptance } = {}) {
if (config.environment !== 'GRAY') throw Error('Dedicated GRAY pool configuration required')
if (!config.execute) return { ...poolPlan(config), scope: 'FLEET_CAPACITY_POOL_GRAY', fullAcceptance: false,
evidence: 'createGrayEvidenceReaders: registered production SSH target, immutable container/profile/database identity checks; no TEST agent',
excluded: ['old FBA order/container/customs flow', 'generic Admin module runner', 'fault injection', 'deployment', 'business SQL writes'] }
if (!['prod', 'gray'].includes(env.CHONGCHONG_ENV)) throw Error('Dedicated GRAY pool requires actual gray or prod runtime profile; TEST is refused')
return execute(config, { env, outputRoot, runner: runFleetPoolGrayCrossCustomer })
}
if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href) {
try {
const config = parseGrayPoolArguments(process.argv.slice(2)), result = await runGrayPoolAcceptance(config)
console.log(JSON.stringify(config.execute ? { success: result.success, environment: 'GRAY', runtimeProfile: result.runtimeProfile,
error: result.error, summary: result.summary, fullAcceptance: false, output: poolPlan(config).output,
covered: result.createdResources?.fleetCapacityPool?.covered, remaining: result.remainingSeparateAcceptance } : result, null, 2))
if (config.execute && !result.success) process.exitCode = 1
} catch (error) { console.error(error.message); process.exitCode = 1 }
}