Skip to content

Commit 2664e08

Browse files
authored
Add regex support for finding network (#903)
1 parent 6182097 commit 2664e08

13 files changed

+150
-23
lines changed

api/v1alpha4/ibmpowervs_conversion.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ func (src *IBMPowerVSMachine) ConvertTo(dstRaw conversion.Hub) error {
5757
return err
5858
}
5959

60-
dst.Spec.Image = (*infrav1beta1.IBMPowerVSResourceReference)(&src.Spec.Image)
61-
60+
if err := Convert_v1alpha4_IBMPowerVSResourceReference_To_v1beta1_IBMPowerVSResourceReference(&src.Spec.Image, dst.Spec.Image, nil); err != nil {
61+
return err
62+
}
6263
return nil
6364
}
6465

@@ -79,7 +80,8 @@ func (dst *IBMPowerVSMachine) ConvertFrom(srcRaw conversion.Hub) error {
7980
}
8081

8182
if src.Spec.Image != nil && src.Spec.ImageRef == nil {
82-
dst.Spec.Image = IBMPowerVSResourceReference(*src.Spec.Image)
83+
dst.Spec.Image.Name = src.Spec.Image.Name
84+
dst.Spec.Image.ID = src.Spec.Image.ID
8385
}
8486

8587
return nil
@@ -103,9 +105,9 @@ func (src *IBMPowerVSMachineTemplate) ConvertTo(dstRaw conversion.Hub) error {
103105
if err := Convert_v1alpha4_IBMPowerVSMachineTemplate_To_v1beta1_IBMPowerVSMachineTemplate(src, dst, nil); err != nil {
104106
return err
105107
}
106-
107-
dst.Spec.Template.Spec.Image = (*infrav1beta1.IBMPowerVSResourceReference)(&src.Spec.Template.Spec.Image)
108-
108+
if err := Convert_v1alpha4_IBMPowerVSResourceReference_To_v1beta1_IBMPowerVSResourceReference(&src.Spec.Template.Spec.Image, dst.Spec.Template.Spec.Image, nil); err != nil {
109+
return err
110+
}
109111
return nil
110112
}
111113

@@ -126,7 +128,8 @@ func (dst *IBMPowerVSMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error {
126128
}
127129

128130
if src.Spec.Template.Spec.Image != nil && src.Spec.Template.Spec.ImageRef == nil {
129-
dst.Spec.Template.Spec.Image = IBMPowerVSResourceReference(*src.Spec.Template.Spec.Image)
131+
dst.Spec.Template.Spec.Image.Name = src.Spec.Template.Spec.Image.Name
132+
dst.Spec.Template.Spec.Image.ID = src.Spec.Template.Spec.Image.ID
130133
}
131134

132135
return nil
@@ -164,3 +167,8 @@ func Convert_v1alpha4_IBMPowerVSMachineSpec_To_v1beta1_IBMPowerVSMachineSpec(in
164167
func Convert_v1beta1_IBMPowerVSMachineTemplateStatus_To_v1alpha4_IBMPowerVSMachineTemplateStatus(in *infrav1beta1.IBMPowerVSMachineTemplateStatus, out *IBMPowerVSMachineTemplateStatus, s apiconversion.Scope) error {
165168
return autoConvert_v1beta1_IBMPowerVSMachineTemplateStatus_To_v1alpha4_IBMPowerVSMachineTemplateStatus(in, out, s)
166169
}
170+
171+
// Convert_v1beta1_IBMPowerVSResourceReference_To_v1alpha4_IBMPowerVSResourceReference is an autogenerated conversion function.
172+
func Convert_v1beta1_IBMPowerVSResourceReference_To_v1alpha4_IBMPowerVSResourceReference(in *infrav1beta1.IBMPowerVSResourceReference, out *IBMPowerVSResourceReference, s apiconversion.Scope) error {
173+
return autoConvert_v1beta1_IBMPowerVSResourceReference_To_v1alpha4_IBMPowerVSResourceReference(in, out, s)
174+
}

api/v1alpha4/zz_generated.conversion.go

Lines changed: 6 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1beta1/common.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func validateIBMPowerVSResourceReference(res IBMPowerVSResourceReference, resTyp
6464
return true, nil
6565
}
6666

67+
func validateIBMPowerVSNetworkReference(res IBMPowerVSResourceReference) (bool, *field.Error) {
68+
if (res.ID != nil && res.Name != nil) || (res.ID != nil && res.RegEx != nil) || (res.Name != nil && res.RegEx != nil) {
69+
return false, field.Invalid(field.NewPath("spec", "Network"), res, "Only one of Network - ID, Name or RegEx can be specified")
70+
}
71+
return true, nil
72+
}
73+
6774
func validateIBMPowerVSMemoryValues(resValue string) bool {
6875
if val, err := strconv.ParseUint(resValue, 10, 64); err != nil || val < 2 {
6976
return false

api/v1beta1/ibmpowervscluster_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (r *IBMPowerVSCluster) validateIBMPowerVSCluster() error {
8383
}
8484

8585
func (r *IBMPowerVSCluster) validateIBMPowerVSClusterNetwork() *field.Error {
86-
if res, err := validateIBMPowerVSResourceReference(r.Spec.Network, "Network"); !res {
86+
if res, err := validateIBMPowerVSNetworkReference(r.Spec.Network); !res {
8787
return err
8888
}
8989
return nil

api/v1beta1/ibmpowervscluster_webhook_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,20 @@ func TestIBMPowerVSCluster_create(t *testing.T) {
5454
},
5555
wantErr: true,
5656
},
57+
{
58+
name: "Should error if all Network ID, name and regex are set",
59+
powervsCluster: &IBMPowerVSCluster{
60+
Spec: IBMPowerVSClusterSpec{
61+
ServiceInstanceID: "capi-si-id",
62+
Network: IBMPowerVSResourceReference{
63+
ID: pointer.String("capi-net-id"),
64+
Name: pointer.String("capi-net"),
65+
RegEx: pointer.String("^capi$"),
66+
},
67+
},
68+
},
69+
wantErr: true,
70+
},
5771
}
5872

5973
for _, tc := range tests {
@@ -119,6 +133,48 @@ func TestIBMPowerVSCluster_update(t *testing.T) {
119133
},
120134
wantErr: true,
121135
},
136+
{
137+
name: "Should allow if Network ID is set",
138+
oldPowervsCluster: &IBMPowerVSCluster{
139+
Spec: IBMPowerVSClusterSpec{
140+
ServiceInstanceID: "capi-si-id",
141+
Network: IBMPowerVSResourceReference{
142+
RegEx: pointer.String("^capi-net-id$"),
143+
},
144+
},
145+
},
146+
newPowervsCluster: &IBMPowerVSCluster{
147+
Spec: IBMPowerVSClusterSpec{
148+
ServiceInstanceID: "capi-si-id",
149+
Network: IBMPowerVSResourceReference{
150+
RegEx: pointer.String("^capi-net-id$"),
151+
},
152+
},
153+
},
154+
wantErr: false,
155+
},
156+
{
157+
name: "Should error if all Network ID, name and regex are set",
158+
oldPowervsCluster: &IBMPowerVSCluster{
159+
Spec: IBMPowerVSClusterSpec{
160+
ServiceInstanceID: "capi-si-id",
161+
Network: IBMPowerVSResourceReference{
162+
ID: pointer.String("capi-net-id"),
163+
},
164+
},
165+
},
166+
newPowervsCluster: &IBMPowerVSCluster{
167+
Spec: IBMPowerVSClusterSpec{
168+
ServiceInstanceID: "capi-si-id",
169+
Network: IBMPowerVSResourceReference{
170+
ID: pointer.String("capi-net-id"),
171+
Name: pointer.String("capi-net-name"),
172+
RegEx: pointer.String("^capi-net-id$"),
173+
},
174+
},
175+
},
176+
wantErr: true,
177+
},
122178
}
123179

124180
for _, tc := range tests {

api/v1beta1/ibmpowervsmachine_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,12 @@ type IBMPowerVSResourceReference struct {
9191
// +kubebuilder:validation:MinLength=1
9292
// +optional
9393
Name *string `json:"name,omitempty"`
94+
95+
// Regular expression to match resource,
96+
// In case of multiple resources matches the provided regular expression the first matched resource will be selected
97+
// +kubebuilder:validation:MinLength=1
98+
// +optional
99+
RegEx *string `json:"regex,omitempty"`
94100
}
95101

96102
// IBMPowerVSMachineStatus defines the observed state of IBMPowerVSMachine.

api/v1beta1/ibmpowervsmachine_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (r *IBMPowerVSMachine) validateIBMPowerVSMachineProcType() *field.Error {
112112
}
113113

114114
func (r *IBMPowerVSMachine) validateIBMPowerVSMachineNetwork() *field.Error {
115-
if res, err := validateIBMPowerVSResourceReference(r.Spec.Network, "Network"); !res {
115+
if res, err := validateIBMPowerVSNetworkReference(r.Spec.Network); !res {
116116
return err
117117
}
118118
return nil

api/v1beta1/ibmpowervsmachinetemplate_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateProcType()
112112
}
113113

114114
func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateNetwork() *field.Error {
115-
if res, err := validateIBMPowerVSResourceReference(r.Spec.Template.Spec.Network, "Network"); !res {
115+
if res, err := validateIBMPowerVSNetworkReference(r.Spec.Template.Spec.Network); !res {
116116
return err
117117
}
118118
return nil

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/scope/powervs_machine.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"encoding/base64"
2222
"fmt"
23+
"regexp"
2324
"strconv"
2425
"strings"
2526

@@ -339,11 +340,29 @@ func getNetworkID(network infrav1beta1.IBMPowerVSResourceReference, m *PowerVSMa
339340
return nw.NetworkID, nil
340341
}
341342
}
343+
return nil, fmt.Errorf("failed to find a network ID with name %s", *network.Name)
344+
} else if network.RegEx != nil {
345+
networks, err := m.GetNetworks()
346+
if err != nil {
347+
m.Logger.Error(err, "Failed to get networks")
348+
return nil, err
349+
}
350+
re, err := regexp.Compile(*network.RegEx)
351+
if err != nil {
352+
m.Logger.Error(err, "Failed to compile regular expression", "regex", *network.RegEx)
353+
return nil, err
354+
}
355+
// In case of multiple network names matches the provided regular expression the first matched network will be selected.
356+
for _, nw := range networks.Networks {
357+
if match := re.Match([]byte(*nw.Name)); match {
358+
m.Logger.Info("Network found with ID", "Network", *nw.Name, "ID", *nw.NetworkID)
359+
return nw.NetworkID, nil
360+
}
361+
}
362+
return nil, fmt.Errorf("failed to find a network ID with RegEx %s", *network.RegEx)
342363
} else {
343-
return nil, fmt.Errorf("both ID and Name can't be nil")
364+
return nil, fmt.Errorf("ID, Name and RegEx can't be nil")
344365
}
345-
346-
return nil, fmt.Errorf("failed to find a network ID")
347366
}
348367

349368
// GetNetworks will get list of networks for the powervs service instance.

0 commit comments

Comments
 (0)