Commit Graph

10 Commits

Author SHA1 Message Date
github-actions[bot]
86ae3fcf18 chore(deploy): bump openova-flow-adapter-flux image to 2ffdba0 [skip ci] 2026-05-11 16:24:51 +00:00
github-actions[bot]
61ffec0e14 chore(deploy): bump openova-flow-adapter-flux image to d7175c6 [skip ci] 2026-05-11 13:44:26 +00:00
e3mrah
d7175c6506
chore(openova-flow): bump chart 0.1.0 → 0.1.1 to force chroot re-pull (#1406)
prov #34's chroot Flux pulled bp-openova-flow-{server,emitter} 0.1.0
at install time. PR #1404 republished the same 0.1.0 tag with the
ghcr.io image repo, but OCI HelmRepository sources don't re-pull a
tag they've already cached by digest — even when the bytes change.

Bump Chart.yaml version + bootstrap-kit HR pins to 0.1.1 so Flux
detects the new version and pulls cleanly. No semantic change vs PR
#1404 — same repo, same templates, just a fresh tag.

Co-authored-by: hatiyildiz <269457768+hatiyildiz@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 17:41:33 +04:00
github-actions[bot]
cab844a58f chore(deploy): bump openova-flow-adapter-flux image to a94f6a3 [skip ci] 2026-05-11 13:18:02 +00:00
e3mrah
a94f6a356b
fix(openova-flow): chart image repo = direct ghcr.io (match catalyst pattern) (#1404)
prov #34 chroot has bp-openova-flow-server + bp-openova-flow-emitter
HRs Ready=True but pods stuck in ImagePullBackOff:

  Failed to pull image
  "harbor.openova.io/proxy-ghcr/openova-io/openova/openova-flow-server:0ac1297":
  failed to resolve reference: ... not found

Root cause: mothership Harbor's proxy-ghcr project doesn't carry
ghcr.io auth for openova-io's PRIVATE container packages. Direct
`harbor.openova.io/...` references bypass containerd's transparent
ghcr.io→harbor rewrite (registries.yaml v1) and force Harbor to
upstream-pull, which 404s on private images.

catalyst-api + catalyst-ui (also private) work fine because their
charts reference `ghcr.io/openova-io/openova/...` directly. containerd
rewrites at the wire (MIRROR-EVERYTHING preserved), and kubelet auths
with the `ghcr-pull` imagePullSecret (reflected into every namespace
by bp-reflector).

Switch openova-flow-{server,emitter} charts to the same pattern.

Co-authored-by: hatiyildiz <269457768+hatiyildiz@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 17:15:42 +04:00
github-actions[bot]
590e38ea25 chore(deploy): bump openova-flow-adapter-flux image to b8a7596 [skip ci] 2026-05-11 13:02:26 +00:00
github-actions[bot]
03af082638 chore(deploy): bump openova-flow-adapter-flux image to 0ac1297 [skip ci] 2026-05-11 12:07:30 +00:00
e3mrah
e278ecac88
fix(openova-flow): chart image.tag default latest so smoke renders (#1397)
Blueprint Release smoke step renders charts with default values, but
both openova-flow-{server,emitter} charts had `image.tag: ""` which
fired the _helpers.tpl image-fail-fast at render. Default to `latest`
so smoke passes. CI's image-build workflow seds in the real short-SHA
on every push to products/openova-flow/{server,adapter-flux}/**, and
the bootstrap-kit HRs override at install time so runtime is always
deterministic. `latest` is only the render-default placeholder.

Co-authored-by: hatiyildiz <269457768+hatiyildiz@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:58:51 +04:00
e3mrah
da3ec71705
fix(openova-flow-emitter): drop chart-render requireConfig — runtime check exists (#1395)
Blueprint Release smoke step renders charts with default values to
validate they're well-formed. The chart's _helpers.tpl had a
`requireConfig` macro that called `fail` if flowServerUrl/flowId/
regionKey were empty — which is ALWAYS true at default-value render —
so the chart was unpublishable.

The Go adapter binary already validates these env vars at startup
(products/openova-flow/adapter-flux/internal/config/env.go) with the
same fail-fast intent. The chart-level check was redundant. Replace
with a no-op stub so smoke render passes; runtime safety is preserved
in the binary.

Co-authored-by: hatiyildiz <269457768+hatiyildiz@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:56:10 +04:00
e3mrah
aaaaadf8bc
feat(openova-flow): server (HTTP+SSE event router) + flux adapter (K8s informer sidecar) (#1390)
Agent #2 of 3 for OpenovaFlow. Ships the Go backend independently of
Agent #1's TS packages (@openova/flow-core + @openova/flow-canvas);
the FlowMessage JSON contract is locked between agents.

Two Go modules (separate go.mod each so the dep graphs stay decoupled):

- products/openova-flow/server/ — stateless HTTP+SSE event router.
  Map<flowId, RingBuffer<FlowMessage>>, in-memory, no DB. Endpoints:
  POST /v1/flows/{flowId}/events, GET /v1/flows/{flowId}/snapshot,
  GET /v1/flows/{flowId}/stream (SSE with 15s heartbeats + Last-Event-ID
  seq stamping), DELETE /v1/flows/{flowId}, GET /healthz, /readyz.
  Zero external Go deps (stdlib net/http). Ring cap default 4096
  (env-overridable). Locked schema validation rejects unknown envelope
  variants with 400.

- products/openova-flow/adapter-flux/ — DaemonSet sidecar that watches
  helm.toolkit.fluxcd.io/v2.HelmRelease + HelmChart CRs via
  client-go's dynamicinformer.NewFilteredDynamicSharedInformerFactory
  (canonical seam: products/catalyst/bootstrap/api/internal/k8scache/factory.go),
  maps each event to FlowMessage via a pure-transform mapper, POSTs to
  the configured openova-flow-server with exponential-backoff retry.
  Status mapping: Ready=True → succeeded, InstallFailed/UpgradeFailed/
  RetriesExhausted → failed, Progressing/Unknown/other-False → running,
  no Ready yet → pending. FlowNode.id format "{REGION_KEY}/{hrName}"
  so multi-region renders correctly. Region-aware: synthetic region
  parent FlowNode emitted on bootstrap; dependsOn entries fan-out to
  finish-to-start relationships.

Two wrapper charts under platform/openova-flow-{server,emitter}/chart/
(canonical seam: platform/qa-app/chart/ for the simple
Deployment+Service+SA shape; platform/k8s-ws-proxy/chart/ for the
DaemonSet+ClusterRole+ClusterRoleBinding shape). MIRROR-EVERYTHING:
image refs go through harbor.openova.io/proxy-ghcr/openova-io/...
Image tag + required runtime config fail-fast at chart render via
_helpers.tpl so silent ImagePullBackOff / boot crash is impossible.

Two bootstrap-kit HRs added (slots 56 + 57):
- 56-bp-openova-flow-server (dependsOn: bp-cilium, bp-cert-manager) —
  installs on primary cluster only; Cilium Gateway HTTPRoute at
  openova-flow.<sovereignFQDN> for cross-cluster ingest.
- 57-bp-openova-flow-emitter (dependsOn: bp-flux) — DaemonSet, runs
  on every cluster (mother + Sovereign + every secondary region).

scripts/expected-bootstrap-deps.yaml updated; check-bootstrap-deps.sh
audit passes (drift=0, cycles=0).

Tests (all green):
- server contract_test.go — every FlowMessage variant round-trips JSON,
  unknown/malformed variants reject. Cross-flow Triggerer/ToFlowID
  preserved.
- server server_test.go — full HTTP surface, including SSE replay+tail
  with a real httptest.Server.
- adapter mapper_test.go — every HelmRelease.status.conditions[Ready]
  transition + multi-dependsOn fan-out + family-label/heuristic + region
  fallback.

Verification done locally:
- (cd products/openova-flow/server && go build ./... && go test ./...) — PASS
- (cd products/openova-flow/adapter-flux && go build ./... && go test ./...) — PASS
- helm template platform/openova-flow-server/chart/ — renders cleanly
- helm template platform/openova-flow-emitter/chart/ — renders cleanly
- bash scripts/check-bootstrap-deps.sh — PASS (drift=0)

Agent #3 follow-ups (called out in slot 57's HelmRelease comments):
- Thread SOVEREIGN_DEPLOYMENT_ID + REGION_KEY into the
  postBuild.substitute env in infra/hetzner/cloudinit-control-plane.tftpl
  so the emitter's flowId/regionKey become per-deployment + per-region
  automatically. Today the slot uses SOVEREIGN_FQDN as the flowId
  fallback and "primary" as the regionKey default; per-Sovereign overlays
  can override pre-Agent-#3.
- catalyst-api proxy at /sovereign/api/v1/flows/{id}/stream so the
  Sovereign Console canvas hits a single in-tree origin.

Co-authored-by: e3mrah <1234567+e3mrah@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 15:36:54 +04:00