This is an automated email from the ASF dual-hosted git repository.

zhangjintao pushed a commit to branch v1.5.0
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/v1.5.0 by this push:
     new d43fda7f feat: support update and delete of HTTPRoute (#1315) (#1329)
d43fda7f is described below

commit d43fda7f73d597e73ab59ccc4f728377e150ef9c
Author: Xin Rong <[email protected]>
AuthorDate: Tue Sep 13 17:02:39 2022 +0800

    feat: support update and delete of HTTPRoute (#1315) (#1329)
---
 pkg/ingress/gateway/gateway_httproute.go    | 55 ++++++++++++++++-
 test/e2e/scaffold/k8s.go                    |  8 ++-
 test/e2e/suite-gateway/gateway_httproute.go | 92 ++++++++++++++++++++++++++++-
 3 files changed, 148 insertions(+), 7 deletions(-)

diff --git a/pkg/ingress/gateway/gateway_httproute.go 
b/pkg/ingress/gateway/gateway_httproute.go
index 3fb60ba5..3d0c2f6e 100644
--- a/pkg/ingress/gateway/gateway_httproute.go
+++ b/pkg/ingress/gateway/gateway_httproute.go
@@ -211,14 +211,63 @@ func (c *gatewayHTTPRouteController) onAdd(obj 
interface{}) {
                return
        }
        log.Debugw("gateway HTTPRoute add event arrived",
+               zap.String("key", key),
                zap.Any("object", obj),
        )
 
-       log.Debugw("add HTTPRoute", zap.String("key", key))
        c.workqueue.Add(&types.Event{
                Type:   types.EventAdd,
                Object: key,
        })
 }
-func (c *gatewayHTTPRouteController) onUpdate(oldObj, newObj interface{}) {}
-func (c *gatewayHTTPRouteController) OnDelete(obj interface{})            {}
+
+func (c *gatewayHTTPRouteController) onUpdate(oldObj, newObj interface{}) {
+       oldHTTPRoute := oldObj.(*gatewayv1alpha2.HTTPRoute)
+       newHTTPRoute := newObj.(*gatewayv1alpha2.HTTPRoute)
+       if oldHTTPRoute.ResourceVersion >= newHTTPRoute.ResourceVersion {
+               return
+       }
+       key, err := cache.MetaNamespaceKeyFunc(oldObj)
+       if err != nil {
+               log.Errorw("found gateway HTTPRoute resource with bad meta 
namespace key",
+                       zap.Error(err),
+               )
+               return
+       }
+       if !c.controller.NamespaceProvider.IsWatchingNamespace(key) {
+               return
+       }
+       log.Debugw("Gateway HTTPRoute update event arrived",
+               zap.String("key", key),
+               zap.Any("old object", oldObj),
+               zap.Any("new object", newObj),
+       )
+
+       c.workqueue.Add(&types.Event{
+               Type:   types.EventUpdate,
+               Object: key,
+       })
+}
+
+func (c *gatewayHTTPRouteController) OnDelete(obj interface{}) {
+       key, err := cache.MetaNamespaceKeyFunc(obj)
+       if err != nil {
+               log.Errorw("found Gateway HTTPRoute resource with bad meta 
namespace key",
+                       zap.Error(err),
+               )
+               return
+       }
+       if !c.controller.NamespaceProvider.IsWatchingNamespace(key) {
+               return
+       }
+       log.Debugw("Gateway HTTPRoute delete event arrived",
+               zap.String("key", key),
+               zap.Any("object", obj),
+       )
+
+       c.workqueue.Add(&types.Event{
+               Type:      types.EventDelete,
+               Object:    key,
+               Tombstone: obj,
+       })
+}
diff --git a/test/e2e/scaffold/k8s.go b/test/e2e/scaffold/k8s.go
index 23f16b76..947ad8de 100644
--- a/test/e2e/scaffold/k8s.go
+++ b/test/e2e/scaffold/k8s.go
@@ -121,9 +121,11 @@ func (s *Scaffold) CreateApisixRoute(name string, rules 
[]ApisixRouteRule) {
 
 // CreateResourceFromString creates resource from a loaded yaml string.
 func (s *Scaffold) CreateResourceFromString(yaml string) error {
-       err := k8s.KubectlApplyFromStringE(s.t, s.kubectlOptions, yaml)
-       time.Sleep(5 * time.Second)
-       return err
+       return k8s.KubectlApplyFromStringE(s.t, s.kubectlOptions, yaml)
+}
+
+func (s *Scaffold) DeleteResourceFromString(yaml string) error {
+       return k8s.KubectlDeleteFromStringE(s.t, s.kubectlOptions, yaml)
 }
 
 func (s *Scaffold) GetOutputFromString(shell ...string) (string, error) {
diff --git a/test/e2e/suite-gateway/gateway_httproute.go 
b/test/e2e/suite-gateway/gateway_httproute.go
index 9a1f1893..f69cf16c 100644
--- a/test/e2e/suite-gateway/gateway_httproute.go
+++ b/test/e2e/suite-gateway/gateway_httproute.go
@@ -107,7 +107,6 @@ spec:
 
        ginkgo.It("Basic HTTPRoute with 1 Hosts 1 Rule 2 Match 1 BackendRef", 
func() {
                backendSvc, backendPorts := s.DefaultHTTPBackend()
-               time.Sleep(time.Second * 15)
                route := fmt.Sprintf(`
 apiVersion: gateway.networking.k8s.io/v1alpha2
 kind: HTTPRoute
@@ -146,4 +145,95 @@ spec:
                        Expect().
                        Status(http.StatusNotFound)
        })
+
+       ginkgo.It("Update HTTPRoute", func() {
+               backendSvc, backendPorts := s.DefaultHTTPBackend()
+               route := fmt.Sprintf(`
+apiVersion: gateway.networking.k8s.io/v1alpha2
+kind: HTTPRoute
+metadata:
+  name: basic-http-route
+spec:
+  hostnames: ["httpbin.org"]
+  rules:
+  - matches:
+    - path:
+        type: PathPrefix
+        value: /ip
+    backendRefs:
+    - name: %s
+      port: %d
+`, backendSvc, backendPorts[0])
+               assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(route), 
"creating HTTPRoute")
+               time.Sleep(time.Second * 6)
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumApisixRoutesCreated(1), 
"Checking number of routes")
+               assert.Nil(ginkgo.GinkgoT(), 
s.EnsureNumApisixUpstreamsCreated(1), "Checking number of upstreams")
+
+               route = fmt.Sprintf(`
+apiVersion: gateway.networking.k8s.io/v1alpha2
+kind: HTTPRoute
+metadata:
+  name: basic-http-route
+spec:
+  hostnames: ["httpbin.org"]
+  rules:
+  - matches:
+    - path:
+        type: PathPrefix
+        value: /get
+    backendRefs:
+    - name: %s
+      port: %d
+`, backendSvc, backendPorts[0])
+               assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(route), 
"update HTTPRoute")
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumApisixRoutesCreated(1), 
"Checking number of routes")
+
+               time.Sleep(6 * time.Second)
+
+               _ = s.NewAPISIXClient().GET("/get").
+                       WithHeader("Host", "httpbin.org").
+                       Expect().
+                       Status(http.StatusOK)
+               _ = s.NewAPISIXClient().GET("/ip").
+                       WithHeader("Host", "httpbin.org").
+                       Expect().
+                       Status(http.StatusNotFound)
+       })
+
+       ginkgo.It("Delete HTTPRoute", func() {
+               backendSvc, backendPorts := s.DefaultHTTPBackend()
+               route := fmt.Sprintf(`
+apiVersion: gateway.networking.k8s.io/v1alpha2
+kind: HTTPRoute
+metadata:
+  name: basic-http-route
+spec:
+  hostnames: ["httpbin.org"]
+  rules:
+  - matches:
+    - path:
+        type: PathPrefix
+        value: /ip
+    backendRefs:
+    - name: %s
+      port: %d
+`, backendSvc, backendPorts[0])
+               assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(route), 
"creating HTTPRoute")
+               time.Sleep(time.Second * 6)
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumApisixRoutesCreated(1), 
"Checking number of routes")
+               assert.Nil(ginkgo.GinkgoT(), 
s.EnsureNumApisixUpstreamsCreated(1), "Checking number of upstreams")
+
+               _ = s.NewAPISIXClient().GET("/ip").
+                       WithHeader("Host", "httpbin.org").
+                       Expect().
+                       Status(http.StatusOK)
+
+               assert.Nil(ginkgo.GinkgoT(), s.DeleteResourceFromString(route), 
"delete HTTPRoute")
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumApisixRoutesCreated(0), 
"Checking number of routes")
+
+               _ = s.NewAPISIXClient().GET("/ip").
+                       WithHeader("Host", "httpbin.org").
+                       Expect().
+                       Status(http.StatusNotFound)
+       })
 })

Reply via email to