@@ -17,12 +17,13 @@ limitations under the License.
17
17
package v1alpha4
18
18
19
19
import (
20
+ "fmt"
20
21
"reflect"
21
22
22
- "github.com/pkg/errors"
23
23
apierrors "k8s.io/apimachinery/pkg/api/errors"
24
24
"k8s.io/apimachinery/pkg/runtime"
25
25
"k8s.io/apimachinery/pkg/util/validation/field"
26
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
26
27
"sigs.k8s.io/controller-runtime/pkg/builder"
27
28
logf "sigs.k8s.io/controller-runtime/pkg/log"
28
29
"sigs.k8s.io/controller-runtime/pkg/manager"
@@ -65,40 +66,24 @@ func (r *OpenStackCluster) ValidateCreate() error {
65
66
}
66
67
67
68
// 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 {
69
70
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 ))
82
74
}
83
75
84
76
if r .Spec .IdentityRef != nil && r .Spec .IdentityRef .Kind != defaultIdentityRefKind {
85
77
allErrs = append (allErrs , field .Forbidden (field .NewPath ("spec" , "identityRef" , "kind" ), "must be a Secret" ))
86
78
}
87
79
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 {}
99
84
}
100
85
101
- if ! reflect .DeepEqual (oldOpenStackClusterSpec , newOpenStackClusterSpec ) {
86
+ if ! reflect .DeepEqual (old . Spec , r . Spec ) {
102
87
allErrs = append (allErrs , field .Forbidden (field .NewPath ("spec" ), "cannot be modified" ))
103
88
}
104
89
0 commit comments