Files
pikasTech-unidesk/scripts/src/hwlab-node/deploy-overlay.ts
T

67 lines
2.9 KiB
TypeScript

export function applyNodeRuntimeDeployYamlOverlay(document: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {
const doc = structuredClone(document);
const nodeId = requiredString(overlay.nodeId, "overlay.nodeId");
const laneId = requiredString(overlay.lane, "overlay.lane");
const nodes = record(doc.nodes);
const node = record(nodes[nodeId]);
nodes[nodeId] = { ...node, gitopsRoot: overlay.gitopsRoot, sourceRepo: overlay.gitUrl };
doc.nodes = nodes;
const lanes = record(doc.lanes);
const lane = record(lanes[laneId]);
const envRecipe = record(lane.envRecipe);
const downloadStack = {
...record(envRecipe.downloadStack),
httpProxy: overlay.dockerProxyHttp,
httpsProxy: overlay.dockerProxyHttps,
noProxy: overlay.dockerNoProxyList,
};
const nextLane: Record<string, unknown> = {
...lane,
node: nodeId,
sourceBranch: overlay.sourceBranch,
gitopsBranch: overlay.gitopsBranch,
namespace: overlay.runtimeNamespace,
endpoint: overlay.publicApiUrl,
publicEndpoints: { frontend: overlay.publicWebUrl, api: overlay.publicApiUrl },
artifactCatalog: overlay.catalogPath,
runtimePath: overlay.runtimePath,
imageTagMode: "full",
sourceRepo: overlay.gitUrl,
observability: overlay.observability,
envRecipe: { ...envRecipe, downloadStack },
};
if (overlay.externalPostgres === undefined || overlay.externalPostgres === null) delete nextLane.externalPostgres;
else nextLane.externalPostgres = overlay.externalPostgres;
if (overlay.runtimeStore !== undefined) nextLane.runtimeStore = overlay.runtimeStore;
if (overlay.codeAgentRuntime !== undefined) nextLane.codeAgentRuntime = overlay.codeAgentRuntime;
if (overlay.deployYamlGitMirror !== undefined) nextLane.gitMirror = overlay.deployYamlGitMirror;
lanes[laneId] = nextLane;
doc.lanes = lanes;
return doc;
}
export function nodeRuntimeDeployYamlOverlayShellScript(): string[] {
return [
"node - \"$overlay_b64\" <<'NODE_UNIDESK_DEPLOY_OVERLAY'",
"const fs = require('fs');",
"const YAML = require('yaml');",
`const applyNodeRuntimeDeployYamlOverlay = ${applyNodeRuntimeDeployYamlOverlay.toString()};`,
`const record = ${record.toString()};`,
`const requiredString = ${requiredString.toString()};`,
"const overlay = JSON.parse(Buffer.from(process.argv[2], 'base64').toString('utf8'));",
"const path = 'deploy/deploy.yaml';",
"const doc = YAML.parse(fs.readFileSync(path, 'utf8'));",
"fs.writeFileSync(path, YAML.stringify(applyNodeRuntimeDeployYamlOverlay(doc, overlay)));",
"NODE_UNIDESK_DEPLOY_OVERLAY",
];
}
function record(value: unknown): Record<string, unknown> {
return typeof value === "object" && value !== null && !Array.isArray(value) ? value as Record<string, unknown> : {};
}
function requiredString(value: unknown, label: string): string {
if (typeof value !== "string" || value.length === 0) throw new Error(`${label} must be a non-empty string`);
return value;
}