From 8b994257629eea462db9a12b9989c54fe671b341 Mon Sep 17 00:00:00 2001 From: CH3CHO Date: Mon, 8 Sep 2025 10:49:59 +0800 Subject: [PATCH 1/2] fix: Fix the incorrect logic dealing with Route.customLabels --- .../kubernetes/KubernetesModelConverter.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java index dad6f453..d243dcbe 100644 --- a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java +++ b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java @@ -117,6 +117,7 @@ public class KubernetesModelConverter { private static final Splitter FIELD_SPLITTER = Splitter.on(Pattern.compile(" +")).trimResults().omitEmptyStrings(); private static final V1IngressBackend DEFAULT_MCP_BRIDGE_BACKEND = new V1IngressBackend(); private static final Set SUPPORTED_ANNOTATIONS; + private static final Set BUILT_IN_LABELS; private static final Integer DEFAULT_WEIGHT = 100; private static final String SERVICE_FQDN_TEMPLATE = "%s.%s.svc.%s"; @@ -149,6 +150,25 @@ public class KubernetesModelConverter { } } SUPPORTED_ANNOTATIONS = Collections.unmodifiableSet(supportedAnnotations); + + Set builtInLabels = new HashSet<>(); + for (Field field : KubernetesConstants.Label.class.getFields()) { + if ((field.getModifiers() & (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL)) == 0) { + continue; + } + if (field.getType() != String.class) { + continue; + } + if (!field.getName().endsWith("_KEY")) { + continue; + } + try { + builtInLabels.add((String)field.get(null)); + } catch (IllegalAccessException e) { + log.error("Failed to get label key from field: {}", field.getName(), e); + } + } + BUILT_IN_LABELS = Collections.unmodifiableSet(builtInLabels); } public KubernetesModelConverter(KubernetesClientService kubernetesClientService) { @@ -1012,7 +1032,13 @@ private void fillCustomLabels(Route route, V1ObjectMeta metadata) { if (metadata == null || MapUtils.isEmpty(metadata.getLabels())) { return; } - route.setCustomLabels(metadata.getLabels()); + Map customLabels = new HashMap<>(); + for (Map.Entry label : metadata.getLabels().entrySet()) { + if (isCustomLabel(label.getKey())) { + customLabels.put(label.getKey(), label.getValue()); + } + } + route.setCustomLabels(customLabels); } private static void fillPathRoute(Route route, V1ObjectMeta metadata, V1HTTPIngressPath path) { @@ -2048,4 +2074,11 @@ private static boolean isCustomAnnotation(String key) { } return true; } + + private static boolean isCustomLabel(String key) { + if (key.startsWith(KubernetesConstants.Label.DOMAIN_KEY_PREFIX)) { + return false; + } + return !BUILT_IN_LABELS.contains(key); + } } From 4a2f7270b200e729dcb9318e76cd7e828defdb87 Mon Sep 17 00:00:00 2001 From: CH3CHO Date: Mon, 8 Sep 2025 11:02:01 +0800 Subject: [PATCH 2/2] fix test cases --- .../kubernetes/KubernetesModelConverter.java | 3 ++ .../service/mcp/McpServiceContextImpl.java | 1 + .../KubernetesModelConverterTest.java | 29 ++++++++++--------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java index d243dcbe..9fe6adba 100644 --- a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java +++ b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverter.java @@ -168,6 +168,9 @@ public class KubernetesModelConverter { log.error("Failed to get label key from field: {}", field.getName(), e); } } + // To be compatible with com.alibaba.higress.sdk.service.mcp.McpServiceContextImpl.isMcpServerRoute + // TODO: Remove after refactoring com.alibaba.higress.sdk.service.mcp.McpServiceContextImpl.isMcpServerRoute + builtInLabels.remove(KubernetesConstants.Label.RESOURCE_BIZ_TYPE_KEY); BUILT_IN_LABELS = Collections.unmodifiableSet(builtInLabels); } diff --git a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/mcp/McpServiceContextImpl.java b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/mcp/McpServiceContextImpl.java index 168d621e..0706b664 100644 --- a/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/mcp/McpServiceContextImpl.java +++ b/backend/sdk/src/main/java/com/alibaba/higress/sdk/service/mcp/McpServiceContextImpl.java @@ -216,6 +216,7 @@ private void filterMcpServers(List resultList, McpServerPageQuery que } } + // TODO: Use another way instead of customLabels to determine whether the route is bound to mcpServer private boolean isMcpServerRoute(Map customLabels) { if (MapUtils.isEmpty(customLabels)) { return false; diff --git a/backend/sdk/src/test/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverterTest.java b/backend/sdk/src/test/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverterTest.java index c5520b81..a8baddc5 100644 --- a/backend/sdk/src/test/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverterTest.java +++ b/backend/sdk/src/test/java/com/alibaba/higress/sdk/service/kubernetes/KubernetesModelConverterTest.java @@ -587,7 +587,7 @@ public void route2IngressTestPrefixPathSingleService() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -615,7 +615,7 @@ public void route2IngressTestPrefixPathSingleServiceWithWeight() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -643,7 +643,7 @@ public void route2IngressTestPrefixPathSingleServiceWithPort() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -671,7 +671,7 @@ public void route2IngressTestPrefixPathSingleServiceWithPortAndVersion() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -701,7 +701,7 @@ public void route2IngressTestPrefixPathMultipleServices() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -730,7 +730,7 @@ public void route2IngressTestExactPathSingleService() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -758,7 +758,7 @@ public void route2IngressTestRegularPathSingleService() { V1Ingress ingress = converter.route2Ingress(route); - V1Ingress expectedIngress = buildBasicSupportedIngress(); + V1Ingress expectedIngress = buildBasicSupportedIngress(false); V1ObjectMeta expectedMetadata = expectedIngress.getMetadata(); expectedMetadata.setName(route.getName()); @@ -1934,13 +1934,19 @@ public void domainName2ConfigMapNameTestWildcardDomainNameConfigMapNameCreated() } private V1Ingress buildBasicSupportedIngress() { + return buildBasicSupportedIngress(true); + } + + private V1Ingress buildBasicSupportedIngress(boolean setDefinerLabel) { V1Ingress ingress = new V1Ingress(); V1ObjectMeta metadata = new V1ObjectMeta(); metadata.setNamespace(DEFAULT_NAMESPACE); KubernetesUtil.setLabel(metadata, "higress.io/domain_higress-default-domain", "true"); - KubernetesUtil.setLabel(metadata, KubernetesConstants.Label.RESOURCE_DEFINER_KEY, - KubernetesConstants.Label.RESOURCE_DEFINER_VALUE); + if (setDefinerLabel) { + KubernetesUtil.setLabel(metadata, KubernetesConstants.Label.RESOURCE_DEFINER_KEY, + KubernetesConstants.Label.RESOURCE_DEFINER_VALUE); + } ingress.setMetadata(metadata); V1IngressSpec spec = new V1IngressSpec(); @@ -1981,10 +1987,7 @@ private static Route buildBasicRoute() { route.setPath(new RoutePredicate()); route.setCors(new CorsConfig()); route.setCustomConfigs(new HashMap<>()); - route.setCustomLabels( - MapUtil.of(KubernetesConstants.Label.RESOURCE_DEFINER_KEY, KubernetesConstants.Label.RESOURCE_DEFINER_VALUE, - KubernetesConstants.Label.DOMAIN_KEY_PREFIX + HigressConstants.DEFAULT_DOMAIN, - KubernetesConstants.Label.DOMAIN_VALUE_DUMMY)); + route.setCustomLabels(new HashMap<>()); route.setReadonly(false); return route; }