Skip to content

Commit

Permalink
fix: Ingress delete events can be handler after svc be deleted (apach…
Browse files Browse the repository at this point in the history
…e#1576)

Co-authored-by: Fabriceli <li842162578@gmail.com>
  • Loading branch information
2 people authored and lingsamuel committed Mar 31, 2023
1 parent db20b67 commit 7d3c5b9
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
7 changes: 6 additions & 1 deletion pkg/providers/ingress/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
16 changes: 16 additions & 0 deletions pkg/providers/ingress/translation/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
)
Expand Down
37 changes: 37 additions & 0 deletions test/e2e/suite-ingress/suite-ingress-resource/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

})
})

0 comments on commit 7d3c5b9

Please sign in to comment.