Skip to content

Commit 8d402eb

Browse files
committed
Refactor API webhooks
Signed-off-by: Tobias Giese <[email protected]>
1 parent 616df5b commit 8d402eb

File tree

3 files changed

+25
-30
lines changed

3 files changed

+25
-30
lines changed

api/v1alpha4/openstackcluster_webhook.go

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ limitations under the License.
1717
package v1alpha4
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122

22-
"github.com/pkg/errors"
2323
apierrors "k8s.io/apimachinery/pkg/api/errors"
2424
"k8s.io/apimachinery/pkg/runtime"
2525
"k8s.io/apimachinery/pkg/util/validation/field"
26+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2627
"sigs.k8s.io/controller-runtime/pkg/builder"
2728
logf "sigs.k8s.io/controller-runtime/pkg/log"
2829
"sigs.k8s.io/controller-runtime/pkg/manager"
@@ -65,40 +66,24 @@ func (r *OpenStackCluster) ValidateCreate() error {
6566
}
6667

6768
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
68-
func (r *OpenStackCluster) ValidateUpdate(old runtime.Object) error {
69+
func (r *OpenStackCluster) ValidateUpdate(oldRaw runtime.Object) error {
6970
var allErrs field.ErrorList
70-
71-
newOpenStackCluster, err := runtime.DefaultUnstructuredConverter.ToUnstructured(r)
72-
if err != nil {
73-
return apierrors.NewInvalid(GroupVersion.WithKind("OpenStackCluster").GroupKind(), r.Name, field.ErrorList{
74-
field.InternalError(nil, errors.Wrap(err, "failed to convert new OpenStackCluster to unstructured object")),
75-
})
76-
}
77-
oldOpenStackCluster, err := runtime.DefaultUnstructuredConverter.ToUnstructured(old)
78-
if err != nil {
79-
return apierrors.NewInvalid(GroupVersion.WithKind("OpenStackCluster").GroupKind(), r.Name, field.ErrorList{
80-
field.InternalError(nil, errors.Wrap(err, "failed to convert old OpenStackCluster to unstructured object")),
81-
})
71+
old, ok := oldRaw.(*OpenStackCluster)
72+
if !ok {
73+
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackCluster but got a %T", oldRaw))
8274
}
8375

8476
if r.Spec.IdentityRef != nil && r.Spec.IdentityRef.Kind != defaultIdentityRefKind {
8577
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "identityRef", "kind"), "must be a Secret"))
8678
}
8779

88-
newOpenStackClusterSpec := newOpenStackCluster["spec"].(map[string]interface{})
89-
oldOpenStackClusterSpec := oldOpenStackCluster["spec"].(map[string]interface{})
90-
91-
// get controlPlaneEndpoint, something like {"host":"", "port":""}
92-
cpe := oldOpenStackClusterSpec["controlPlaneEndpoint"].(map[string]interface{})
93-
94-
// allow change only for the first time
95-
host, ok := cpe["host"].(string)
96-
if ok && len(host) == 0 {
97-
delete(oldOpenStackClusterSpec, "controlPlaneEndpoint")
98-
delete(newOpenStackClusterSpec, "controlPlaneEndpoint")
80+
// Allow change only for the first time.
81+
if old.Spec.ControlPlaneEndpoint.Host == "" {
82+
old.Spec.ControlPlaneEndpoint = clusterv1.APIEndpoint{}
83+
r.Spec.ControlPlaneEndpoint = clusterv1.APIEndpoint{}
9984
}
10085

101-
if !reflect.DeepEqual(oldOpenStackClusterSpec, newOpenStackClusterSpec) {
86+
if !reflect.DeepEqual(old.Spec, r.Spec) {
10287
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "cannot be modified"))
10388
}
10489

api/v1alpha4/openstackclustertemplate_webhook.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ limitations under the License.
1717
package v1alpha4
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122

23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2224
"k8s.io/apimachinery/pkg/runtime"
2325
"k8s.io/apimachinery/pkg/util/validation/field"
2426
ctrl "sigs.k8s.io/controller-runtime"
@@ -62,8 +64,11 @@ func (r *OpenStackClusterTemplate) ValidateCreate() error {
6264
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
6365
func (r *OpenStackClusterTemplate) ValidateUpdate(oldRaw runtime.Object) error {
6466
var allErrs field.ErrorList
67+
old, ok := oldRaw.(*OpenStackClusterTemplate)
68+
if !ok {
69+
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackClusterTemplate but got a %T", oldRaw))
70+
}
6571

66-
old := oldRaw.(*OpenStackClusterTemplate)
6772
if !reflect.DeepEqual(r.Spec.Template.Spec, old.Spec.Template.Spec) {
6873
allErrs = append(allErrs,
6974
field.Invalid(field.NewPath("OpenStackClusterTemplate", "spec", "template", "spec"), r, openStackClusterTemplateImmutableMsg),

api/v1alpha4/openstackmachinetemplate_webhook.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ limitations under the License.
1717
package v1alpha4
1818

1919
import (
20+
"fmt"
2021
"reflect"
2122

23+
apierrors "k8s.io/apimachinery/pkg/api/errors"
2224
"k8s.io/apimachinery/pkg/runtime"
2325
"k8s.io/apimachinery/pkg/util/validation/field"
2426
"sigs.k8s.io/controller-runtime/pkg/builder"
@@ -51,11 +53,14 @@ func (r *OpenStackMachineTemplate) ValidateCreate() error {
5153
}
5254

5355
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
54-
func (r *OpenStackMachineTemplate) ValidateUpdate(old runtime.Object) error {
56+
func (r *OpenStackMachineTemplate) ValidateUpdate(oldRaw runtime.Object) error {
5557
var allErrs field.ErrorList
56-
oldOpenStackMachineTemplate := old.(*OpenStackMachineTemplate)
58+
old, ok := oldRaw.(*OpenStackMachineTemplate)
59+
if !ok {
60+
return apierrors.NewBadRequest(fmt.Sprintf("expected an OpenStackMachineTemplate but got a %T", oldRaw))
61+
}
5762

58-
if !reflect.DeepEqual(r.Spec.Template.Spec, oldOpenStackMachineTemplate.Spec.Template.Spec) {
63+
if !reflect.DeepEqual(r.Spec.Template.Spec, old.Spec.Template.Spec) {
5964
allErrs = append(allErrs,
6065
field.Invalid(field.NewPath("spec", "template", "spec"), r, OpenStackMachineTemplateImmutableMsg),
6166
)

0 commit comments

Comments
 (0)