@pleri/olam-cli 0.1.145 → 0.1.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/skills-doctor.d.ts +14 -0
- package/dist/commands/skills-doctor.d.ts.map +1 -0
- package/dist/commands/skills-doctor.js +126 -0
- package/dist/commands/skills-doctor.js.map +1 -0
- package/dist/commands/skills-hook.d.ts +19 -0
- package/dist/commands/skills-hook.d.ts.map +1 -0
- package/dist/commands/skills-hook.js +99 -0
- package/dist/commands/skills-hook.js.map +1 -0
- package/dist/commands/skills-migrate-back.d.ts +21 -0
- package/dist/commands/skills-migrate-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-back.js +222 -0
- package/dist/commands/skills-migrate-back.js.map +1 -0
- package/dist/commands/skills-migrate-hooks-back.d.ts +19 -0
- package/dist/commands/skills-migrate-hooks-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks-back.js +83 -0
- package/dist/commands/skills-migrate-hooks-back.js.map +1 -0
- package/dist/commands/skills-migrate-hooks.d.ts +40 -0
- package/dist/commands/skills-migrate-hooks.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks.js +178 -0
- package/dist/commands/skills-migrate-hooks.js.map +1 -0
- package/dist/commands/skills-migrate.d.ts +33 -0
- package/dist/commands/skills-migrate.d.ts.map +1 -0
- package/dist/commands/skills-migrate.js +216 -0
- package/dist/commands/skills-migrate.js.map +1 -0
- package/dist/commands/skills-onboard.d.ts +26 -0
- package/dist/commands/skills-onboard.d.ts.map +1 -0
- package/dist/commands/skills-onboard.js +227 -0
- package/dist/commands/skills-onboard.js.map +1 -0
- package/dist/commands/skills-shadow-backups.d.ts +15 -0
- package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
- package/dist/commands/skills-shadow-backups.js +132 -0
- package/dist/commands/skills-shadow-backups.js.map +1 -0
- package/dist/commands/skills-source.d.ts +25 -0
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +305 -7
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +62 -7
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/substrate-audit-log.d.ts +49 -0
- package/dist/commands/substrate-audit-log.d.ts.map +1 -0
- package/dist/commands/substrate-audit-log.js +148 -0
- package/dist/commands/substrate-audit-log.js.map +1 -0
- package/dist/commands/substrate.d.ts +60 -0
- package/dist/commands/substrate.d.ts.map +1 -0
- package/dist/commands/substrate.js +175 -0
- package/dist/commands/substrate.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +30 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +8687 -4713
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +69 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +146 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/instrumentation.d.ts +85 -0
- package/dist/lib/instrumentation.d.ts.map +1 -0
- package/dist/lib/instrumentation.js +104 -0
- package/dist/lib/instrumentation.js.map +1 -0
- package/dist/lib/kubectl-wrap.d.ts +59 -0
- package/dist/lib/kubectl-wrap.d.ts.map +1 -0
- package/dist/lib/kubectl-wrap.js +130 -0
- package/dist/lib/kubectl-wrap.js.map +1 -0
- package/dist/lib/manifest-refresh.d.ts +95 -0
- package/dist/lib/manifest-refresh.d.ts.map +1 -0
- package/dist/lib/manifest-refresh.js +222 -0
- package/dist/lib/manifest-refresh.js.map +1 -0
- package/dist/lib/port-forward.d.ts +101 -0
- package/dist/lib/port-forward.d.ts.map +1 -0
- package/dist/lib/port-forward.js +240 -0
- package/dist/lib/port-forward.js.map +1 -0
- package/dist/lib/upgrade-kubernetes.d.ts +77 -0
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
- package/dist/lib/upgrade-kubernetes.js +277 -0
- package/dist/lib/upgrade-kubernetes.js.map +1 -0
- package/dist/mcp-server.js +20262 -18211
- package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
- package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
- package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
- package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
- package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
- package/host-cp/k8s/manifests/60-service.yaml +22 -0
- package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
- package/host-cp/src/plan-chat-service.mjs +31 -7
- package/host-cp/src/server.mjs +32 -7
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-forward.js","sourceRoot":"","sources":["../../src/lib/port-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;AAEnF,wFAAwF;AACxF,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAanC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAA8C,EAAE;IAEhD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC;IAChD,OAAO,KAAK,CAAC,WAAW,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,SAAiB;IACjE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,SAAS,MAAM,CAAC,MAAe;YAC7B,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,iFAAiF;IACjF,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,GAAG,EAAE;QACV,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;IAC/E,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAqB;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,YAAY,CAAC,IAAqB;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAe,EAAE,GAAW;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,OAAO,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,SAAiB,EACjB,MAAc,EACd,YAAoB,iBAAiB,EACrC,aAAqB,iBAAiB,EACtC,OAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAE1C,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,WAAW,GAAwB,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC5C,CAAC;QAED,yEAAyE;QACzE,MAAM,KAAK,GAAG,SAAS,CACrB,SAAS,EACT;YACE,WAAW,EAAE,OAAO;YACpB,cAAc;YACd,IAAI,EAAE,SAAS;YACf,MAAM;YACN,GAAG,SAAS,IAAI,UAAU,EAAE;SAC7B,EACD;YACE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;YACrC,QAAQ,EAAE,IAAI;SACf,CACF,CAAC;QAEF,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,qCAAqC;QACvF,CAAC;QAED,mDAAmD;QACnD,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjC,2EAA2E;QAC3E,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,4DAA4D;QAC5D,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,WAAW,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0EAA0E;AAC1E,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgrade-kubernetes.ts — 8-step kubernetes upgrade path for olam upgrade.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b C2 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Decisions consumed:
|
|
8
|
+
* D10 — context-allowlist + OLAM_K8S_CONTEXT_ACK strict-equality check
|
|
9
|
+
* D12 — Secret pre-check (base64-decode + key-name + placeholder exact match)
|
|
10
|
+
* D14 — --force-refresh-manifests flag + --accept-security-regression guard
|
|
11
|
+
* D15 — kubectl rollout status --timeout=90s; state snapshot on failure
|
|
12
|
+
* D17 — port-forward spawn via flock (spawnPortForward from port-forward.ts)
|
|
13
|
+
* D22 — probeKubernetesApiReachable pre-flight via kubectl-wrap (5s timeout)
|
|
14
|
+
*
|
|
15
|
+
* Step order:
|
|
16
|
+
* 0 probeKubernetesApiReachable — 5s timeout kubectl cluster-info
|
|
17
|
+
* 1 D10 context-allowlist + OLAM_K8S_CONTEXT_ACK strict-equality byte-for-byte
|
|
18
|
+
* 2 D12 Secret pre-check (olam-host-cp-secret; base64-decode; key-name check)
|
|
19
|
+
* 3 kubectl apply --context <pinned> -f ~/.olam/k8s/manifests/
|
|
20
|
+
* 4 D15 kubectl rollout status --context <pinned> --timeout=90s (95s wrap)
|
|
21
|
+
* 5 D17 port-forward spawn via flock
|
|
22
|
+
* 6 verify /health returns X-Olam-Engine: kubernetes
|
|
23
|
+
* 7 emit upgrade.complete instrumentation event
|
|
24
|
+
* 8 success message
|
|
25
|
+
*
|
|
26
|
+
* Manifests NOT auto-rolled-back on failure (D15 spec). Operator must
|
|
27
|
+
* manually intervene; state snapshot is printed on failure.
|
|
28
|
+
*/
|
|
29
|
+
import { kubectlWrap } from './kubectl-wrap.js';
|
|
30
|
+
import { spawnPortForward, probePortForwardLiveness, type PortForwardDeps } from './port-forward.js';
|
|
31
|
+
import { emitUpgradeComplete, type EmitOpts } from './instrumentation.js';
|
|
32
|
+
import { runManifestRefresh } from './manifest-refresh.js';
|
|
33
|
+
export declare const OLAM_K8S_MANIFESTS_DIR: string;
|
|
34
|
+
export declare const K8S_NAMESPACE = "olam";
|
|
35
|
+
export declare const HOST_CP_SECRET_NAME = "olam-host-cp-secret";
|
|
36
|
+
export declare const HOST_CP_DEPLOYMENT_NAME = "olam-host-cp";
|
|
37
|
+
export declare const PORT_FORWARD_TARGET = "service/olam-host-cp";
|
|
38
|
+
export declare const HOST_CP_HEALTH_URL = "http://127.0.0.1:19000/health";
|
|
39
|
+
export interface UpgradeKubernetesDeps {
|
|
40
|
+
/** Override kubectl-wrap for tests. */
|
|
41
|
+
readonly kubectlWrapImpl?: typeof kubectlWrap;
|
|
42
|
+
/** Override spawnPortForward for tests. */
|
|
43
|
+
readonly spawnPortForwardImpl?: typeof spawnPortForward;
|
|
44
|
+
/** Override probePortForwardLiveness for tests. */
|
|
45
|
+
readonly probePortForwardLivenessImpl?: typeof probePortForwardLiveness;
|
|
46
|
+
/** Override fetch for /health verification in tests. */
|
|
47
|
+
readonly fetchImpl?: (url: string, init?: RequestInit) => Promise<Response>;
|
|
48
|
+
/** Override emitUpgradeComplete for tests. */
|
|
49
|
+
readonly emitImpl?: typeof emitUpgradeComplete;
|
|
50
|
+
/** Override manifest refresh for tests. */
|
|
51
|
+
readonly manifestRefreshImpl?: typeof runManifestRefresh;
|
|
52
|
+
/** Override manifests dir path for tests. */
|
|
53
|
+
readonly manifestsDir?: string;
|
|
54
|
+
/** Override PortForwardDeps for tests (passed into spawnPortForward). */
|
|
55
|
+
readonly portForwardDeps?: PortForwardDeps;
|
|
56
|
+
/** Override emit opts for tests. */
|
|
57
|
+
readonly emitOpts?: EmitOpts;
|
|
58
|
+
/** Override stdout for tests. */
|
|
59
|
+
readonly stdout?: NodeJS.WritableStream;
|
|
60
|
+
/** Override stderr for tests. */
|
|
61
|
+
readonly stderr?: NodeJS.WritableStream;
|
|
62
|
+
}
|
|
63
|
+
export interface UpgradeKubernetesOpts {
|
|
64
|
+
readonly forceRefreshManifests?: boolean;
|
|
65
|
+
readonly acceptSecurityRegression?: boolean;
|
|
66
|
+
}
|
|
67
|
+
export interface UpgradeKubernetesResult {
|
|
68
|
+
readonly exitCode: number;
|
|
69
|
+
readonly summary: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Main entrypoint for the kubernetes upgrade path.
|
|
73
|
+
*
|
|
74
|
+
* Called from upgrade.ts when host.substrate === 'kubernetes'.
|
|
75
|
+
*/
|
|
76
|
+
export declare function runUpgradeKubernetes(opts?: UpgradeKubernetesOpts, deps?: UpgradeKubernetesDeps): Promise<UpgradeKubernetesResult>;
|
|
77
|
+
//# sourceMappingURL=upgrade-kubernetes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-kubernetes.d.ts","sourceRoot":"","sources":["../../src/lib/upgrade-kubernetes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAOH,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAA4B,MAAM,uBAAuB,CAAC;AAGrF,eAAO,MAAM,sBAAsB,QAA2C,CAAC;AAC/E,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,uBAAuB,iBAAiB,CAAC;AACtD,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAC1D,eAAO,MAAM,kBAAkB,kCAAkC,CAAC;AAclE,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,WAAW,CAAC;IAC9C,2CAA2C;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IACxD,mDAAmD;IACnD,QAAQ,CAAC,4BAA4B,CAAC,EAAE,OAAO,wBAAwB,CAAC;IACxE,wDAAwD;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5E,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,mBAAmB,CAAC;IAC/C,2CAA2C;IAC3C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,kBAAkB,CAAC;IACzD,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,oCAAoC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,iCAAiC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAqJD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,qBAA0B,EAChC,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,uBAAuB,CAAC,CAgKlC"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* upgrade-kubernetes.ts — 8-step kubernetes upgrade path for olam upgrade.
|
|
3
|
+
*
|
|
4
|
+
* Phase 1b C2 of olam-host-suite-phase-1b-k3s-beta-flavour (plan
|
|
5
|
+
* ~/.claude/plans/olam-host-suite-phase-1b-k3s-beta-flavour.md).
|
|
6
|
+
*
|
|
7
|
+
* Decisions consumed:
|
|
8
|
+
* D10 — context-allowlist + OLAM_K8S_CONTEXT_ACK strict-equality check
|
|
9
|
+
* D12 — Secret pre-check (base64-decode + key-name + placeholder exact match)
|
|
10
|
+
* D14 — --force-refresh-manifests flag + --accept-security-regression guard
|
|
11
|
+
* D15 — kubectl rollout status --timeout=90s; state snapshot on failure
|
|
12
|
+
* D17 — port-forward spawn via flock (spawnPortForward from port-forward.ts)
|
|
13
|
+
* D22 — probeKubernetesApiReachable pre-flight via kubectl-wrap (5s timeout)
|
|
14
|
+
*
|
|
15
|
+
* Step order:
|
|
16
|
+
* 0 probeKubernetesApiReachable — 5s timeout kubectl cluster-info
|
|
17
|
+
* 1 D10 context-allowlist + OLAM_K8S_CONTEXT_ACK strict-equality byte-for-byte
|
|
18
|
+
* 2 D12 Secret pre-check (olam-host-cp-secret; base64-decode; key-name check)
|
|
19
|
+
* 3 kubectl apply --context <pinned> -f ~/.olam/k8s/manifests/
|
|
20
|
+
* 4 D15 kubectl rollout status --context <pinned> --timeout=90s (95s wrap)
|
|
21
|
+
* 5 D17 port-forward spawn via flock
|
|
22
|
+
* 6 verify /health returns X-Olam-Engine: kubernetes
|
|
23
|
+
* 7 emit upgrade.complete instrumentation event
|
|
24
|
+
* 8 success message
|
|
25
|
+
*
|
|
26
|
+
* Manifests NOT auto-rolled-back on failure (D15 spec). Operator must
|
|
27
|
+
* manually intervene; state snapshot is printed on failure.
|
|
28
|
+
*/
|
|
29
|
+
import * as os from 'node:os';
|
|
30
|
+
import * as path from 'node:path';
|
|
31
|
+
import ora from 'ora';
|
|
32
|
+
import pc from 'picocolors';
|
|
33
|
+
import { printError, printSuccess, printInfo, printWarning } from '../output.js';
|
|
34
|
+
import { kubectlWrap } from './kubectl-wrap.js';
|
|
35
|
+
import { spawnPortForward, probePortForwardLiveness } from './port-forward.js';
|
|
36
|
+
import { emitUpgradeComplete } from './instrumentation.js';
|
|
37
|
+
import { runManifestRefresh } from './manifest-refresh.js';
|
|
38
|
+
import { OLAM_HOME } from './config.js';
|
|
39
|
+
export const OLAM_K8S_MANIFESTS_DIR = path.join(OLAM_HOME, 'k8s', 'manifests');
|
|
40
|
+
export const K8S_NAMESPACE = 'olam';
|
|
41
|
+
export const HOST_CP_SECRET_NAME = 'olam-host-cp-secret';
|
|
42
|
+
export const HOST_CP_DEPLOYMENT_NAME = 'olam-host-cp';
|
|
43
|
+
export const PORT_FORWARD_TARGET = 'service/olam-host-cp';
|
|
44
|
+
export const HOST_CP_HEALTH_URL = 'http://127.0.0.1:19000/health';
|
|
45
|
+
/** Placeholder values that indicate the Secret has not been configured (D12). */
|
|
46
|
+
const PLACEHOLDER_VALUES = new Set(['OLAM_AUTH_SECRET', 'GH_TOKEN']);
|
|
47
|
+
/** Required keys in the olam-host-cp-secret (D12). */
|
|
48
|
+
const REQUIRED_SECRET_KEYS = ['OLAM_AUTH_SECRET', 'GH_TOKEN'];
|
|
49
|
+
/** D10 — allowed kubectl context patterns. Currently: anything non-empty.
|
|
50
|
+
* The allowlist is enforced by OLAM_K8S_CONTEXT_ACK strict-equality. */
|
|
51
|
+
function isContextAllowed(context) {
|
|
52
|
+
return typeof context === 'string' && context.length > 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Step 0 — D22: probe Kubernetes API reachability (5s timeout).
|
|
56
|
+
* Uses kubectl cluster-info with a tight timeout to detect unreachable API server.
|
|
57
|
+
*/
|
|
58
|
+
async function probeKubernetesApiReachable(context, deps) {
|
|
59
|
+
const wrap = deps.kubectlWrapImpl ?? kubectlWrap;
|
|
60
|
+
const result = await wrap(['--context', context, 'cluster-info'], { timeout: 5_000 });
|
|
61
|
+
return result.ok;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Step 2 — D12: Secret pre-check.
|
|
65
|
+
*
|
|
66
|
+
* Fetches the olam-host-cp-secret, base64-decodes each data value, and:
|
|
67
|
+
* a) Asserts OLAM_AUTH_SECRET and GH_TOKEN keys are present.
|
|
68
|
+
* b) EXACT-EQUALS check against placeholder strings — if any decoded value
|
|
69
|
+
* equals the literal placeholder name ('OLAM_AUTH_SECRET' or 'GH_TOKEN'),
|
|
70
|
+
* the secret has not been configured and the upgrade is refused.
|
|
71
|
+
*
|
|
72
|
+
* Returns null on success; error message string on failure.
|
|
73
|
+
*/
|
|
74
|
+
async function checkSecretPreCondition(context, deps) {
|
|
75
|
+
const wrap = deps.kubectlWrapImpl ?? kubectlWrap;
|
|
76
|
+
const result = await wrap([
|
|
77
|
+
'--context', context,
|
|
78
|
+
'get', 'secret', HOST_CP_SECRET_NAME,
|
|
79
|
+
'-n', K8S_NAMESPACE,
|
|
80
|
+
'-o', 'json',
|
|
81
|
+
], { timeout: 15_000 });
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
return (`Secret "${HOST_CP_SECRET_NAME}" not found in namespace "${K8S_NAMESPACE}".\n` +
|
|
84
|
+
` Create it first: kubectl --context ${context} apply -f <your-secret.yaml>\n` +
|
|
85
|
+
` ${result.stderr.split('\n')[0] ?? ''}`);
|
|
86
|
+
}
|
|
87
|
+
let secretJson;
|
|
88
|
+
try {
|
|
89
|
+
secretJson = JSON.parse(result.stdout);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return `Failed to parse Secret JSON: ${result.stdout.slice(0, 200)}`;
|
|
93
|
+
}
|
|
94
|
+
const data = secretJson.data ?? {};
|
|
95
|
+
for (const key of REQUIRED_SECRET_KEYS) {
|
|
96
|
+
if (!(key in data)) {
|
|
97
|
+
return (`Secret "${HOST_CP_SECRET_NAME}" is missing required key "${key}".\n` +
|
|
98
|
+
` Keys found: ${Object.keys(data).join(', ') || '(none)'}\n` +
|
|
99
|
+
` Add the key and re-run.`);
|
|
100
|
+
}
|
|
101
|
+
const b64 = data[key] ?? '';
|
|
102
|
+
const decoded = Buffer.from(b64, 'base64').toString('utf8');
|
|
103
|
+
// EXACT-EQUALS: decoded value === placeholder name means unconfigured (D12).
|
|
104
|
+
if (PLACEHOLDER_VALUES.has(decoded)) {
|
|
105
|
+
return (`Secret "${HOST_CP_SECRET_NAME}" key "${key}" still holds its placeholder value.\n` +
|
|
106
|
+
` Replace the placeholder with a real value, then re-run.`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null; // all checks passed
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Step 4 — D15: kubectl rollout status with state snapshot on failure.
|
|
113
|
+
* Wrapper timeout: 95s (5s padding over the kubectl --timeout=90s).
|
|
114
|
+
*/
|
|
115
|
+
async function waitForRollout(context, deps, stderr) {
|
|
116
|
+
const wrap = deps.kubectlWrapImpl ?? kubectlWrap;
|
|
117
|
+
const result = await wrap([
|
|
118
|
+
'--context', context,
|
|
119
|
+
'rollout', 'status',
|
|
120
|
+
`deployment/${HOST_CP_DEPLOYMENT_NAME}`,
|
|
121
|
+
'-n', K8S_NAMESPACE,
|
|
122
|
+
'--timeout=90s',
|
|
123
|
+
], { timeout: 95_000 });
|
|
124
|
+
if (result.ok)
|
|
125
|
+
return true;
|
|
126
|
+
// State snapshot on failure (D15).
|
|
127
|
+
stderr.write(`${pc.red('error:')} kubectl rollout status timed out or failed.\n` +
|
|
128
|
+
` reason: ${result.reason ?? 'nonzero'} exitCode=${result.exitCode}\n\n`);
|
|
129
|
+
stderr.write(`${pc.dim('--- kubectl get pods -n olam -o wide ---')}\n`);
|
|
130
|
+
const podsResult = await wrap(['--context', context, 'get', 'pods', '-n', K8S_NAMESPACE, '-o', 'wide'], { timeout: 10_000 });
|
|
131
|
+
stderr.write((podsResult.stdout || podsResult.stderr || '(no output)') + '\n');
|
|
132
|
+
stderr.write(`\n${pc.dim('--- kubectl describe deployment/olam-host-cp -n olam ---')}\n`);
|
|
133
|
+
const descResult = await wrap(['--context', context, 'describe', `deployment/${HOST_CP_DEPLOYMENT_NAME}`, '-n', K8S_NAMESPACE], { timeout: 10_000 });
|
|
134
|
+
stderr.write((descResult.stdout || descResult.stderr || '(no output)') + '\n');
|
|
135
|
+
stderr.write(`\n${pc.yellow('note:')} Manifests are NOT auto-rolled-back. Inspect the state above and remediate manually.\n`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Step 6 — verify /health returns X-Olam-Engine: kubernetes.
|
|
140
|
+
*/
|
|
141
|
+
async function verifyHealthHeader(deps) {
|
|
142
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
143
|
+
try {
|
|
144
|
+
const res = await fetchImpl(HOST_CP_HEALTH_URL, {
|
|
145
|
+
signal: AbortSignal.timeout(5_000),
|
|
146
|
+
});
|
|
147
|
+
const engine = res.headers.get('x-olam-engine') ?? res.headers.get('X-Olam-Engine');
|
|
148
|
+
return { ok: engine === 'kubernetes', engineHeader: engine };
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return { ok: false, engineHeader: null };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Main entrypoint for the kubernetes upgrade path.
|
|
156
|
+
*
|
|
157
|
+
* Called from upgrade.ts when host.substrate === 'kubernetes'.
|
|
158
|
+
*/
|
|
159
|
+
export async function runUpgradeKubernetes(opts = {}, deps = {}) {
|
|
160
|
+
const stdout = deps.stdout ?? process.stdout;
|
|
161
|
+
const stderr = deps.stderr ?? process.stderr;
|
|
162
|
+
const manifestsDir = deps.manifestsDir ?? OLAM_K8S_MANIFESTS_DIR;
|
|
163
|
+
const startMs = Date.now();
|
|
164
|
+
// ── Step 0: D22 — probe Kubernetes API reachability (5s) ─────────
|
|
165
|
+
const step0Spinner = ora('Probing Kubernetes API reachability').start();
|
|
166
|
+
const context = process.env.OLAM_K8S_CONTEXT_ACK ?? '';
|
|
167
|
+
// We need a context for the probe — use the env var if set, else try default.
|
|
168
|
+
// The full context validation happens at step 1.
|
|
169
|
+
const probeContext = context.length > 0 ? context : 'default';
|
|
170
|
+
const reachable = await probeKubernetesApiReachable(probeContext, deps);
|
|
171
|
+
if (!reachable) {
|
|
172
|
+
step0Spinner.fail('Kubernetes API not reachable');
|
|
173
|
+
stderr.write(`${pc.red('error:')} kubectl cluster-info failed (5s timeout).\n` +
|
|
174
|
+
` Ensure your kubectl context is correct and the cluster is reachable.\n` +
|
|
175
|
+
` Set OLAM_K8S_CONTEXT_ACK=<context-name> to your active kubectl context.\n`);
|
|
176
|
+
return { exitCode: 1, summary: 'kubernetes api not reachable' };
|
|
177
|
+
}
|
|
178
|
+
step0Spinner.succeed('Kubernetes API reachable');
|
|
179
|
+
// ── Step 1: D10 — context-allowlist + OLAM_K8S_CONTEXT_ACK ───────
|
|
180
|
+
const step1Spinner = ora('Verifying kubectl context (D10)').start();
|
|
181
|
+
// OLAM_K8S_CONTEXT_ACK is byte-for-byte, no trim, no case-fold (D10).
|
|
182
|
+
const ackValue = process.env.OLAM_K8S_CONTEXT_ACK ?? '';
|
|
183
|
+
if (ackValue.length === 0 || !isContextAllowed(ackValue)) {
|
|
184
|
+
step1Spinner.fail('Context ACK missing or disallowed');
|
|
185
|
+
stderr.write(`${pc.red('error:')} OLAM_K8S_CONTEXT_ACK is not set or empty.\n` +
|
|
186
|
+
` Set it to your kubectl context name (byte-for-byte match):\n` +
|
|
187
|
+
` export OLAM_K8S_CONTEXT_ACK=<your-context-name>\n` +
|
|
188
|
+
` See GATES.md G-001 for the context-allowlist requirement.\n`);
|
|
189
|
+
return { exitCode: 1, summary: 'context ack not set' };
|
|
190
|
+
}
|
|
191
|
+
// Capture the pinned context name (byte-for-byte, as provided).
|
|
192
|
+
const pinnedContext = ackValue;
|
|
193
|
+
// Audit WARN on bypass (D10: operator explicitly acknowledged a potentially unsafe context).
|
|
194
|
+
process.stderr.write(`${pc.yellow('[WARN]')} OLAM_K8S_UNSAFE_CONTEXT_ACK ctx=${pinnedContext}\n`);
|
|
195
|
+
step1Spinner.succeed(`Context pinned: ${pc.bold(pinnedContext)}`);
|
|
196
|
+
// ── D14: --force-refresh-manifests flag ──────────────────────────
|
|
197
|
+
if (opts.forceRefreshManifests) {
|
|
198
|
+
const step14Spinner = ora('Refreshing manifests (D14)').start();
|
|
199
|
+
const refreshImpl = deps.manifestRefreshImpl ?? runManifestRefresh;
|
|
200
|
+
const refreshResult = await refreshImpl(manifestsDir, opts.acceptSecurityRegression === true, {});
|
|
201
|
+
if (!refreshResult.ok) {
|
|
202
|
+
step14Spinner.fail('Manifest refresh refused');
|
|
203
|
+
stderr.write(`${pc.red('error:')} ${refreshResult.message}\n`);
|
|
204
|
+
return { exitCode: 1, summary: 'manifest refresh refused' };
|
|
205
|
+
}
|
|
206
|
+
step14Spinner.succeed(refreshResult.message);
|
|
207
|
+
}
|
|
208
|
+
// ── Step 2: D12 — Secret pre-check ───────────────────────────────
|
|
209
|
+
const step2Spinner = ora(`Checking Secret ${HOST_CP_SECRET_NAME} (D12)`).start();
|
|
210
|
+
const secretError = await checkSecretPreCondition(pinnedContext, deps);
|
|
211
|
+
if (secretError !== null) {
|
|
212
|
+
step2Spinner.fail('Secret pre-check failed');
|
|
213
|
+
stderr.write(`${pc.red('error:')} ${secretError}\n`);
|
|
214
|
+
return { exitCode: 1, summary: 'secret pre-check failed' };
|
|
215
|
+
}
|
|
216
|
+
step2Spinner.succeed(`Secret ${HOST_CP_SECRET_NAME} verified`);
|
|
217
|
+
// ── Step 3: kubectl apply ─────────────────────────────────────────
|
|
218
|
+
const step3Spinner = ora('Applying manifests').start();
|
|
219
|
+
const wrap = deps.kubectlWrapImpl ?? kubectlWrap;
|
|
220
|
+
const applyResult = await wrap(['--context', pinnedContext, 'apply', '-f', manifestsDir], { timeout: 120_000 });
|
|
221
|
+
if (!applyResult.ok) {
|
|
222
|
+
step3Spinner.fail('kubectl apply failed');
|
|
223
|
+
stderr.write(`${pc.red('error:')} kubectl apply failed (exit ${applyResult.exitCode}):\n` +
|
|
224
|
+
` ${applyResult.stderr.split('\n').slice(0, 5).join('\n ')}\n`);
|
|
225
|
+
return { exitCode: 1, summary: 'kubectl apply failed' };
|
|
226
|
+
}
|
|
227
|
+
step3Spinner.succeed('Manifests applied');
|
|
228
|
+
// ── Step 4: D15 — kubectl rollout status (90s timeout, 95s wrap) ──
|
|
229
|
+
const step4Spinner = ora('Waiting for rollout (90s)').start();
|
|
230
|
+
const rolloutOk = await waitForRollout(pinnedContext, deps, stderr);
|
|
231
|
+
if (!rolloutOk) {
|
|
232
|
+
step4Spinner.fail('Rollout status failed or timed out');
|
|
233
|
+
return { exitCode: 1, summary: 'rollout status timed out' };
|
|
234
|
+
}
|
|
235
|
+
step4Spinner.succeed('Rollout complete');
|
|
236
|
+
// ── Step 5: D17 — port-forward spawn via flock ───────────────────
|
|
237
|
+
const step5Spinner = ora('Establishing port-forward').start();
|
|
238
|
+
const pfSpawn = deps.spawnPortForwardImpl ?? spawnPortForward;
|
|
239
|
+
const pfResult = await pfSpawn(pinnedContext, K8S_NAMESPACE, PORT_FORWARD_TARGET, 19000, 19000, deps.portForwardDeps ?? {});
|
|
240
|
+
if (pfResult.spawned) {
|
|
241
|
+
step5Spinner.succeed(`Port-forward spawned (pid ${pfResult.pid})`);
|
|
242
|
+
}
|
|
243
|
+
else if (pfResult.reason === 'live') {
|
|
244
|
+
step5Spinner.succeed('Port-forward already live');
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
step5Spinner.warn('Port-forward lock held by concurrent caller; skipping spawn');
|
|
248
|
+
}
|
|
249
|
+
// Brief wait for port-forward tunnel to be ready before health check.
|
|
250
|
+
await new Promise((r) => setTimeout(r, 1_500));
|
|
251
|
+
// ── Step 6: verify /health returns X-Olam-Engine: kubernetes ─────
|
|
252
|
+
const step6Spinner = ora('Verifying host-cp health (X-Olam-Engine: kubernetes)').start();
|
|
253
|
+
const healthCheck = await verifyHealthHeader(deps);
|
|
254
|
+
if (!healthCheck.ok) {
|
|
255
|
+
step6Spinner.fail(healthCheck.engineHeader !== null
|
|
256
|
+
? `X-Olam-Engine header is "${healthCheck.engineHeader}" (expected "kubernetes")`
|
|
257
|
+
: 'host-cp /health not reachable via port-forward');
|
|
258
|
+
stderr.write(`${pc.red('error:')} host-cp did not report engine=kubernetes.\n` +
|
|
259
|
+
` Check that the deployment rolled out with the correct image.\n`);
|
|
260
|
+
return { exitCode: 1, summary: 'health check failed — engine mismatch' };
|
|
261
|
+
}
|
|
262
|
+
step6Spinner.succeed('host-cp reports X-Olam-Engine: kubernetes');
|
|
263
|
+
// ── Step 7: emit upgrade.complete instrumentation event ───────────
|
|
264
|
+
const emitImpl = deps.emitImpl ?? emitUpgradeComplete;
|
|
265
|
+
emitImpl({
|
|
266
|
+
substrate: 'kubernetes',
|
|
267
|
+
duration_ms: Date.now() - startMs,
|
|
268
|
+
flavor: 'k3s',
|
|
269
|
+
}, deps.emitOpts ?? {});
|
|
270
|
+
// ── Step 8: success message ────────────────────────────────────────
|
|
271
|
+
printSuccess('olam upgrade (kubernetes) complete');
|
|
272
|
+
stdout.write(` context: ${pc.bold(pinnedContext)}\n`);
|
|
273
|
+
stdout.write(` substrate: ${pc.bold('kubernetes')} (flavor=k3s)\n`);
|
|
274
|
+
stdout.write(` port-forward: 127.0.0.1:19000 → ${PORT_FORWARD_TARGET}\n`);
|
|
275
|
+
return { exitCode: 0, summary: 'kubernetes upgrade complete' };
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=upgrade-kubernetes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-kubernetes.js","sourceRoot":"","sources":["../../src/lib/upgrade-kubernetes.ts"],"names":[],"mappings":"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"}
|