fix: reload AgentRun DB secrets from YAML

This commit is contained in:
Codex
2026-06-13 07:10:20 +00:00
parent e78cc9a16d
commit 7ba28c8f40
9 changed files with 158 additions and 11 deletions
+97
View File
@@ -79,6 +79,8 @@ export function agentRunHelp(): unknown {
"bun scripts/cli.ts agentrun control-plane status --node D601 --lane v02",
"bun scripts/cli.ts agentrun control-plane secret-sync --node D601 --lane v02 --dry-run",
"bun scripts/cli.ts agentrun control-plane secret-sync --node D601 --lane v02 --confirm",
"bun scripts/cli.ts agentrun control-plane restart --node D601 --lane v02 --dry-run",
"bun scripts/cli.ts agentrun control-plane restart --node D601 --lane v02 --confirm",
"bun scripts/cli.ts agentrun control-plane trigger-current --node D601 --lane v02 --dry-run",
"bun scripts/cli.ts agentrun control-plane trigger-current --node D601 --lane v02 --confirm",
"bun scripts/cli.ts agentrun control-plane status",
@@ -121,6 +123,7 @@ export async function runAgentRunCommand(config: UniDeskConfig | null, args: str
if (action === "apply") return await controlPlaneApply(config, parseLaneConfirmOptions(actionArgs));
if (action === "status") return await status(config, parseStatusOptions(actionArgs));
if (action === "secret-sync") return await secretSync(config, parseSecretSyncOptions(actionArgs));
if (action === "restart") return await restartYamlLane(config, parseLaneConfirmOptions(actionArgs));
if (action === "expose") return await exposeAgentRun(config, parseConfirmOptions(actionArgs));
if (action === "trigger-current") return await triggerCurrent(config, parseTriggerOptions(actionArgs));
if (action === "refresh") return await refresh(config, parseConfirmOptions(actionArgs));
@@ -2267,12 +2270,60 @@ async function statusYamlLane(config: UniDeskConfig, options: StatusOptions, tar
postgresStatus: spec.database.configRef ? `bun scripts/cli.ts platform-db postgres status --config ${spec.database.configRef}` : null,
postgresApply: spec.database.configRef ? `bun scripts/cli.ts platform-db postgres apply --config ${spec.database.configRef} --confirm` : null,
secretSync: `bun scripts/cli.ts agentrun control-plane secret-sync --node ${spec.nodeId} --lane ${spec.lane} --confirm`,
restart: `bun scripts/cli.ts agentrun control-plane restart --node ${spec.nodeId} --lane ${spec.lane} --confirm`,
statusFull: `bun scripts/cli.ts agentrun control-plane status --node ${spec.nodeId} --lane ${spec.lane} --full`,
},
valuesPrinted: false,
};
}
async function restartYamlLane(config: UniDeskConfig, options: LaneConfirmOptions): Promise<Record<string, unknown>> {
const { configPath, spec } = resolveAgentRunLaneTarget(options);
const plan = {
node: spec.nodeId,
kubeRoute: spec.nodeKubeRoute,
lane: spec.lane,
namespace: spec.runtime.namespace,
deployment: spec.runtime.managerDeployment,
annotation: "kubectl.kubernetes.io/restartedAt",
reason: "reload-lane-secrets-or-runtime-env",
valuesPrinted: false,
};
if (options.dryRun || !options.confirm) {
return {
ok: true,
command: "agentrun control-plane restart",
mode: "dry-run",
mutation: false,
configPath,
target: agentRunLaneSummary(spec),
plan,
next: {
confirm: `bun scripts/cli.ts agentrun control-plane restart --node ${spec.nodeId} --lane ${spec.lane} --confirm`,
status: `bun scripts/cli.ts agentrun control-plane status --node ${spec.nodeId} --lane ${spec.lane}`,
},
valuesPrinted: false,
};
}
const result = await capture(config, spec.nodeKubeRoute, ["script", "--", restartYamlLaneScript(spec)]);
const payload = captureJsonPayload(result);
return {
ok: result.exitCode === 0 && payload.ok !== false,
command: "agentrun control-plane restart",
mode: "confirmed-rollout-restart",
mutation: true,
configPath,
target: agentRunLaneSummary(spec),
plan,
result: payload,
capture: compactCapture(result, { full: result.exitCode !== 0, stdoutTailChars: 4000, stderrTailChars: 4000 }),
next: {
status: `bun scripts/cli.ts agentrun control-plane status --node ${spec.nodeId} --lane ${spec.lane}`,
},
valuesPrinted: false,
};
}
async function secretSync(config: UniDeskConfig, options: SecretSyncOptions): Promise<Record<string, unknown>> {
const { configPath, spec } = resolveAgentRunLaneTarget(options);
const sources = collectLaneSecretSources(spec);
@@ -3864,6 +3915,52 @@ function secretSyncScript(_spec: AgentRunLaneSpec, values: Array<{ targetRef: {
].join("\n");
}
function restartYamlLaneScript(spec: AgentRunLaneSpec): string {
return [
"set +e",
`namespace=${shQuote(spec.runtime.namespace)}`,
`deployment=${shQuote(spec.runtime.managerDeployment)}`,
"ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"kubectl -n \"$namespace\" patch deployment \"$deployment\" --type='merge' -p \"{\\\"spec\\\":{\\\"template\\\":{\\\"metadata\\\":{\\\"annotations\\\":{\\\"kubectl.kubernetes.io/restartedAt\\\":\\\"$ts\\\"}}}}}\" >/tmp/agentrun-restart-patch.out 2>/tmp/agentrun-restart-patch.err",
"patch_rc=$?",
"if [ \"$patch_rc\" -eq 0 ]; then",
" kubectl -n \"$namespace\" rollout status deployment/\"$deployment\" --timeout=180s >/tmp/agentrun-rollout-status.out 2>/tmp/agentrun-rollout-status.err",
" rollout_rc=$?",
"else",
" rollout_rc=$patch_rc",
"fi",
"pods_json=$(kubectl -n \"$namespace\" get pod -l app.kubernetes.io/name=agentrun-mgr -o json 2>/dev/null || printf '{}')",
"deployment_json=$(kubectl -n \"$namespace\" get deployment \"$deployment\" -o json 2>/dev/null || printf '{}')",
"patch_err=$(cat /tmp/agentrun-restart-patch.err 2>/dev/null || true)",
"rollout_err=$(cat /tmp/agentrun-rollout-status.err 2>/dev/null || true)",
"PODS_JSON=\"$pods_json\" DEPLOYMENT_JSON=\"$deployment_json\" PATCH_RC=\"$patch_rc\" ROLLOUT_RC=\"$rollout_rc\" TS=\"$ts\" PATCH_ERR=\"$patch_err\" ROLLOUT_ERR=\"$rollout_err\" node <<'NODE'",
"const pods = JSON.parse(process.env.PODS_JSON || '{}');",
"const deployment = JSON.parse(process.env.DEPLOYMENT_JSON || '{}');",
"const conditions = Array.isArray(deployment.status?.conditions) ? deployment.status.conditions : [];",
"const items = Array.isArray(pods.items) ? pods.items : [];",
"const compactError = (value) => String(value || '').replace(/\\s+/g, ' ').trim().slice(0, 500) || null;",
"console.log(JSON.stringify({",
" ok: process.env.PATCH_RC === '0' && process.env.ROLLOUT_RC === '0',",
" restartedAt: process.env.TS,",
" patch: { exitCode: Number(process.env.PATCH_RC || '1'), error: compactError(process.env.PATCH_ERR) },",
" rollout: { exitCode: Number(process.env.ROLLOUT_RC || '1'), error: compactError(process.env.ROLLOUT_ERR) },",
" readyReplicas: deployment.status?.readyReplicas ?? null,",
" replicas: deployment.status?.replicas ?? null,",
" conditions: conditions.map((item) => ({ type: item.type, status: item.status, reason: item.reason ?? null })),",
" pods: items.map((pod) => ({",
" name: pod.metadata?.name ?? null,",
" phase: pod.status?.phase ?? null,",
" ready: (pod.status?.containerStatuses ?? []).map((item) => item.ready),",
" restarts: (pod.status?.containerStatuses ?? []).map((item) => item.restartCount),",
" waiting: (pod.status?.containerStatuses ?? []).map((item) => item.state?.waiting?.reason ?? null),",
" })),",
" valuesPrinted: false",
"}));",
"NODE",
"exit \"$rollout_rc\"",
].join("\n");
}
function applyYamlScript(yaml: string, fieldManager: string, dryRun: boolean): string {
const encoded = Buffer.from(yaml, "utf8").toString("base64");
return [