generated from cloudoperators/repository-template
/
pluginpreset_webhook.go
114 lines (90 loc) · 4.67 KB
/
pluginpreset_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
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
104
105
106
107
108
109
110
111
112
113
114
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Greenhouse contributors
// SPDX-License-Identifier: Apache-2.0
package admission
import (
"context"
"fmt"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
greenhousev1alpha1 "github.com/cloudoperators/greenhouse/pkg/apis/greenhouse/v1alpha1"
)
// Webhook for the PluginPreset custom resource.
func SetupPluginPresetWebhookWithManager(mgr ctrl.Manager) error {
return setupWebhook(mgr,
&greenhousev1alpha1.PluginPreset{},
webhookFuncs{
defaultFunc: DefaultPluginPreset,
validateCreateFunc: ValidateCreatePluginPreset,
validateUpdateFunc: ValidateUpdatePluginPreset,
validateDeleteFunc: ValidateDeletePluginPreset,
},
)
}
//+kubebuilder:webhook:path=/mutate-greenhouse-sap-v1alpha1-pluginpreset,mutating=true,failurePolicy=fail,sideEffects=None,groups=greenhouse.sap,resources=pluginpresets,verbs=create;update,versions=v1alpha1,name=mpluginpreset.kb.io,admissionReviewVersions=v1
func DefaultPluginPreset(_ context.Context, _ client.Client, _ runtime.Object) error {
return nil
}
//+kubebuilder:webhook:path=/validate-greenhouse-sap-v1alpha1-pluginpreset,mutating=false,failurePolicy=fail,sideEffects=None,groups=greenhouse.sap,resources=pluginpresets,verbs=create;update,versions=v1alpha1,name=vpluginpreset.kb.io,admissionReviewVersions=v1
func ValidateCreatePluginPreset(ctx context.Context, c client.Client, o runtime.Object) (admission.Warnings, error) {
pluginPreset, ok := o.(*greenhousev1alpha1.PluginPreset)
if !ok {
return nil, nil
}
var allErrs field.ErrorList
// ensure PluginDefinition and ClusterSelector are set
if pluginPreset.Spec.Plugin.PluginDefinition == "" {
allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("plugin").Child("pluginDefinition"), pluginPreset.Spec.Plugin.PluginDefinition, "PluginDefinition must be set"))
}
if pluginPreset.Spec.ClusterSelector.Size() == 0 {
allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("clusterSelector"), pluginPreset.Spec.ClusterSelector, "ClusterSelector must be set"))
}
// ensure ClusterName is not set
if pluginPreset.Spec.Plugin.ClusterName != "" {
allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("plugin").Child("clusterName"), pluginPreset.Spec.Plugin.ClusterName, "ClusterName must not be set"))
}
// ensure PluginDefinition exists
pluginDefinition := new(greenhousev1alpha1.PluginDefinition)
err := c.Get(ctx, client.ObjectKey{Namespace: "", Name: pluginPreset.Spec.Plugin.PluginDefinition}, pluginDefinition)
switch {
case err != nil && apierrors.IsNotFound(err):
allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("plugin").Child("pluginDefinition"), pluginPreset.Spec.Plugin.PluginDefinition, fmt.Sprintf("PluginDefinition %s does not exist", pluginPreset.Spec.Plugin.PluginDefinition)))
case err != nil:
allErrs = append(allErrs, field.Invalid(field.NewPath("spec").Child("plugin").Child("pluginDefinition"), pluginPreset.Spec.Plugin.PluginDefinition, "PluginDefinition could not be retrieved: "+err.Error()))
}
// validate OptionValues defined by the Preset
if errList := validatePluginOptionValues(pluginPreset.Spec.Plugin.OptionValues, pluginDefinition); len(errList) > 0 {
allErrs = append(allErrs, errList...)
}
if len(allErrs) > 0 {
return nil, apierrors.NewInvalid(pluginPreset.GroupVersionKind().GroupKind(), pluginPreset.Name, allErrs)
}
return nil, nil
}
func ValidateUpdatePluginPreset(ctx context.Context, c client.Client, oldObj, curObj runtime.Object) (admission.Warnings, error) {
oldPluginPreset, ok := oldObj.(*greenhousev1alpha1.PluginPreset)
if !ok {
return nil, nil
}
pluginPreset, ok := curObj.(*greenhousev1alpha1.PluginPreset)
if !ok {
return nil, nil
}
var allErrs field.ErrorList
if err := validateImmutableField(oldPluginPreset.Spec.Plugin.PluginDefinition, pluginPreset.Spec.Plugin.PluginDefinition, field.NewPath("spec", "plugin", "pluginDefinition")); err != nil {
allErrs = append(allErrs, err)
}
if err := validateImmutableField(oldPluginPreset.Spec.Plugin.ClusterName, pluginPreset.Spec.Plugin.ClusterName, field.NewPath("spec", "plugin", "clusterName")); err != nil {
allErrs = append(allErrs, err)
}
if len(allErrs) > 0 {
return nil, apierrors.NewInvalid(pluginPreset.GroupVersionKind().GroupKind(), pluginPreset.Name, allErrs)
}
return nil, nil
}
func ValidateDeletePluginPreset(_ context.Context, _ client.Client, _ runtime.Object) (admission.Warnings, error) {
return nil, nil
}