From d7cc2d3f199c2777a4e74d7123e1c5f7e33a0acf Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:55:33 -0700 Subject: [PATCH] Tweakhancement: use routeNamespace as fallback for k8s gateway integration (#7009) --- src/utils/kubernetes/resource-helpers.js | 7 +++-- src/utils/kubernetes/resource-helpers.test.js | 30 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/utils/kubernetes/resource-helpers.js b/src/utils/kubernetes/resource-helpers.js index d039a1ee8..71a5c6048 100644 --- a/src/utils/kubernetes/resource-helpers.js +++ b/src/utils/kubernetes/resource-helpers.js @@ -14,13 +14,14 @@ import createLogger from "utils/logger"; const logger = createLogger("resource-helpers"); const kc = getKubeConfig(); -const getSchemaFromGateway = async (parentRef) => { +const getSchemaFromGateway = async (parentRef, routeNamespace) => { const crd = kc.makeApiClient(CustomObjectsApi); const schema = await crd .getNamespacedCustomObject({ group: HTTPROUTE_API_GROUP, version: HTTPROUTE_API_VERSION, - namespace: parentRef.namespace, + // parentRef namespace is optional, defaults to the route's namespace + namespace: parentRef.namespace ?? routeNamespace, plural: "gateways", name: parentRef.name, }) @@ -48,7 +49,7 @@ async function getUrlFromHttpRoute(resource) { if (resource.spec.rules[0].matches[0].path.type !== "RegularExpression") { const urlHost = resource.spec.hostnames[0]; const urlPath = resource.spec.rules[0].matches[0].path.value; - const urlSchema = await getSchemaFromGateway(resource.spec.parentRefs[0]); + const urlSchema = await getSchemaFromGateway(resource.spec.parentRefs[0], resource.metadata.namespace); url = `${urlSchema}://${urlHost}${urlPath}`; } } diff --git a/src/utils/kubernetes/resource-helpers.test.js b/src/utils/kubernetes/resource-helpers.test.js index 5b7429d4d..9f25435f4 100644 --- a/src/utils/kubernetes/resource-helpers.test.js +++ b/src/utils/kubernetes/resource-helpers.test.js @@ -137,6 +137,36 @@ describe("utils/kubernetes/resource-helpers", () => { expect(service.href).toBe("https://example.com/r"); }); + it("falls back to the route namespace when the parentRef omits one", async () => { + const kc = getKubeConfig(); + const crd = kc.makeApiClient(); + + const base = "gethomepage.dev"; + const resource = { + kind: "HTTPRoute", + metadata: { + name: "route", + namespace: "ns", + annotations: { + [`${base}/enabled`]: "true", + }, + }, + spec: { + hostnames: ["example.com"], + parentRefs: [{ name: "gw", sectionName: "web" }], + rules: [ + { + matches: [{ path: { type: "PathPrefix", value: "/r" } }], + }, + ], + }, + }; + + const service = await constructedServiceFromResource(resource); + expect(crd.getNamespacedCustomObject).toHaveBeenCalledWith(expect.objectContaining({ namespace: "ns" })); + expect(service.href).toBe("https://example.com/r"); + }); + it("falls back to http when the gateway listener protocol cannot be resolved", async () => { const kc = getKubeConfig(); const crd = kc.makeApiClient();