From c81b222cf6f986f009230130f4b2b977fc1ac28c Mon Sep 17 00:00:00 2001 From: Andrei Kvapil Date: Thu, 13 Nov 2025 00:52:50 -0500 Subject: [PATCH] [dashboard] Introduce VNC console Signed-off-by: Andrei Kvapil --- internal/controller/dashboard/factory.go | 33 +++++++++++++++++++ .../dashboard/images/openapi-ui/Dockerfile | 4 +-- .../dashboard/templates/nginx-config.yaml | 8 +++++ packages/system/dashboard/values.yaml | 2 +- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/internal/controller/dashboard/factory.go b/internal/controller/dashboard/factory.go index 4e18ff09..6df38842 100644 --- a/internal/controller/dashboard/factory.go +++ b/internal/controller/dashboard/factory.go @@ -44,6 +44,9 @@ func (m *Manager) ensureFactory(ctx context.Context, crd *cozyv1alpha1.Cozystack if flags.Secrets { tabs = append(tabs, secretsTab(kind)) } + if prefix, ok := vncTabPrefix(kind); ok { + tabs = append(tabs, vncTab(prefix)) + } tabs = append(tabs, yamlTab(plural)) // Use unified factory creation @@ -331,6 +334,36 @@ func yamlTab(plural string) map[string]any { } } +func vncTabPrefix(kind string) (string, bool) { + switch kind { + case "VirtualMachine": + return "virtual-machine", true + case "VMInstance": + return "vm-instance", true + default: + return "", false + } +} + +func vncTab(prefix string) map[string]any { + return map[string]any{ + "key": "vnc", + "label": "VNC", + "children": []any{ + map[string]any{ + "type": "VMVNC", + "data": map[string]any{ + "id": "vm-vnc", + "cluster": "{2}", + "namespace": "{reqsJsonPath[0]['.metadata.namespace']['-']}", + "substractHeight": float64(400), + "vmName": fmt.Sprintf("%s-{reqsJsonPath[0]['.metadata.name']['-']}", prefix), + }, + }, + }, + } +} + // ---------------- OpenAPI → Right column ---------------- func buildOpenAPIParamsBlocks(schemaJSON string, keysOrder [][]string) []any { diff --git a/packages/system/dashboard/images/openapi-ui/Dockerfile b/packages/system/dashboard/images/openapi-ui/Dockerfile index a33be863..f430f8e6 100644 --- a/packages/system/dashboard/images/openapi-ui/Dockerfile +++ b/packages/system/dashboard/images/openapi-ui/Dockerfile @@ -5,7 +5,7 @@ ARG NODE_VERSION=20.18.1 FROM node:${NODE_VERSION}-alpine AS openapi-k8s-toolkit-builder RUN apk add git WORKDIR /src -ARG COMMIT=7bd5380c6c4606640dd3bac68bf9dce469470518 +ARG COMMIT=cb2f122caafaa2fd5455750213d9e633017ec555 RUN wget -O- https://github.com/cozystack/openapi-k8s-toolkit/archive/${COMMIT}.tar.gz | tar -xzvf- --strip-components=1 COPY openapi-k8s-toolkit/patches /patches @@ -22,7 +22,7 @@ FROM node:${NODE_VERSION}-alpine AS builder #RUN apk add git WORKDIR /src -ARG COMMIT_REF=0c3629b2ce8545e81f7ece4d65372a188c802dfc +ARG COMMIT_REF=3cfbbf2156b6a5e4a1f283a032019530c0c2d37d RUN wget -O- https://github.com/PRO-Robotech/openapi-ui/archive/${COMMIT_REF}.tar.gz | tar xzf - --strip-components=1 #COPY openapi-ui/patches /patches diff --git a/packages/system/dashboard/templates/nginx-config.yaml b/packages/system/dashboard/templates/nginx-config.yaml index 04c55723..c2d6f624 100644 --- a/packages/system/dashboard/templates/nginx-config.yaml +++ b/packages/system/dashboard/templates/nginx-config.yaml @@ -34,6 +34,14 @@ data: } location /k8s { + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $host; + proxy_read_timeout 86400s; + proxy_send_timeout 86400s; + rewrite /k8s/(.*) /$1 break; proxy_pass https://kubernetes.default.svc:443; } diff --git a/packages/system/dashboard/values.yaml b/packages/system/dashboard/values.yaml index 71501fe0..e177cc7a 100644 --- a/packages/system/dashboard/values.yaml +++ b/packages/system/dashboard/values.yaml @@ -1,5 +1,5 @@ openapiUI: - image: ghcr.io/cozystack/cozystack/openapi-ui:latest@sha256:77991f2482c0026d082582b22a8ffb191f3ba6fc948b2f125ef9b1081538f865 + image: ghcr.io/cozystack/cozystack/openapi-ui:latest@sha256:931f95b93bf7188b9a52f9d4b2a71979f3570340c860223efbc781339d792d34 openapiUIK8sBff: image: ghcr.io/cozystack/cozystack/openapi-ui-k8s-bff:latest@sha256:8386f0747266726afb2b30db662092d66b0af0370e3becd8bee9684125fa9cc9 tokenProxy: