-
Notifications
You must be signed in to change notification settings - Fork 44
/
datanetwork_create_update_handler.go
90 lines (73 loc) · 2.81 KB
/
datanetwork_create_update_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
/* SPDX-License-Identifier: Apache-2.0 */
/* Copyright(c) 2019 Wind River Systems, Inc. */
package validating
import (
"context"
"github.com/gophercloud/gophercloud/starlingx/inventory/v1/datanetworks"
"net/http"
starlingxv1 "github.com/wind-river/cloud-platform-deployment-manager/pkg/apis/starlingx/v1"
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission/types"
)
// Webhook response reasons
const AllowedReason string = "allowed to be admitted"
func init() {
webhookName := "validating-create-update-datanetwork"
if HandlerMap[webhookName] == nil {
HandlerMap[webhookName] = []admission.Handler{}
}
HandlerMap[webhookName] = append(HandlerMap[webhookName], &DataNetworkCreateUpdateHandler{})
}
// DataNetworkCreateUpdateHandler handles DataNetwork
type DataNetworkCreateUpdateHandler struct {
// To use the client, you need to do the following:
// - uncomment it
// - import sigs.k8s.io/controller-runtime/pkg/client
// - uncomment the InjectClient method at the bottom of this file.
// client client.client
// Decoder decodes objects
Decoder types.Decoder
}
func (h *DataNetworkCreateUpdateHandler) validateOptionalFields(obj *starlingxv1.DataNetwork) (bool, string, error) {
if obj.Spec.Type != datanetworks.TypeVxLAN {
if obj.Spec.VxLAN != nil {
return false, "VxLAN attributes are only allowed for VxLAN type data networks.", nil
}
}
return true, AllowedReason, nil
}
func (h *DataNetworkCreateUpdateHandler) validatingDataNetworkFn(ctx context.Context, obj *starlingxv1.DataNetwork) (bool, string, error) {
allowed, reason, err := h.validateOptionalFields(obj)
if !allowed || err != nil {
return allowed, reason, err
}
return allowed, reason, err
}
var _ admission.Handler = &DataNetworkCreateUpdateHandler{}
// Handle handles admission requests.
func (h *DataNetworkCreateUpdateHandler) Handle(ctx context.Context, req types.Request) types.Response {
obj := &starlingxv1.DataNetwork{}
err := h.Decoder.Decode(req, obj)
if err != nil {
return admission.ErrorResponse(http.StatusBadRequest, err)
}
allowed, reason, err := h.validatingDataNetworkFn(ctx, obj)
if err != nil {
return admission.ErrorResponse(http.StatusInternalServerError, err)
}
return admission.ValidationResponse(allowed, reason)
}
//var _ inject.client = &DataNetworkCreateUpdateHandler{}
//
//// InjectClient injects the client into the DataNetworkCreateUpdateHandler
//func (h *DataNetworkCreateUpdateHandler) InjectClient(c client.client) error {
// h.client = c
// return nil
//}
var _ inject.Decoder = &DataNetworkCreateUpdateHandler{}
// InjectDecoder injects the decoder into the DataNetworkCreateUpdateHandler
func (h *DataNetworkCreateUpdateHandler) InjectDecoder(d types.Decoder) error {
h.Decoder = d
return nil
}