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 ec06eb6a68 fix: guard ingress upstream protocol index (#6864) (#6966)
ec06eb6a68 is described below
commit ec06eb6a686c62e3184af46ebb290a0e2ebf84dd
Author: Southern <[email protected]>
AuthorDate: Mon Oct 12 09:12:24 2026 +0800
fix: guard ingress upstream protocol index (#6864) (#6966)
---
.../shenyu/k8s/DivideIngressReconcilerTest.java | 25 ++++++++++++++++++++
.../org/apache/shenyu/k8s/DubboReconcilerTest.java | 27 ++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
index c5e8430ed3..185ad79436 100644
---
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
+++
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DivideIngressReconcilerTest.java
@@ -34,6 +34,7 @@ import io.kubernetes.client.openapi.models.V1EndpointsBuilder;
import io.kubernetes.client.openapi.models.V1EndpointSubsetBuilder;
import io.kubernetes.client.openapi.models.V1EndpointAddress;
import org.apache.shenyu.common.config.ssl.ShenyuSniAsyncMapping;
+import org.apache.shenyu.common.dto.SelectorData;
import org.apache.shenyu.common.enums.PluginEnum;
import org.apache.shenyu.k8s.cache.IngressCache;
import org.apache.shenyu.k8s.cache.IngressSelectorCache;
@@ -44,6 +45,7 @@ import org.apache.shenyu.k8s.repository.ShenyuCacheRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
import java.util.Collections;
import java.util.HashMap;
@@ -77,6 +79,11 @@ public final class DivideIngressReconcilerTest {
@BeforeEach
public void init() {
+ // These caches are process-wide singletons; isolate each test case.
+ IngressCache.getInstance().remove("mockedNamespace", "mockedIngress");
+ IngressSelectorCache.getInstance().remove("mockedNamespace",
"mockedIngress", PluginEnum.DIVIDE.getName());
+ ServiceIngressCache.getInstance().removeSpecifiedIngressName(
+ "mockedNamespace", "testService", "mockedNamespace",
"mockedIngress");
ingressInformer = mock(SharedIndexInformer.class);
secretInformer = mock(SharedIndexInformer.class);
shenyuCacheRepository = mock(ShenyuCacheRepository.class);
@@ -127,6 +134,24 @@ public final class DivideIngressReconcilerTest {
verify(shenyuCacheRepository).saveOrUpdateRuleData(any());
}
+ /**
+ * test reconcile with fewer protocols than endpoints.
+ */
+ @Test
+ public void testReconcileWithFewerProtocolsThanEndpoints() {
+ V1Ingress ingress =
ingressInformer.getIndexer().getByKey("mockedNamespace/mockedIngress");
+ Map<String, String> annotations =
ingress.getMetadata().getAnnotations();
+ annotations.put("shenyu.apache.org/upstreams-protocol", "https://");
+ V1Endpoints endpoints =
endpointsInformer.getIndexer().getByKey("mockedNamespace/testService");
+ endpoints.getSubsets().get(0).setAddresses(java.util.Arrays.asList(
+ new V1EndpointAddress().ip("127.0.0.1"), new
V1EndpointAddress().ip("127.0.0.2")));
+ ingressReconciler.reconcile(new Request("mockedNamespace",
"mockedIngress"));
+ ArgumentCaptor<SelectorData> selectorCaptor =
ArgumentCaptor.forClass(SelectorData.class);
+
verify(shenyuCacheRepository).saveOrUpdateSelectorData(selectorCaptor.capture());
+
Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("https://"));
+
Assertions.assertTrue(selectorCaptor.getValue().getHandle().contains("http://"));
+ }
+
/**
* Test reconcile after ingress deletion.
*/
diff --git
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java
index 50220f60ab..e9231ea755 100644
---
a/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java
+++
b/shenyu-kubernetes-controller/src/test/java/org/apache/shenyu/k8s/DubboReconcilerTest.java
@@ -35,6 +35,9 @@ import io.kubernetes.client.openapi.models.V1Secret;
import io.kubernetes.client.openapi.models.V1Service;
import io.kubernetes.client.openapi.models.V1ServiceBuilder;
import org.apache.shenyu.common.config.ssl.ShenyuSniAsyncMapping;
+import org.apache.shenyu.common.dto.SelectorData;
+import org.apache.shenyu.common.dto.convert.selector.DubboUpstream;
+import org.apache.shenyu.common.utils.GsonUtils;
import org.apache.shenyu.k8s.cache.IngressCache;
import org.apache.shenyu.k8s.parser.IngressParser;
import org.apache.shenyu.k8s.reconciler.IngressReconciler;
@@ -42,8 +45,10 @@ import
org.apache.shenyu.k8s.repository.ShenyuCacheRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import static org.mockito.Mockito.any;
@@ -230,4 +235,26 @@ public final class DubboReconcilerTest {
IngressParser ingressParser = new IngressParser(serviceInformer,
endpointsInformer);
Assertions.assertEquals(1, ingressParser.parse(ingress,
mock(io.kubernetes.client.openapi.apis.CoreV1Api.class)).size());
}
+
+ /**
+ * test reconcile with fewer protocols than endpoints.
+ */
+ @Test
+ public void testReconcileWithFewerProtocolsThanEndpoints() {
+ V1Ingress ingress = ingressInformer.getIndexer().getByKey(NAMESPACE +
"/" + INGRESS_NAME);
+ Map<String, String> annotations =
ingress.getMetadata().getAnnotations();
+ annotations.put("shenyu.apache.org/upstreams-protocol",
"dubbo+ssl://");
+ V1Endpoints endpoints =
endpointsInformer.getIndexer().getByKey(NAMESPACE + "/" + SERVICE_NAME);
+ endpoints.getSubsets().get(0).setAddresses(java.util.Arrays.asList(
+ new V1EndpointAddress().ip("127.0.0.1"), new
V1EndpointAddress().ip("127.0.0.2")));
+ ingressReconciler.reconcile(new Request(NAMESPACE, INGRESS_NAME));
+ ArgumentCaptor<SelectorData> selectorCaptor =
ArgumentCaptor.forClass(SelectorData.class);
+
verify(shenyuCacheRepository).saveOrUpdateSelectorData(selectorCaptor.capture());
+ List<DubboUpstream> upstreams =
GsonUtils.getInstance().fromList(selectorCaptor.getValue().getHandle(),
DubboUpstream.class);
+ Assertions.assertEquals(2, upstreams.size());
+ Assertions.assertEquals("127.0.0.1:20888",
upstreams.get(0).getUpstreamUrl());
+ Assertions.assertEquals("dubbo+ssl://",
upstreams.get(0).getProtocol());
+ Assertions.assertEquals("127.0.0.2:20888",
upstreams.get(1).getUpstreamUrl());
+ Assertions.assertEquals("dubbo://", upstreams.get(1).getProtocol());
+ }
}