AlinsRan commented on code in PR #2500:
URL: 
https://github.com/apache/apisix-ingress-controller/pull/2500#discussion_r2244483459


##########
test/e2e/crds/v2/route.go:
##########
@@ -1041,4 +1043,263 @@ spec:
                        Expect(string(msg)).To(Equal(testMessage), "message 
content verification")
                })
        })
+
+       Context("Test ApisixRoute with External Services", func() {
+               const (
+                       externalServiceName = "ext-httpbin"
+                       upstreamName        = "httpbin-upstream"
+                       routeName           = "httpbin-route"
+               )
+
+               createExternalService := func(externalName string) {
+                       By(fmt.Sprintf("create ExternalName service: %s -> %s", 
externalServiceName, externalName))
+                       svcSpec := fmt.Sprintf(`
+apiVersion: v1
+kind: Service
+metadata:
+  name: %s
+spec:
+  type: ExternalName
+  externalName: %s
+`, externalServiceName, externalName)
+                       err := s.CreateResourceFromString(svcSpec)
+                       Expect(err).ShouldNot(HaveOccurred(), "creating 
ExternalName service")
+               }
+
+               createApisixUpstream := func(externalType 
apiv2.ApisixUpstreamExternalType, name string) {
+                       By(fmt.Sprintf("create ApisixUpstream: type=%s, 
name=%s", externalType, name))
+                       upstreamSpec := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2
+kind: ApisixUpstream
+metadata:
+  name: %s
+spec:
+  externalNodes:
+  - type: %s
+    name: %s
+`, upstreamName, externalType, name)
+                       var upstream apiv2.ApisixUpstream
+                       applier.MustApplyAPIv2(
+                               types.NamespacedName{Namespace: s.Namespace(), 
Name: upstreamName},
+                               &upstream,
+                               upstreamSpec,
+                       )
+               }
+
+               createApisixRoute := func() {
+                       By("create ApisixRoute referencing ApisixUpstream")
+                       routeSpec := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2
+kind: ApisixRoute
+metadata:
+  name: %s
+spec:
+  ingressClassName: apisix
+  http:
+  - name: rule1
+    match:
+      hosts:
+      - httpbin.org
+      paths:
+      - /ip
+    upstreams:
+    - name: %s
+`, routeName, upstreamName)
+                       var route apiv2.ApisixRoute
+                       applier.MustApplyAPIv2(
+                               types.NamespacedName{Namespace: s.Namespace(), 
Name: routeName},
+                               &route,
+                               routeSpec,
+                       )
+               }
+
+               createApisixRouteWithHostRewrite := func(host string) {
+                       By("create ApisixRoute with host rewrite")
+                       routeSpec := fmt.Sprintf(`
+apiVersion: apisix.apache.org/v2
+kind: ApisixRoute
+metadata:
+  name: %s
+spec:
+  ingressClassName: apisix
+  http:
+  - name: rule1
+    match:
+      hosts:
+      - httpbin.org
+      paths:
+      - /ip
+    upstreams:
+    - name: %s
+    plugins:
+    - name: proxy-rewrite
+      enable: true
+      config:
+        host: %s
+`, routeName, upstreamName, host)
+                       var route apiv2.ApisixRoute
+                       applier.MustApplyAPIv2(
+                               types.NamespacedName{Namespace: s.Namespace(), 
Name: routeName},
+                               &route,
+                               routeSpec,
+                       )
+               }
+
+               verifyAccess := func() {
+                       By("verify access to external service")
+                       request := func() int {
+                               return s.NewAPISIXClient().GET("/ip").
+                                       WithHost("httpbin.org").
+                                       Expect().Raw().StatusCode
+                       }
+                       Eventually(request).WithTimeout(30 * 
time.Second).ProbeEvery(2 * time.Second).
+                               Should(Equal(http.StatusOK))
+               }
+
+               It("access third-party service directly", func() {
+                       createApisixUpstream(apiv2.ExternalTypeDomain, 
"httpbin.org")
+                       createApisixRoute()
+                       verifyAccess()
+               })
+
+               It("access third-party service with host rewrite", func() {
+                       createApisixUpstream(apiv2.ExternalTypeDomain, 
"httpbin.org")
+                       createApisixRouteWithHostRewrite("httpbin.org")
+                       verifyAccess()
+               })
+
+               It("access external domain via ExternalName service", func() {
+                       createExternalService("httpbin.org")
+                       createApisixUpstream(apiv2.ExternalTypeService, 
externalServiceName)
+                       createApisixRoute()
+                       verifyAccess()
+               })
+
+               It("access in-cluster service via ExternalName", func() {
+                       By("create temporary httpbin service")
+
+                       By("get FQDN of temporary service")
+                       fqdn := fmt.Sprintf("%s.%s.svc.cluster.local", 
"httpbin-service-e2e-test", s.Namespace())
+
+                       By("setup external service and route")
+                       createExternalService(fqdn)
+                       createApisixUpstream(apiv2.ExternalTypeService, 
externalServiceName)
+                       createApisixRoute()
+                       verifyAccess()
+               })
+
+               Context("complex scenarios", func() {
+                       It("multiple external services in one upstream", func() 
{
+                               By("create ApisixUpstream with multiple 
external nodes")
+                               upstreamSpec := `
+apiVersion: apisix.apache.org/v2
+kind: ApisixUpstream
+metadata:
+  name: httpbin-upstream
+spec:
+  externalNodes:
+  - type: Domain
+    name: httpbin.org
+  - type: Domain
+    name: postman-echo.com

Review Comment:
   ref: 
https://github.com/apache/apisix-ingress-controller/blob/master/test/e2e/crds/v2/route.go#L493C3-L493C15
   
   Please refer to it and try to use local services instead of external 
services as they are always unstable.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@apisix.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to