/
webhook.go
75 lines (60 loc) · 1.62 KB
/
webhook.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
package webhook
import (
"fmt"
"net/http"
"github.com/bitte-ein-bit/k8s-sizing-webhook/internal/log"
"github.com/bitte-ein-bit/k8s-sizing-webhook/internal/mutation/mark"
"github.com/bitte-ein-bit/k8s-sizing-webhook/internal/mutation/mem"
)
// Config is the handler configuration.
type Config struct {
MetricsRecorder MetricsRecorder
Marker mark.Marker
MemoryFixer mem.Fixer
Logger log.Logger
}
func (c *Config) defaults() error {
if c.Marker == nil {
return fmt.Errorf("marker is required")
}
if c.MetricsRecorder == nil {
c.MetricsRecorder = dummyMetricsRecorder
}
if c.Logger == nil {
c.Logger = log.Dummy
}
return nil
}
type handler struct {
marker mark.Marker
memoryFixer mem.Fixer
handler http.Handler
metrics MetricsRecorder
logger log.Logger
}
// New returns a new webhook handler.
func New(config Config) (http.Handler, error) {
err := config.defaults()
if err != nil {
return nil, fmt.Errorf("handler configuration is not valid: %w", err)
}
mux := http.NewServeMux()
h := handler{
handler: mux,
marker: config.Marker,
memoryFixer: config.MemoryFixer,
metrics: config.MetricsRecorder,
logger: config.Logger.WithKV(log.KV{"service": "webhook-handler"}),
}
// Register all the routes with our router.
err = h.routes(mux)
if err != nil {
return nil, fmt.Errorf("could not register routes on handler: %w", err)
}
// Register root handler middlware.
h.handler = h.measuredHandler(h.handler) // Add metrics middleware.
return h, nil
}
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.handler.ServeHTTP(w, r)
}