Skip to content

Commit 757bcce

Browse files
authored
Move wehbooks out of api directory (#2296)
1 parent 059630f commit 757bcce

24 files changed

+562
-483
lines changed

Diff for: Dockerfile

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ COPY controllers/ controllers/
4040
COPY cloud/ cloud/
4141
COPY pkg/ pkg/
4242
COPY util/ util/
43+
COPY internal/ internal/
4344

4445
# Build
4546
ARG TARGETOS

Diff for: cloud/scope/powervs_machine.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ func (m *PowerVSMachineScope) CreateVPCLoadBalancerPoolMember() (*vpcv1.LoadBala
10691069
ID: loadBalancer.ID,
10701070
})
10711071
if err != nil {
1072-
return nil, fmt.Errorf("failed to fetch VPC load balancer details with ID: %s error: %v", *loadBalancer.ID, err)
1072+
return nil, fmt.Errorf("failed to fetch VPC load balancer details with ID: %s error: %v", *lbID, err)
10731073
}
10741074
if *loadBalancer.ProvisioningStatus != string(infrav1beta2.VPCLoadBalancerStateActive) {
10751075
m.V(3).Info("Unable to update pool for VPC load balancer as it is not in active state", "loadbalancer", *loadBalancer.Name, "state", *loadBalancer.ProvisioningStatus)

Diff for: cloud/scope/suite_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
ctrl "sigs.k8s.io/controller-runtime"
2929

3030
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
31+
"sigs.k8s.io/cluster-api-provider-ibmcloud/internal/webhooks"
3132
"sigs.k8s.io/cluster-api-provider-ibmcloud/test/helpers"
3233
)
3334

@@ -56,32 +57,31 @@ func setup() {
5657
if err != nil {
5758
panic(err)
5859
}
59-
if err := (&infrav1beta2.IBMPowerVSCluster{}).SetupWebhookWithManager(testEnv); err != nil {
60+
if err := (&webhooks.IBMPowerVSCluster{}).SetupWebhookWithManager(testEnv); err != nil {
6061
panic(fmt.Sprintf("Unable to setup IBMPowerVSCluster webhook: %v", err))
6162
}
62-
if err := (&infrav1beta2.IBMPowerVSMachine{}).SetupWebhookWithManager(testEnv); err != nil {
63+
if err := (&webhooks.IBMPowerVSMachine{}).SetupWebhookWithManager(testEnv); err != nil {
6364
panic(fmt.Sprintf("Unable to setup IBMPowerVSMachine webhook: %v", err))
6465
}
65-
if err := (&infrav1beta2.IBMPowerVSMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
66+
if err := (&webhooks.IBMPowerVSMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
6667
panic(fmt.Sprintf("Unable to setup IBMPowerVSMachineTemplate webhook: %v", err))
6768
}
68-
if err := (&infrav1beta2.IBMPowerVSImage{}).SetupWebhookWithManager(testEnv); err != nil {
69+
if err := (&webhooks.IBMPowerVSImage{}).SetupWebhookWithManager(testEnv); err != nil {
6970
panic(fmt.Sprintf("Unable to setup IBMPowerVSImage webhook: %v", err))
7071
}
71-
if err := (&infrav1beta2.IBMVPCCluster{}).SetupWebhookWithManager(testEnv); err != nil {
72+
if err := (&webhooks.IBMVPCCluster{}).SetupWebhookWithManager(testEnv); err != nil {
7273
panic(fmt.Sprintf("Unable to setup IBMVPCCluster webhook: %v", err))
7374
}
74-
if err := (&infrav1beta2.IBMVPCMachine{}).SetupWebhookWithManager(testEnv); err != nil {
75+
if err := (&webhooks.IBMVPCMachine{}).SetupWebhookWithManager(testEnv); err != nil {
7576
panic(fmt.Sprintf("Unable to setup IBMVPCMachine webhook: %v", err))
7677
}
77-
if err := (&infrav1beta2.IBMVPCMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
78+
if err := (&webhooks.IBMVPCMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
7879
panic(fmt.Sprintf("Unable to setup IBMVPCMachineTemplate webhook: %v", err))
7980
}
80-
if err := (&infrav1beta2.IBMPowerVSClusterTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
81+
if err := (&webhooks.IBMPowerVSClusterTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
8182
panic(fmt.Sprintf("Unable to setup IBMPowerVSClusterTemplate webhook: %v", err))
8283
}
8384
go func() {
84-
fmt.Println("Starting the manager")
8585
if err := testEnv.StartManager(ctx); err != nil {
8686
panic(fmt.Sprintf("Failed to start the envtest manager: %v", err))
8787
}

Diff for: controllers/suite_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
// +kubebuilder:scaffold:imports
3030
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
31+
"sigs.k8s.io/cluster-api-provider-ibmcloud/internal/webhooks"
3132
"sigs.k8s.io/cluster-api-provider-ibmcloud/test/helpers"
3233
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
3334
)
@@ -57,32 +58,31 @@ func setup() {
5758
if err != nil {
5859
panic(err)
5960
}
60-
if err := (&infrav1beta2.IBMPowerVSCluster{}).SetupWebhookWithManager(testEnv); err != nil {
61+
if err := (&webhooks.IBMPowerVSCluster{}).SetupWebhookWithManager(testEnv); err != nil {
6162
panic(fmt.Sprintf("Unable to setup IBMPowerVSCluster webhook: %v", err))
6263
}
63-
if err := (&infrav1beta2.IBMPowerVSMachine{}).SetupWebhookWithManager(testEnv); err != nil {
64+
if err := (&webhooks.IBMPowerVSMachine{}).SetupWebhookWithManager(testEnv); err != nil {
6465
panic(fmt.Sprintf("Unable to setup IBMPowerVSMachine webhook: %v", err))
6566
}
66-
if err := (&infrav1beta2.IBMPowerVSMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
67+
if err := (&webhooks.IBMPowerVSMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
6768
panic(fmt.Sprintf("Unable to setup IBMPowerVSMachineTemplate webhook: %v", err))
6869
}
69-
if err := (&infrav1beta2.IBMPowerVSImage{}).SetupWebhookWithManager(testEnv); err != nil {
70+
if err := (&webhooks.IBMPowerVSImage{}).SetupWebhookWithManager(testEnv); err != nil {
7071
panic(fmt.Sprintf("Unable to setup IBMPowerVSImage webhook: %v", err))
7172
}
72-
if err := (&infrav1beta2.IBMVPCCluster{}).SetupWebhookWithManager(testEnv); err != nil {
73+
if err := (&webhooks.IBMVPCCluster{}).SetupWebhookWithManager(testEnv); err != nil {
7374
panic(fmt.Sprintf("Unable to setup IBMVPCCluster webhook: %v", err))
7475
}
75-
if err := (&infrav1beta2.IBMVPCMachine{}).SetupWebhookWithManager(testEnv); err != nil {
76+
if err := (&webhooks.IBMVPCMachine{}).SetupWebhookWithManager(testEnv); err != nil {
7677
panic(fmt.Sprintf("Unable to setup IBMVPCMachine webhook: %v", err))
7778
}
78-
if err := (&infrav1beta2.IBMVPCMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
79+
if err := (&webhooks.IBMVPCMachineTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
7980
panic(fmt.Sprintf("Unable to setup IBMVPCMachineTemplate webhook: %v", err))
8081
}
81-
if err := (&infrav1beta2.IBMPowerVSClusterTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
82+
if err := (&webhooks.IBMPowerVSClusterTemplate{}).SetupWebhookWithManager(testEnv); err != nil {
8283
panic(fmt.Sprintf("Unable to setup IBMPowerVSClusterTemplate webhook: %v", err))
8384
}
8485
go func() {
85-
fmt.Println("Starting the manager")
8686
if err := testEnv.StartManager(ctx); err != nil {
8787
panic(fmt.Sprintf("Failed to start the envtest manager: %v", err))
8888
}

Diff for: api/v1beta2/common.go renamed to internal/webhooks/common.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package v1beta2
17+
package webhooks
1818

1919
import (
2020
"strconv"
2121

2222
"k8s.io/apimachinery/pkg/util/intstr"
2323
"k8s.io/apimachinery/pkg/util/validation/field"
24+
25+
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
2426
)
2527

26-
func defaultIBMPowerVSMachineSpec(spec *IBMPowerVSMachineSpec) {
28+
func defaultIBMPowerVSMachineSpec(spec *infrav1beta2.IBMPowerVSMachineSpec) {
2729
if spec.MemoryGiB == 0 {
2830
spec.MemoryGiB = 2
2931
}
@@ -34,18 +36,18 @@ func defaultIBMPowerVSMachineSpec(spec *IBMPowerVSMachineSpec) {
3436
spec.SystemType = "s922"
3537
}
3638
if spec.ProcessorType == "" {
37-
spec.ProcessorType = PowerVSProcessorTypeShared
39+
spec.ProcessorType = infrav1beta2.PowerVSProcessorTypeShared
3840
}
3941
}
4042

41-
func validateIBMPowerVSResourceReference(res IBMPowerVSResourceReference, resType string) (bool, *field.Error) {
43+
func validateIBMPowerVSResourceReference(res infrav1beta2.IBMPowerVSResourceReference, resType string) (bool, *field.Error) {
4244
if res.ID != nil && res.Name != nil {
4345
return false, field.Invalid(field.NewPath("spec", resType), res, "Only one of "+resType+" - ID or Name may be specified")
4446
}
4547
return true, nil
4648
}
4749

48-
func validateIBMPowerVSNetworkReference(res IBMPowerVSResourceReference) (bool, *field.Error) {
50+
func validateIBMPowerVSNetworkReference(res infrav1beta2.IBMPowerVSResourceReference) (bool, *field.Error) {
4951
if (res.ID != nil && res.Name != nil) || (res.ID != nil && res.RegEx != nil) || (res.Name != nil && res.RegEx != nil) {
5052
return false, field.Invalid(field.NewPath("spec", "Network"), res, "Only one of Network - ID, Name or RegEx can be specified")
5153
}
@@ -74,13 +76,13 @@ func validateIBMPowerVSProcessorValues(resValue intstr.IntOrString) bool {
7476
return true
7577
}
7678

77-
func defaultIBMVPCMachineSpec(spec *IBMVPCMachineSpec) {
79+
func defaultIBMVPCMachineSpec(spec *infrav1beta2.IBMVPCMachineSpec) {
7880
if spec.Profile == "" {
7981
spec.Profile = "bx2-2x8"
8082
}
8183
}
8284

83-
func validateBootVolume(spec IBMVPCMachineSpec) field.ErrorList {
85+
func validateBootVolume(spec infrav1beta2.IBMVPCMachineSpec) field.ErrorList {
8486
var allErrs field.ErrorList
8587

8688
if spec.BootVolume == nil {

Diff for: api/v1beta2/common_test.go renamed to internal/webhooks/common_test.go

+15-13
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
package v1beta2
17+
package webhooks
1818

1919
import (
2020
"testing"
2121

2222
"k8s.io/apimachinery/pkg/util/intstr"
23+
24+
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
2325
)
2426

2527
func TestValidateIBMPowerVSMemoryValues(t *testing.T) {
@@ -113,48 +115,48 @@ func TestValidateIBMPowerVSProcessorValues(t *testing.T) {
113115
func Test_validateBootVolume(t *testing.T) {
114116
tests := []struct {
115117
name string
116-
spec IBMVPCMachineSpec
118+
spec infrav1beta2.IBMVPCMachineSpec
117119
wantError bool
118120
}{
119121
{
120122
name: "Nil bootvolume",
121-
spec: IBMVPCMachineSpec{
123+
spec: infrav1beta2.IBMVPCMachineSpec{
122124
BootVolume: nil,
123125
},
124126
wantError: false,
125127
},
126128
{
127129
name: "valid sizeGiB",
128-
spec: IBMVPCMachineSpec{
129-
BootVolume: &VPCVolume{SizeGiB: 20},
130+
spec: infrav1beta2.IBMVPCMachineSpec{
131+
BootVolume: &infrav1beta2.VPCVolume{SizeGiB: 20},
130132
},
131133
wantError: false,
132134
},
133135
{
134136
name: "Invalid sizeGiB",
135-
spec: IBMVPCMachineSpec{
136-
BootVolume: &VPCVolume{SizeGiB: 1},
137+
spec: infrav1beta2.IBMVPCMachineSpec{
138+
BootVolume: &infrav1beta2.VPCVolume{SizeGiB: 1},
137139
},
138140
wantError: true,
139141
},
140142
{
141143
name: "Valid Iops",
142-
spec: IBMVPCMachineSpec{
143-
BootVolume: &VPCVolume{Iops: 1000, Profile: "custom"},
144+
spec: infrav1beta2.IBMVPCMachineSpec{
145+
BootVolume: &infrav1beta2.VPCVolume{Iops: 1000, Profile: "custom"},
144146
},
145147
wantError: true,
146148
},
147149
{
148150
name: "Invalid Iops",
149-
spec: IBMVPCMachineSpec{
150-
BootVolume: &VPCVolume{Iops: 1234, Profile: "general-purpose"},
151+
spec: infrav1beta2.IBMVPCMachineSpec{
152+
BootVolume: &infrav1beta2.VPCVolume{Iops: 1234, Profile: "general-purpose"},
151153
},
152154
wantError: true,
153155
},
154156
{
155157
name: "Missing Iops for custom profile",
156-
spec: IBMVPCMachineSpec{
157-
BootVolume: &VPCVolume{Profile: "general-purpose"},
158+
spec: infrav1beta2.IBMVPCMachineSpec{
159+
BootVolume: &infrav1beta2.VPCVolume{Profile: "general-purpose"},
158160
},
159161
wantError: true,
160162
},

Diff for: internal/webhooks/doc.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
Copyright 2025 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
// Package webhooks contains external webhook implementations for some of our API types.
18+
package webhooks

0 commit comments

Comments
 (0)