fix: accept lane agentrun manager dns

This commit is contained in:
lyon
2026-06-14 03:54:19 +08:00
parent bef836ab98
commit a10a62f518
4 changed files with 50 additions and 11 deletions
@@ -14,6 +14,7 @@ import {
const ADAPTER_ID = "agentrun-v01";
const DEFAULT_AGENTRUN_MGR_URL = "http://agentrun-mgr.agentrun-v01.svc.cluster.local:8080";
const AGENTRUN_MANAGER_HOST_PATTERN = /^agentrun-mgr\.[a-z0-9]([-a-z0-9]*[a-z0-9])?\.svc\.cluster\.local$/u;
const DEFAULT_TENANT_ID = "hwlab";
const DEFAULT_PROJECT_ID = "pikasTech/HWLAB";
const DEFAULT_REPO_URL = "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git";
@@ -152,7 +153,7 @@ export function describeAgentRunAdapterAvailability(env = process.env, options =
resourceBundleSourceCommit,
managerConfigured: Boolean(managerUrl),
repoConfigured: Boolean(repoUrl),
internalServiceDns: managerHost === "agentrun-mgr.agentrun-v01.svc.cluster.local",
internalServiceDns: isAgentRunManagerInternalServiceHost(managerHost),
ready,
valuesPrinted: false
},
@@ -1670,10 +1671,9 @@ function resolveAgentRunManagerUrl(env = process.env, override = null) {
const raw = firstNonEmpty(override, env.AGENTRUN_MGR_URL, env.HWLAB_CODE_AGENT_AGENTRUN_MGR_URL, DEFAULT_AGENTRUN_MGR_URL);
const url = new URL(raw);
const host = url.hostname.toLowerCase();
const allowedHost = "agentrun-mgr.agentrun-v01.svc.cluster.local";
const allowedByTest = truthyFlag(env.HWLAB_CODE_AGENT_AGENTRUN_ALLOW_NON_K3S_URL) && ["127.0.0.1", "localhost"].includes(host);
if (url.protocol !== "http:" || (host !== allowedHost && !allowedByTest)) {
throw Object.assign(new Error(`AGENTRUN_MGR_URL must use internal k3s Service DNS ${DEFAULT_AGENTRUN_MGR_URL}; got ${redactUrl(raw)}`), {
if (url.protocol !== "http:" || (!isAgentRunManagerInternalServiceHost(host) && !allowedByTest)) {
throw Object.assign(new Error(`AGENTRUN_MGR_URL must use internal k3s Service DNS agentrun-mgr.<namespace>.svc.cluster.local; got ${redactUrl(raw)}`), {
code: "agentrun_internal_url_required",
statusCode: 500
});
@@ -1684,6 +1684,10 @@ function resolveAgentRunManagerUrl(env = process.env, override = null) {
return url.toString().replace(/\/+$/u, "");
}
function isAgentRunManagerInternalServiceHost(host) {
return AGENTRUN_MANAGER_HOST_PATTERN.test(String(host ?? "").trim().toLowerCase());
}
function resolveAgentRunBackendProfile(env = process.env, params = {}) {
const requested = String(params.providerProfile ?? params.codeAgentProviderProfile ?? env.HWLAB_CODE_AGENT_AGENTRUN_BACKEND_PROFILE ?? env.HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE ?? "deepseek").trim().toLowerCase();
const fallback = String(env.HWLAB_CODE_AGENT_AGENTRUN_DEFAULT_BACKEND_PROFILE ?? "deepseek").trim().toLowerCase() || "deepseek";
@@ -139,6 +139,36 @@ test("provider profile set-key delegates through HWLAB without echoing API key",
}
});
test("provider profile management accepts lane-specific AgentRun manager namespace", async () => {
const calls: Array<{ method?: string; path?: string; host?: string }> = [];
const server = createCloudApiServer({
env: {
AGENTRUN_MGR_URL: "http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080",
HWLAB_ACCESS_CONTROL_REQUIRED: "1"
},
fetchImpl: async (url: string, init: any = {}) => {
const parsed = new URL(url);
calls.push({ method: init.method, path: parsed.pathname, host: parsed.hostname });
return new Response(JSON.stringify({ ok: true, data: { items: [], count: 0, valuesPrinted: false }, valuesPrinted: false }), { status: 200 });
},
accessController: fakeAccessController({ actor: adminActor })
});
await listen(server);
const { port } = server.address() as { port: number };
try {
const response = await fetch(`http://127.0.0.1:${port}/v1/admin/provider-profiles`, { headers: { cookie: "hwlab_session=admin" } });
const body = await response.json();
assert.equal(response.status, 200);
assert.equal(body.ok, true);
assert.equal(calls[0].method, "GET");
assert.equal(calls[0].host, "agentrun-mgr.agentrun-v02.svc.cluster.local");
assert.equal(calls[0].path, "/api/v1/provider-profiles");
} finally {
await close(server);
}
});
test("provider profile auth-json delegates through HWLAB without echoing auth json", async () => {
const calls: Array<{ method?: string; path?: string; body?: any }> = [];
const agentRunServer = await startAgentRunServer(calls);
@@ -2,7 +2,7 @@ import { randomUUID } from "node:crypto";
const CONTRACT_VERSION = "provider-profile-management-v1";
const DEFAULT_AGENTRUN_MGR_URL = "http://agentrun-mgr.agentrun-v01.svc.cluster.local:8080";
const DEFAULT_AGENTRUN_HOST = "agentrun-mgr.agentrun-v01.svc.cluster.local";
const AGENTRUN_MANAGER_HOST_PATTERN = /^agentrun-mgr\.[a-z0-9]([-a-z0-9]*[a-z0-9])?\.svc\.cluster\.local$/u;
const DEFAULT_TIMEOUT_MS = 30000;
const PROVIDER_PROFILE_ALIASES = Object.freeze({ codex: "codex-api" });
@@ -400,12 +400,16 @@ function resolveAgentRunManagerUrl(env) {
}
const allowLocal = truthy(env.HWLAB_PROVIDER_PROFILE_AGENTRUN_ALLOW_NON_K3S_URL) || truthy(env.HWLAB_CODE_AGENT_AGENTRUN_ALLOW_NON_K3S_URL);
const localAllowed = allowLocal && ["127.0.0.1", "localhost"].includes(parsed.hostname);
if (parsed.hostname !== DEFAULT_AGENTRUN_HOST && !localAllowed) {
throw routeError(503, "agentrun_manager_url_invalid", `AgentRun manager URL must use internal k3s Service DNS ${DEFAULT_AGENTRUN_MGR_URL}`, { managerUrl: redactUrl(raw) });
if (!isAgentRunManagerInternalServiceHost(parsed.hostname) && !localAllowed) {
throw routeError(503, "agentrun_manager_url_invalid", "AgentRun manager URL must use internal k3s Service DNS agentrun-mgr.<namespace>.svc.cluster.local", { managerUrl: redactUrl(raw) });
}
return raw.replace(/\/+$/u, "");
}
function isAgentRunManagerInternalServiceHost(host) {
return AGENTRUN_MANAGER_HOST_PATTERN.test(String(host ?? "").trim().toLowerCase());
}
async function readOptionalJsonObject(request, limitBytes) {
const body = await readBody(request, limitBytes);
if (!body.trim()) return {};
+5 -4
View File
@@ -788,8 +788,8 @@ test("cloud api health reports AgentRun adapter readiness without repo-owned cod
const server = createCloudApiServer({
env: {
HWLAB_CODE_AGENT_ADAPTER: "agentrun-v01",
AGENTRUN_MGR_URL: "http://agentrun-mgr.agentrun-v01.svc.cluster.local:8080",
HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE: "agentrun-v01",
AGENTRUN_MGR_URL: "http://agentrun-mgr.agentrun-v02.svc.cluster.local:8080",
HWLAB_CODE_AGENT_AGENTRUN_RUNNER_NAMESPACE: "agentrun-v02",
HWLAB_CODE_AGENT_AGENTRUN_PROVIDER_ID: "G14",
HWLAB_CODE_AGENT_AGENTRUN_SOURCE_COMMIT: "0123456789abcdef0123456789abcdef01234567",
HWLAB_CODE_AGENT_DEFAULT_PROVIDER_PROFILE: "deepseek",
@@ -833,8 +833,9 @@ test("cloud api health reports AgentRun adapter readiness without repo-owned cod
assert.equal(payload.codeAgent.status, "agentrun-ready");
assert.equal(payload.codeAgent.provider, "deepseek");
assert.equal(payload.codeAgent.backend, "agentrun-v01/deepseek");
assert.equal(payload.codeAgent.agentRun.managerHost, "agentrun-mgr.agentrun-v01.svc.cluster.local");
assert.equal(payload.codeAgent.agentRun.runnerNamespace, "agentrun-v01");
assert.equal(payload.codeAgent.agentRun.managerHost, "agentrun-mgr.agentrun-v02.svc.cluster.local");
assert.equal(payload.codeAgent.agentRun.runnerNamespace, "agentrun-v02");
assert.equal(payload.codeAgent.agentRun.internalServiceDns, true);
assert.equal(payload.codeAgent.runner.kind, "agentrun-v01-shared-runner");
assert.equal(payload.codeAgent.runner.delegatedToAgentRun, true);
assert.equal(payload.codeAgent.runner.codexStdio, false);