Skip to content

Commit 7fb8534

Browse files
authored
Merge pull request #1765 from AnyISalIn/master
🐛 skip mutation handler when received deletion verb
2 parents fde61ba + 1ead647 commit 7fb8534

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-0
lines changed

pkg/webhook/admission/defaulter.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import (
2121
"encoding/json"
2222
"net/http"
2323

24+
admissionv1 "k8s.io/api/admission/v1"
25+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426
"k8s.io/apimachinery/pkg/runtime"
2527
)
2628

@@ -56,6 +58,17 @@ func (h *mutatingHandler) Handle(ctx context.Context, req Request) Response {
5658
panic("defaulter should never be nil")
5759
}
5860

61+
// always skip when a DELETE operation received in mutation handler
62+
// describe in https://github.com/kubernetes-sigs/controller-runtime/issues/1762
63+
if req.Operation == admissionv1.Delete {
64+
return Response{AdmissionResponse: admissionv1.AdmissionResponse{
65+
Allowed: true,
66+
Result: &metav1.Status{
67+
Code: http.StatusOK,
68+
},
69+
}}
70+
}
71+
5972
// Get the object in the request
6073
obj := h.defaulter.DeepCopyObject().(Defaulter)
6174
if err := h.decoder.Decode(req, obj); err != nil {
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package admission
2+
3+
import (
4+
"context"
5+
"net/http"
6+
7+
. "github.com/onsi/ginkgo"
8+
. "github.com/onsi/gomega"
9+
10+
admissionv1 "k8s.io/api/admission/v1"
11+
"k8s.io/apimachinery/pkg/runtime"
12+
"k8s.io/apimachinery/pkg/runtime/schema"
13+
)
14+
15+
var _ = Describe("Defaulter Handler", func() {
16+
17+
It("should return ok if received delete verb in defaulter handler", func() {
18+
obj := &TestDefaulter{}
19+
handler := DefaultingWebhookFor(obj)
20+
21+
resp := handler.Handle(context.TODO(), Request{
22+
AdmissionRequest: admissionv1.AdmissionRequest{
23+
Operation: admissionv1.Delete,
24+
OldObject: runtime.RawExtension{
25+
Raw: []byte("{}"),
26+
},
27+
},
28+
})
29+
Expect(resp.Allowed).Should(BeTrue())
30+
Expect(resp.Result.Code).Should(Equal(int32(http.StatusOK)))
31+
})
32+
33+
})
34+
35+
// TestDefaulter.
36+
var _ runtime.Object = &TestDefaulter{}
37+
38+
type TestDefaulter struct {
39+
Replica int `json:"replica,omitempty"`
40+
}
41+
42+
var testDefaulterGVK = schema.GroupVersionKind{Group: "foo.test.org", Version: "v1", Kind: "TestDefaulter"}
43+
44+
func (d *TestDefaulter) GetObjectKind() schema.ObjectKind { return d }
45+
func (d *TestDefaulter) DeepCopyObject() runtime.Object {
46+
return &TestDefaulter{
47+
Replica: d.Replica,
48+
}
49+
}
50+
51+
func (d *TestDefaulter) GroupVersionKind() schema.GroupVersionKind {
52+
return testDefaulterGVK
53+
}
54+
55+
func (d *TestDefaulter) SetGroupVersionKind(gvk schema.GroupVersionKind) {}
56+
57+
var _ runtime.Object = &TestDefaulterList{}
58+
59+
type TestDefaulterList struct{}
60+
61+
func (*TestDefaulterList) GetObjectKind() schema.ObjectKind { return nil }
62+
func (*TestDefaulterList) DeepCopyObject() runtime.Object { return nil }
63+
64+
func (d *TestDefaulter) Default() {
65+
if d.Replica < 2 {
66+
d.Replica = 2
67+
}
68+
}

0 commit comments

Comments
 (0)