Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 8b63957

Browse files
committedJan 26, 2025·
network regex validation for powervscluster
1 parent 0e4a327 commit 8b63957

4 files changed

+130
-22
lines changed
 

‎api/v1beta2/common.go

+8-12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta2
1818

1919
import (
20+
"regexp"
2021
"strconv"
2122

2223
"k8s.io/apimachinery/pkg/util/intstr"
@@ -43,28 +44,23 @@ func validateIBMPowerVSResourceReference(res IBMPowerVSResourceReference, resTyp
4344
return false, field.Invalid(field.NewPath("spec", resType), res, "Only one of "+resType+" - ID or Name may be specified")
4445
}
4546

46-
4747
return true, nil
4848
}
4949

50-
// TODO need to pass the DHCP server and cluster name for the new validation logic
51-
5250
func validateIBMPowerVSNetworkReference(res IBMPowerVSResourceReference) (bool, *field.Error) {
51+
// Ensure only one of ID, Name, or RegEx is specified
5352
if (res.ID != nil && res.Name != nil) || (res.ID != nil && res.RegEx != nil) || (res.Name != nil && res.RegEx != nil) {
5453
return false, field.Invalid(field.NewPath("spec", "Network"), res, "Only one of Network - ID, Name or RegEx can be specified")
5554
}
56-
57-
58-
//check if res.RegEx not nil then check if it matches to the required pattern. If not return false ,error
59-
60-
// check if DHCP server name is present. Then validate expression to check it matches the DHCP server name
61-
62-
// else DHCP server name is present not present then check it matches the cluster name
63-
64-
6555
return true, nil
6656
}
6757

58+
// regexMatches validates if a given regex matches the target string
59+
func regexMatches(pattern, target string) bool {
60+
matched, err := regexp.MatchString(pattern, target)
61+
return err == nil && matched
62+
}
63+
6864
func validateIBMPowerVSMemoryValues(resValue int32) bool {
6965
if val := float64(resValue); val < 2 {
7066
return false

‎api/v1beta2/ibmpowervscluster_webhook.go

+34-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ func (r *IBMPowerVSCluster) ValidateDelete() (admission.Warnings, error) {
7777
}
7878

7979
func (r *IBMPowerVSCluster) validateIBMPowerVSCluster() (admission.Warnings, error) {
80-
81-
8280
var allErrs field.ErrorList
8381
if err := r.validateIBMPowerVSClusterNetwork(); err != nil {
8482
allErrs = append(allErrs, err)
@@ -97,10 +95,44 @@ func (r *IBMPowerVSCluster) validateIBMPowerVSCluster() (admission.Warnings, err
9795
r.Name, allErrs)
9896
}
9997

98+
func (r *IBMPowerVSCluster) validateNetworkRegex() (bool, *field.Error) {
99+
if r.Spec.Network.RegEx != nil {
100+
var targetName string
101+
var validationMessage string
102+
103+
if *r.Spec.DHCPServer.Name != "" {
104+
targetName = *r.Spec.DHCPServer.Name
105+
validationMessage = "The RegEx should match the DHCP server name when the DHCP server is set"
106+
} else {
107+
if r.GetObjectMeta().GetName() == "" {
108+
return false, field.Required(
109+
field.NewPath("metadata", "name"),
110+
"Cluster name must be set when Network.RegEx is provided and DHCP server name is not set",
111+
)
112+
}
113+
targetName = r.GetObjectMeta().GetName()
114+
validationMessage = "The RegEx should match the cluster name when the DHCP server is not set"
115+
}
116+
117+
if !regexMatches(*r.Spec.Network.RegEx, targetName) {
118+
return false, field.Invalid(
119+
field.NewPath("spec", "Network", "RegEx"),
120+
r.Spec.Network.RegEx,
121+
validationMessage,
122+
)
123+
}
124+
}
125+
126+
return true, nil
127+
}
128+
100129
func (r *IBMPowerVSCluster) validateIBMPowerVSClusterNetwork() *field.Error {
101130
if res, err := validateIBMPowerVSNetworkReference(r.Spec.Network); !res {
102131
return err
103132
}
133+
if res, err := r.validateNetworkRegex(); !res {
134+
return err
135+
}
104136
return nil
105137
}
106138

‎api/v1beta2/ibmpowervscluster_webhook_test.go

+88
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,36 @@ func TestIBMPowerVSCluster_create(t *testing.T) {
6868
},
6969
wantErr: true,
7070
},
71+
{
72+
name: "Should error network regex and dhcp server name is set but does not match dhcp server name",
73+
powervsCluster: &IBMPowerVSCluster{
74+
Spec: IBMPowerVSClusterSpec{
75+
ServiceInstanceID: "capi-si-id",
76+
Network: IBMPowerVSResourceReference{
77+
RegEx: ptr.To("^capi$"),
78+
},
79+
DHCPServer: &DHCPServer{
80+
Name: ptr.To("test"),
81+
},
82+
},
83+
},
84+
wantErr: true,
85+
},
86+
{
87+
name: "Should error if only network regex is set, dhcp server name is not set and does not match cluster name",
88+
powervsCluster: &IBMPowerVSCluster{
89+
Spec: IBMPowerVSClusterSpec{
90+
ServiceInstanceID: "capi-si-id",
91+
Network: IBMPowerVSResourceReference{
92+
RegEx: ptr.To("^capi$"),
93+
},
94+
},
95+
ObjectMeta: metav1.ObjectMeta{
96+
Name: "test",
97+
},
98+
},
99+
wantErr: true,
100+
},
71101
}
72102

73103
for _, tc := range tests {
@@ -141,6 +171,9 @@ func TestIBMPowerVSCluster_update(t *testing.T) {
141171
Network: IBMPowerVSResourceReference{
142172
RegEx: ptr.To("^capi-net-id$"),
143173
},
174+
DHCPServer: &DHCPServer{
175+
Name: ptr.To("capi-net-id"),
176+
},
144177
},
145178
},
146179
newPowervsCluster: &IBMPowerVSCluster{
@@ -149,6 +182,9 @@ func TestIBMPowerVSCluster_update(t *testing.T) {
149182
Network: IBMPowerVSResourceReference{
150183
RegEx: ptr.To("^capi-net-id$"),
151184
},
185+
DHCPServer: &DHCPServer{
186+
Name: ptr.To("capi-net-id"),
187+
},
152188
},
153189
},
154190
wantErr: false,
@@ -175,6 +211,58 @@ func TestIBMPowerVSCluster_update(t *testing.T) {
175211
},
176212
wantErr: true,
177213
},
214+
{
215+
name: "Should error if network regex and dhcp server name is set but network regex does not match dhcp server name",
216+
oldPowervsCluster: &IBMPowerVSCluster{
217+
Spec: IBMPowerVSClusterSpec{
218+
ServiceInstanceID: "capi-si-id",
219+
Network: IBMPowerVSResourceReference{
220+
RegEx: ptr.To("^capi$"),
221+
},
222+
DHCPServer: &DHCPServer{
223+
Name: ptr.To("capi"),
224+
},
225+
},
226+
},
227+
newPowervsCluster: &IBMPowerVSCluster{
228+
Spec: IBMPowerVSClusterSpec{
229+
ServiceInstanceID: "capi-si-id",
230+
Network: IBMPowerVSResourceReference{
231+
RegEx: ptr.To("^capi$"),
232+
},
233+
DHCPServer: &DHCPServer{
234+
Name: ptr.To("test"),
235+
},
236+
},
237+
},
238+
wantErr: true,
239+
},
240+
{
241+
name: "Should error if network regex is set, dhcp server name is not set and network regex does not match cluster name",
242+
oldPowervsCluster: &IBMPowerVSCluster{
243+
Spec: IBMPowerVSClusterSpec{
244+
ServiceInstanceID: "capi-si-id",
245+
Network: IBMPowerVSResourceReference{
246+
RegEx: ptr.To("^capi$"),
247+
},
248+
DHCPServer: &DHCPServer{
249+
Name: ptr.To("capi"),
250+
},
251+
},
252+
},
253+
newPowervsCluster: &IBMPowerVSCluster{
254+
Spec: IBMPowerVSClusterSpec{
255+
ServiceInstanceID: "capi-si-id",
256+
Network: IBMPowerVSResourceReference{
257+
RegEx: ptr.To("^capi$"),
258+
},
259+
},
260+
ObjectMeta: metav1.ObjectMeta{
261+
Name: "capi",
262+
},
263+
},
264+
wantErr: true,
265+
},
178266
}
179267

180268
for _, tc := range tests {

‎api/v1beta2/ibmpowervsmachine_webhook.go

-8
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
logf "sigs.k8s.io/controller-runtime/pkg/log"
2727
"sigs.k8s.io/controller-runtime/pkg/webhook"
2828
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
29-
"sigs.k8s.io/cluster-api/util"
3029
)
3130

3231
// log is for logging in this package.
@@ -71,11 +70,6 @@ func (r *IBMPowerVSMachine) ValidateDelete() (admission.Warnings, error) {
7170
}
7271

7372
func (r *IBMPowerVSMachine) validateIBMPowerVSMachine() (admission.Warnings, error) {
74-
75-
// cluster, err := util.GetClusterFromMetadata(ctx, r.Client, ibmPowerVSMachine.ObjectMeta)
76-
77-
78-
7973
var allErrs field.ErrorList
8074
if err := r.validateIBMPowerVSMachineNetwork(); err != nil {
8175
allErrs = append(allErrs, err)
@@ -99,11 +93,9 @@ func (r *IBMPowerVSMachine) validateIBMPowerVSMachine() (admission.Warnings, err
9993
}
10094

10195
func (r *IBMPowerVSMachine) validateIBMPowerVSMachineNetwork() *field.Error {
102-
10396
if res, err := validateIBMPowerVSNetworkReference(r.Spec.Network); !res {
10497
return err
10598
}
106-
10799
return nil
108100
}
109101

0 commit comments

Comments
 (0)
Please sign in to comment.