-
Notifications
You must be signed in to change notification settings - Fork 0
/
handler.go
103 lines (90 loc) · 3.31 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package webhook
import (
"context"
"fmt"
"net/http"
kwhhttp "github.com/slok/kubewebhook/v2/pkg/http"
kwhlog "github.com/slok/kubewebhook/v2/pkg/log"
kwhmodel "github.com/slok/kubewebhook/v2/pkg/model"
kwhwebhook "github.com/slok/kubewebhook/v2/pkg/webhook"
kwhmutating "github.com/slok/kubewebhook/v2/pkg/webhook/mutating"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/bitte-ein-bit/k8s-sizing-webhook/internal/log"
)
// kubewebhookLogger is a small proxy to use our logger with Kubewebhook.
type kubewebhookLogger struct {
log.Logger
}
func (l kubewebhookLogger) WithValues(kv map[string]interface{}) kwhlog.Logger {
return kubewebhookLogger{Logger: l.Logger.WithKV(kv)}
}
func (l kubewebhookLogger) WithCtxValues(ctx context.Context) kwhlog.Logger {
return l.WithValues(kwhlog.ValuesFromCtx(ctx))
}
func (l kubewebhookLogger) SetValuesOnCtx(parent context.Context, values map[string]interface{}) context.Context {
return kwhlog.CtxWithValues(parent, values)
}
// allmark sets up the webhook handler for marking all kubernetes resources using Kubewebhook library.
func (h handler) allMark() (http.Handler, error) {
mt := kwhmutating.MutatorFunc(func(ctx context.Context, ar *kwhmodel.AdmissionReview, obj metav1.Object) (*kwhmutating.MutatorResult, error) {
err := h.marker.Mark(ctx, obj)
if err != nil {
return nil, fmt.Errorf("could not mark the resource: %w", err)
}
return &kwhmutating.MutatorResult{
MutatedObject: obj,
Warnings: []string{"Resource marked with custom labels"},
}, nil
})
logger := kubewebhookLogger{Logger: h.logger.WithKV(log.KV{"lib": "kubewebhook", "webhook": "allMark"})}
wh, err := kwhmutating.NewWebhook(kwhmutating.WebhookConfig{
ID: "allMark",
Logger: logger,
Mutator: mt,
})
if err != nil {
return nil, fmt.Errorf("could not create webhook: %w", err)
}
whHandler, err := kwhhttp.HandlerFor(kwhhttp.HandlerConfig{
Webhook: kwhwebhook.NewMeasuredWebhook(h.metrics, wh),
Logger: logger,
})
if err != nil {
return nil, fmt.Errorf("could not create handler from webhook: %w", err)
}
return whHandler, nil
}
// memFix sets up the webhook handler for marking all kubernetes resources using Kubewebhook library.
func (h handler) memFix() (http.Handler, error) {
mt := kwhmutating.MutatorFunc(func(ctx context.Context, ar *kwhmodel.AdmissionReview, obj metav1.Object) (*kwhmutating.MutatorResult, error) {
changed, err := h.memoryFixer.FixMemRequest(ctx, obj)
if err != nil {
return nil, fmt.Errorf("could not fix the resources memory request and limits: %w", err)
}
var warnings []string
if changed {
warnings = []string{"webhook changed memory resources to be guaranteed"}
}
return &kwhmutating.MutatorResult{
MutatedObject: obj,
Warnings: warnings,
}, nil
})
logger := kubewebhookLogger{Logger: h.logger.WithKV(log.KV{"lib": "kubewebhook", "webhook": "memFix"})}
wh, err := kwhmutating.NewWebhook(kwhmutating.WebhookConfig{
ID: "memFix",
Logger: logger,
Mutator: mt,
})
if err != nil {
return nil, fmt.Errorf("could not create webhook: %w", err)
}
whHandler, err := kwhhttp.HandlerFor(kwhhttp.HandlerConfig{
Webhook: kwhwebhook.NewMeasuredWebhook(h.metrics, wh),
Logger: logger,
})
if err != nil {
return nil, fmt.Errorf("could not create handler from webhook: %w", err)
}
return whHandler, nil
}