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

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


The following commit(s) were added to refs/heads/master by this push:
     new a0a50fe6 fix: Ingress delete events can be handler after svc be 
deleted (#1576)
a0a50fe6 is described below

commit a0a50fe643fe42aa2d3c83408e0aa5b720238270
Author: fabriceli <[email protected]>
AuthorDate: Fri Feb 10 11:32:09 2023 +0800

    fix: Ingress delete events can be handler after svc be deleted (#1576)
    
    Co-authored-by: Fabriceli <[email protected]>
---
 pkg/providers/ingress/ingress.go                   |  7 +++-
 pkg/providers/ingress/translation/translator.go    | 16 ++++++++++
 .../suite-ingress-resource/ingress.go              | 37 ++++++++++++++++++++++
 3 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/pkg/providers/ingress/ingress.go b/pkg/providers/ingress/ingress.go
index 6f4bb382..e1de15ce 100644
--- a/pkg/providers/ingress/ingress.go
+++ b/pkg/providers/ingress/ingress.go
@@ -142,8 +142,13 @@ func (c *ingressController) sync(ctx context.Context, ev 
*types.Event) error {
                }
                ing = ev.Tombstone.(kube.Ingress)
        }
+       var tctx *translation.TranslateContext
+       if ev.Type == types.EventDelete {
+               tctx, err = c.translator.TranslateIngressDeleteEvent(ing)
+       } else {
+               tctx, err = c.translator.TranslateIngress(ing)
+       }
 
-       tctx, err := c.translator.TranslateIngress(ing)
        if err != nil {
                log.Errorw("failed to translate ingress",
                        zap.Error(err),
diff --git a/pkg/providers/ingress/translation/translator.go 
b/pkg/providers/ingress/translation/translator.go
index 4a6e05ff..a4307860 100644
--- a/pkg/providers/ingress/translation/translator.go
+++ b/pkg/providers/ingress/translation/translator.go
@@ -65,6 +65,9 @@ type IngressTranslator interface {
        TranslateOldIngress(kube.Ingress) (*translation.TranslateContext, error)
        // TranslateSSLV2 translate networkingv1.IngressTLS to APISIX SSL
        TranslateIngressTLS(namespace, ingName, secretName string, hosts 
[]string) (*apisixv1.Ssl, error)
+       // TranslateIngressDeleteEvent composes a couple of APISIX Routes and 
upstreams according
+       // to the given Ingress resource.
+       TranslateIngressDeleteEvent(ing kube.Ingress, args ...bool) 
(*translation.TranslateContext, error)
 }
 
 func NewIngressTranslator(opts *TranslatorOptions,
@@ -119,6 +122,19 @@ func (t *translator) TranslateIngress(ing kube.Ingress, 
args ...bool) (*translat
        }
 }
 
+func (t *translator) TranslateIngressDeleteEvent(ing kube.Ingress, args 
...bool) (*translation.TranslateContext, error) {
+       switch ing.GroupVersion() {
+       case kube.IngressV1:
+               return t.translateOldIngressV1(ing.V1())
+       case kube.IngressV1beta1:
+               return t.translateOldIngressV1beta1(ing.V1beta1())
+       case kube.IngressExtensionsV1beta1:
+               return 
t.translateOldIngressExtensionsv1beta1(ing.ExtensionsV1beta1())
+       default:
+               return nil, fmt.Errorf("translator: source group version not 
supported: %s", ing.GroupVersion())
+       }
+}
+
 const (
        _regexPriority = 100
 )
diff --git a/test/e2e/suite-ingress/suite-ingress-resource/ingress.go 
b/test/e2e/suite-ingress/suite-ingress-resource/ingress.go
index 1c6eda79..3f32f682 100644
--- a/test/e2e/suite-ingress/suite-ingress-resource/ingress.go
+++ b/test/e2e/suite-ingress/suite-ingress-resource/ingress.go
@@ -792,3 +792,40 @@ spec:
                _ = 
s.NewAPISIXClient().GET("/anything/aaa/ok").WithHeader("Host", 
"a.httpbin.org").Expect().Status(http.StatusNotFound)
        })
 })
+
+var _ = ginkgo.Describe("suite-ingress-resource: svc delete", func() {
+       s := scaffold.NewDefaultScaffold()
+       ginkgo.It("svc delete before ing delete", func() {
+               backendSvc, backendSvcPort := s.DefaultHTTPBackend()
+               ing := fmt.Sprintf(`
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: httpbin-route
+spec:
+  ingressClassName: apisix
+  rules:
+  - host: httpbin.com
+    http:
+      paths:
+      - path: /ip
+        pathType: Exact
+        backend:
+          service:
+            name: %s
+            port:
+              number: %d
+`, backendSvc, backendSvcPort[0])
+               assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(ing))
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumListUpstreamNodesNth(1, 
1))
+
+               // Now delete the backend httpbin service resource.
+               assert.Nil(ginkgo.GinkgoT(), s.DeleteHTTPBINService())
+               assert.Nil(ginkgo.GinkgoT(), s.EnsureNumListUpstreamNodesNth(1, 
0))
+               s.NewAPISIXClient().GET("/ip").WithHeader("Host", 
"httpbin.com").Expect().Status(http.StatusServiceUnavailable)
+
+               assert.Nil(ginkgo.GinkgoT(), s.DeleteResourceFromString(ing))
+               s.NewAPISIXClient().GET("/ip").WithHeader("Host", 
"httpbin.com").Expect().Status(http.StatusNotFound)
+
+       })
+})

Reply via email to