Skip to content

Commit a3caf3b

Browse files
mdboothMaysaMacedo
authored andcommitted
Dual-stack: ensure fuzzer tests multiple subnets
1 parent 45672e1 commit a3caf3b

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

api/v1alpha6/conversion.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ func restorev1alpha8Bastion(previous **infrav1.Bastion, dst **infrav1.Bastion) {
7575
}
7676
}
7777

78+
func restorev1alpha8Subnets(previous *[]infrav1.SubnetFilter, dst *[]infrav1.SubnetFilter) {
79+
if len(*previous) > 1 {
80+
*dst = append(*dst, (*previous)[1:]...)
81+
}
82+
}
83+
7884
func restorev1alpha8ClusterStatus(previous *infrav1.OpenStackClusterStatus, dst *infrav1.OpenStackClusterStatus) {
7985
// It's (theoretically) possible in v1alpha8 to have Network nil but
8086
// Router or APIServerLoadBalancer not nil. In hub-spoke-hub conversion this will
@@ -154,6 +160,12 @@ var v1alpha8OpenStackClusterRestorer = conversion.RestorerFor[*infrav1.OpenStack
154160
},
155161
restorev1alpha8Bastion,
156162
),
163+
"subnets": conversion.HashedFieldRestorer(
164+
func(c *infrav1.OpenStackCluster) *[]infrav1.SubnetFilter {
165+
return &c.Spec.Subnets
166+
},
167+
restorev1alpha8Subnets,
168+
),
157169
"status": conversion.HashedFieldRestorer(
158170
func(c *infrav1.OpenStackCluster) *infrav1.OpenStackClusterStatus {
159171
return &c.Status
@@ -234,6 +246,12 @@ var v1alpha8OpenStackClusterTemplateRestorer = conversion.RestorerFor[*infrav1.O
234246
},
235247
restorev1alpha8Bastion,
236248
),
249+
"subnets": conversion.HashedFieldRestorer(
250+
func(c *infrav1.OpenStackClusterTemplate) *[]infrav1.SubnetFilter {
251+
return &c.Spec.Template.Spec.Subnets
252+
},
253+
restorev1alpha8Subnets,
254+
),
237255
}
238256

239257
func (r *OpenStackClusterTemplate) ConvertTo(dstRaw ctrlconversion.Hub) error {

api/v1alpha6/conversion_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ func TestFuzzyConversion(t *testing.T) {
8888
status.ExternalNetwork.APIServerLoadBalancer = nil
8989
}
9090
},
91+
92+
func(spec *infrav1.OpenStackClusterSpec, c fuzz.Continue) {
93+
c.FuzzNoCustom(spec)
94+
95+
// The fuzzer only seems to generate Subnets of
96+
// length 1, but we need to also test length 2.
97+
// Ensure it is occasionally generated.
98+
if len(spec.Subnets) == 1 && c.RandBool() {
99+
subnet := infrav1.SubnetFilter{}
100+
c.FuzzNoCustom(&subnet)
101+
spec.Subnets = append(spec.Subnets, subnet)
102+
}
103+
},
91104
}
92105
}
93106

@@ -119,35 +132,43 @@ func TestFuzzyConversion(t *testing.T) {
119132
Hub: &infrav1.OpenStackClusterTemplate{},
120133
Spoke: &OpenStackClusterTemplate{},
121134
HubAfterMutation: ignoreDataAnnotation,
135+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
122136
},
137+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
123138
})))
124139

125140
t.Run("for OpenStackMachine", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
126141
Hub: &infrav1.OpenStackMachine{},
127142
Spoke: &OpenStackMachine{},
128143
HubAfterMutation: ignoreDataAnnotation,
144+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
129145
})))
130146

131147
t.Run("for OpenStackMachine with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
132148
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
133149
Hub: &infrav1.OpenStackMachine{},
134150
Spoke: &OpenStackMachine{},
135151
HubAfterMutation: ignoreDataAnnotation,
152+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
136153
},
154+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
137155
})))
138156

139157
t.Run("for OpenStackMachineTemplate", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
140158
Hub: &infrav1.OpenStackMachineTemplate{},
141159
Spoke: &OpenStackMachineTemplate{},
142160
HubAfterMutation: ignoreDataAnnotation,
161+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
143162
})))
144163

145164
t.Run("for OpenStackMachineTemplate with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
146165
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
147166
Hub: &infrav1.OpenStackMachineTemplate{},
148167
Spoke: &OpenStackMachineTemplate{},
149168
HubAfterMutation: ignoreDataAnnotation,
169+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
150170
},
171+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
151172
})))
152173
}
153174

api/v1alpha7/conversion.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ func restorev1alpha8ClusterSpec(previous *infrav1.OpenStackClusterSpec, dst *inf
9797
dst.ExternalNetwork.NotTagsAny = previous.ExternalNetwork.NotTagsAny
9898

9999
dst.DisableExternalNetwork = previous.DisableExternalNetwork
100+
101+
if len(previous.Subnets) > 1 {
102+
dst.Subnets = append(dst.Subnets, previous.Subnets[1:]...)
103+
}
100104
}
101105

102106
func (r *OpenStackCluster) ConvertTo(dstRaw ctrlconversion.Hub) error {

api/v1alpha7/conversion_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@ package v1alpha7
1919
import (
2020
"testing"
2121

22+
fuzz "github.com/google/gofuzz"
2223
"github.com/onsi/gomega"
24+
"k8s.io/apimachinery/pkg/api/apitesting/fuzzer"
2325
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426
runtime "k8s.io/apimachinery/pkg/runtime"
27+
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
2528
"k8s.io/utils/pointer"
2629
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2730
"sigs.k8s.io/controller-runtime/pkg/conversion"
@@ -52,60 +55,89 @@ func TestFuzzyConversion(t *testing.T) {
5255
delete(obj.GetAnnotations(), utilconversion.DataAnnotation)
5356
}
5457

58+
fuzzerFuncs := func(_ runtimeserializer.CodecFactory) []interface{} {
59+
return []interface{}{
60+
func(spec *infrav1.OpenStackClusterSpec, c fuzz.Continue) {
61+
c.FuzzNoCustom(spec)
62+
63+
// The fuzzer only seems to generate Subnets of
64+
// length 1, but we need to also test length 2.
65+
// Ensure it is occasionally generated.
66+
if len(spec.Subnets) == 1 && c.RandBool() {
67+
subnet := infrav1.SubnetFilter{}
68+
c.FuzzNoCustom(&subnet)
69+
spec.Subnets = append(spec.Subnets, subnet)
70+
}
71+
},
72+
}
73+
}
74+
5575
t.Run("for OpenStackCluster", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
5676
Hub: &infrav1.OpenStackCluster{},
5777
Spoke: &OpenStackCluster{},
5878
HubAfterMutation: ignoreDataAnnotation,
79+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
5980
})))
6081

6182
t.Run("for OpenStackCluster with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
6283
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
6384
Hub: &infrav1.OpenStackCluster{},
6485
Spoke: &OpenStackCluster{},
6586
HubAfterMutation: ignoreDataAnnotation,
87+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
6688
},
89+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
6790
})))
6891

6992
t.Run("for OpenStackClusterTemplate", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
7093
Hub: &infrav1.OpenStackClusterTemplate{},
7194
Spoke: &OpenStackClusterTemplate{},
7295
HubAfterMutation: ignoreDataAnnotation,
96+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
7397
})))
7498

7599
t.Run("for OpenStackClusterTemplate with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
76100
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
77101
Hub: &infrav1.OpenStackClusterTemplate{},
78102
Spoke: &OpenStackClusterTemplate{},
79103
HubAfterMutation: ignoreDataAnnotation,
104+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
80105
},
106+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
81107
})))
82108

83109
t.Run("for OpenStackMachine", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
84110
Hub: &infrav1.OpenStackMachine{},
85111
Spoke: &OpenStackMachine{},
86112
HubAfterMutation: ignoreDataAnnotation,
113+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
87114
})))
88115

89116
t.Run("for OpenStackMachine with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
90117
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
91118
Hub: &infrav1.OpenStackMachine{},
92119
Spoke: &OpenStackMachine{},
93120
HubAfterMutation: ignoreDataAnnotation,
121+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
94122
},
123+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
95124
})))
96125

97126
t.Run("for OpenStackMachineTemplate", runParallel(utilconversion.FuzzTestFunc(utilconversion.FuzzTestFuncInput{
98127
Hub: &infrav1.OpenStackMachineTemplate{},
99128
Spoke: &OpenStackMachineTemplate{},
100129
HubAfterMutation: ignoreDataAnnotation,
130+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
101131
})))
102132

103133
t.Run("for OpenStackMachineTemplate with mutate", runParallel(testhelpers.FuzzMutateTestFunc(testhelpers.FuzzMutateTestFuncInput{
104134
FuzzTestFuncInput: utilconversion.FuzzTestFuncInput{
105135
Hub: &infrav1.OpenStackMachineTemplate{},
106136
Spoke: &OpenStackMachineTemplate{},
107137
HubAfterMutation: ignoreDataAnnotation,
138+
FuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
108139
},
140+
MutateFuzzerFuncs: []fuzzer.FuzzerFuncs{fuzzerFuncs},
109141
})))
110142
}
111143

0 commit comments

Comments
 (0)