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)
+
+ })
+})