From 0e827a348e6f000f7d6dff14b072e06d69c91f34 Mon Sep 17 00:00:00 2001 From: Codex Date: Tue, 19 May 2026 05:46:15 +0000 Subject: [PATCH] fix(dev): route v1 code queue inside dev namespace --- .../backend-core/src/microservice-proxy.ts | 47 +++++++++++++++++++ .../k3s/dev/unidesk-dev-foundation.k8s.yaml | 42 ++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/components/backend-core/src/microservice-proxy.ts b/src/components/backend-core/src/microservice-proxy.ts index d8576c30..95087a13 100644 --- a/src/components/backend-core/src/microservice-proxy.ts +++ b/src/components/backend-core/src/microservice-proxy.ts @@ -410,6 +410,45 @@ function codeQueueK3sServiceIdForRequest(method: string, targetPath: string): st return "code-queue-write"; } +function devCodeQueueDirectBaseUrl(k3sServiceId: string): string | null { + if (config().identity.environment !== "dev") return null; + const enabled = String(process.env.CODE_QUEUE_DEV_DIRECT_PROXY ?? "1").toLowerCase(); + if (enabled === "0" || enabled === "false" || enabled === "no") return null; + const namespace = config().identity.namespace || process.env.UNIDESK_NAMESPACE || "unidesk-dev"; + if (k3sServiceId === "code-queue-scheduler") { + return (process.env.CODE_QUEUE_DEV_SCHEDULER_URL || `http://code-queue-scheduler-dev.${namespace}.svc.cluster.local:4222`).replace(/\/+$/u, ""); + } + if (k3sServiceId === "code-queue-read") { + return (process.env.CODE_QUEUE_DEV_READ_URL || `http://code-queue-read-dev.${namespace}.svc.cluster.local:4222`).replace(/\/+$/u, ""); + } + if (k3sServiceId === "code-queue-write") { + return (process.env.CODE_QUEUE_DEV_WRITE_URL || `http://code-queue-write-dev.${namespace}.svc.cluster.local:4222`).replace(/\/+$/u, ""); + } + return null; +} + +function devCodeQueueDirectService(service: MicroserviceConfig, method: string, targetPath: string): { service: MicroserviceConfig; k3sServiceId: string } | null { + const k3sServiceId = codeQueueK3sServiceIdForRequest(method, targetPath); + const nodeBaseUrl = devCodeQueueDirectBaseUrl(k3sServiceId); + if (nodeBaseUrl === null) return null; + return { + k3sServiceId, + service: { + ...service, + backend: { + ...service.backend, + nodeBaseUrl, + proxyMode: "dev-k3s-direct", + }, + deployment: { + ...service.deployment, + mode: "unidesk-direct", + k3sServiceId, + }, + }, + }; +} + function codeQueueMasterControlPath(method: string, targetPath: string): boolean { const normalizedMethod = method.toUpperCase(); if (targetPath === "/" || targetPath === "/health" || targetPath === "/live" || targetPath === "/logs") return true; @@ -1078,6 +1117,14 @@ async function fetchMicroserviceUpstreamResponse( bodyText: string, abortSignal?: AbortSignal, ): Promise { + if (service.id === "code-queue") { + const devDirect = devCodeQueueDirectService(service, method, targetPath); + if (devDirect !== null) { + const response = await directMicroserviceResponse(devDirect.service, method, targetPath, proxyOptions, requestHeaders, bodyText, abortSignal); + response.headers.set("x-unidesk-code-queue-target", devDirect.k3sServiceId); + return response; + } + } if (service.id === "code-queue" && codeQueueMasterControlPath(method, targetPath)) { const mgr = microserviceById("code-queue-mgr"); if (mgr !== null) { diff --git a/src/components/microservices/k3sctl-adapter/k3s/dev/unidesk-dev-foundation.k8s.yaml b/src/components/microservices/k3sctl-adapter/k3s/dev/unidesk-dev-foundation.k8s.yaml index eae87c3c..2c2f3e4d 100644 --- a/src/components/microservices/k3sctl-adapter/k3s/dev/unidesk-dev-foundation.k8s.yaml +++ b/src/components/microservices/k3sctl-adapter/k3s/dev/unidesk-dev-foundation.k8s.yaml @@ -93,7 +93,47 @@ data: HEARTBEAT_TIMEOUT_MS: "30000" TASK_PENDING_TIMEOUT_MS: "600000" DATABASE_POOL_MAX: "2" - MICROSERVICES_JSON: "[]" + MICROSERVICES_JSON: | + [ + { + "id": "code-queue", + "name": "Code Queue Dev", + "providerId": "D601-dev", + "description": "release/v1 dev Code Queue runs inside the unidesk-dev namespace; backend-core-dev proxies it directly to the scheduler/read/write Kubernetes services.", + "repository": { + "url": "https://github.com/pikasTech/unidesk", + "commitId": "6950832600047a3f0c5a847062904959cc79a3da", + "dockerfile": "src/components/microservices/code-queue/Dockerfile", + "composeFile": "src/components/microservices/k3sctl-adapter/k3s/dev/unidesk-dev-code-queue.k8s.yaml", + "composeService": "code-queue", + "containerName": "k3s:code-queue-dev" + }, + "backend": { + "nodeBaseUrl": "http://code-queue-scheduler-dev.unidesk-dev.svc.cluster.local:4222", + "nodeBindHost": "code-queue-scheduler-dev.unidesk-dev.svc.cluster.local", + "nodePort": 4222, + "proxyMode": "dev-k3s-direct", + "frontendOnly": true, + "public": false, + "allowedMethods": ["GET", "HEAD", "POST", "DELETE", "PUT", "PATCH"], + "allowedPathPrefixes": ["/health", "/live", "/logs", "/api/"], + "healthPath": "/health", + "timeoutMs": 30000 + }, + "deployment": { + "mode": "unidesk-direct" + }, + "development": { + "providerId": "D601-dev", + "sshPassthrough": true, + "worktreePath": "/home/ubuntu/unidesk-dev-code-queue-deploy" + }, + "frontend": { + "route": "/apps/code-queue", + "integrated": true + } + } + ] SESSION_TTL_SECONDS: "28800" CODE_QUEUE_MAIN_PROVIDER_ID: D601-dev CODE_QUEUE_EXECUTION_PROVIDER_IDS: D601-dev