This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new ed3191f799 fix: skip k8s services without annotations when parsing RPC
ingress labels (#6609) (#7485)
ed3191f799 is described below
commit ed3191f7990f05c94391764b5cc33527d714bc96
Author: wy471x <[email protected]>
AuthorDate: Thu Oct 8 14:18:10 2026 +0800
fix: skip k8s services without annotations when parsing RPC ingress labels
(#6609) (#7485)
The Dubbo, gRPC and Sofa ingress parsers iterate over ingress labels and
read the annotations of the referenced Service to build rule and metadata
entries. A Service that exists but carries no annotations makes
getAnnotations() return null, and the subsequent annotation lookups throw
NullPointerException during reconciliation.
Skip the label when the referenced Service has no annotations, matching the
existing skip-and-defer handling for missing Services, and cover the case in
RpcIngressParserNullSafetyTest for all three parsers.
---
.../org/apache/shenyu/k8s/parser/DubboIngressParser.java | 3 +++
.../java/org/apache/shenyu/k8s/parser/GrpcParser.java | 3 +++
.../java/org/apache/shenyu/k8s/parser/SofaParser.java | 3 +++
.../shenyu/k8s/parser/RpcIngressParserNullSafetyTest.java | 15 +++++++++++++++
4 files changed, 24 insertions(+)
diff --git
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/DubboIngressParser.java
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/DubboIngressParser.java
index 2dacf6de4b..7554451d88 100644
---
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/DubboIngressParser.java
+++
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/DubboIngressParser.java
@@ -247,6 +247,9 @@ public class DubboIngressParser implements
K8sResourceParser<V1Ingress> {
continue;
}
Map<String, String> metadataAnnotations =
service.getMetadata().getAnnotations();
+ if (Objects.isNull(metadataAnnotations)) {
+ continue;
+ }
DubboRuleHandle ruleHandle =
createDubboRuleHandle(annotations);
List<ConditionData> ruleConditionList =
getRuleConditionList(metadataAnnotations);
RuleData ruleData =
createRuleData(metadataAnnotations, ruleHandle, ruleConditionList);
diff --git
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/GrpcParser.java
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/GrpcParser.java
index 645b52af1c..a2e26947b3 100644
---
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/GrpcParser.java
+++
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/GrpcParser.java
@@ -269,6 +269,9 @@ public class GrpcParser implements
K8sResourceParser<V1Ingress> {
continue;
}
Map<String, String> metadataAnnotations =
service.getMetadata().getAnnotations();
+ if (Objects.isNull(metadataAnnotations)) {
+ continue;
+ }
List<ConditionData> ruleConditionList =
getRuleConditionList(metadataAnnotations);
RuleData ruleData =
createRuleData(metadataAnnotations, ruleConditionList, annotations);
MetaData metaData = parseMetaData(metadataAnnotations);
diff --git
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/SofaParser.java
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/SofaParser.java
index 03a448daf3..5cc6f2a3e6 100644
---
a/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/SofaParser.java
+++
b/shenyu-kubernetes-controller/src/main/java/org/apache/shenyu/k8s/parser/SofaParser.java
@@ -178,6 +178,9 @@ public class SofaParser implements
K8sResourceParser<V1Ingress> {
continue;
}
Map<String, String> metadataAnnotations =
service.getMetadata().getAnnotations();
+ if (Objects.isNull(metadataAnnotations)) {
+ continue;
+ }
SofaRuleHandle ruleHandle =
createSofaRuleHandle(annotations);
List<ConditionData> ruleConditionList =
getRuleConditionList(metadataAnnotations);
RuleData ruleData =
createRuleData(metadataAnnotations, ruleHandle, ruleConditionList);
diff --git
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/parser/RpcIngressParserNullSafetyTest.java
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/parser/RpcIngressParserNullSafetyTest.java
index e361c4656f..5207407b93 100644
---
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/parser/RpcIngressParserNullSafetyTest.java
+++
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/parser/RpcIngressParserNullSafetyTest.java
@@ -80,6 +80,21 @@ public final class RpcIngressParserNullSafetyTest {
}
}
+ @Test
+ public void shouldSkipServiceWithoutAnnotations() {
+ Lister<V1Service> serviceLister = createServiceLister(new
V1ServiceBuilder().withNewMetadata().withName(BACKEND_SERVICE)
+ .withNamespace(NAMESPACE).endMetadata().build());
+ List<K8sResourceParser<V1Ingress>> parsers =
createParsers(serviceLister);
+
+ for (K8sResourceParser<V1Ingress> parser : parsers) {
+ ShenyuMemoryConfig config = Assertions.assertDoesNotThrow(() ->
parser.parse(createIngress(Collections.singletonMap(
+ "service-label", BACKEND_SERVICE)), null));
+ Assertions.assertEquals(1, config.getRouteConfigList().size());
+
Assertions.assertTrue(config.getRouteConfigList().get(0).getRuleDataList().isEmpty());
+
Assertions.assertTrue(config.getRouteConfigList().get(0).getMetaDataList().isEmpty());
+ }
+ }
+
@Test
public void shouldIgnoreNullIngressLabels() {
Lister<V1Service> serviceLister = createServiceLister(null);