Skip to content

Commit f90ddda

Browse files
authored
Merge pull request #1789 from shiftstack/experimenting-dualstack
✨ Support BYO dual-stack Network
2 parents 4182e2d + 2ef8ee5 commit f90ddda

20 files changed

+543
-98
lines changed

api/v1alpha5/conversion.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ func Convert_v1alpha8_OpenStackClusterSpec_To_v1alpha5_OpenStackClusterSpec(in *
196196
out.ExternalNetworkID = in.ExternalNetwork.ID
197197
}
198198

199+
if in.Subnets != nil {
200+
if len(in.Subnets) >= 1 {
201+
if err := Convert_v1alpha8_SubnetFilter_To_v1alpha5_SubnetFilter(&in.Subnets[0], &out.Subnet, s); err != nil {
202+
return err
203+
}
204+
}
205+
}
206+
199207
return nil
200208
}
201209

@@ -211,6 +219,15 @@ func Convert_v1alpha5_OpenStackClusterSpec_To_v1alpha8_OpenStackClusterSpec(in *
211219
}
212220
}
213221

222+
emptySubnet := SubnetFilter{}
223+
if in.Subnet != emptySubnet {
224+
subnet := infrav1.SubnetFilter{}
225+
if err := Convert_v1alpha5_SubnetFilter_To_v1alpha8_SubnetFilter(&in.Subnet, &subnet, s); err != nil {
226+
return err
227+
}
228+
out.Subnets = []infrav1.SubnetFilter{subnet}
229+
}
230+
214231
return nil
215232
}
216233

api/v1alpha5/conversion_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestConvertFrom(t *testing.T) {
4949
Spec: OpenStackClusterSpec{},
5050
ObjectMeta: metav1.ObjectMeta{
5151
Annotations: map[string]string{
52-
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"allowAllInClusterTraffic\":false,\"apiServerLoadBalancer\":{},\"cloudName\":\"\",\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"managedSecurityGroups\":false,\"network\":{},\"subnet\":{}},\"status\":{\"ready\":false}}",
52+
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"allowAllInClusterTraffic\":false,\"apiServerLoadBalancer\":{},\"cloudName\":\"\",\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"managedSecurityGroups\":false,\"network\":{}},\"status\":{\"ready\":false}}",
5353
},
5454
},
5555
},
@@ -64,7 +64,7 @@ func TestConvertFrom(t *testing.T) {
6464
Spec: OpenStackClusterTemplateSpec{},
6565
ObjectMeta: metav1.ObjectMeta{
6666
Annotations: map[string]string{
67-
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"template\":{\"spec\":{\"allowAllInClusterTraffic\":false,\"apiServerLoadBalancer\":{},\"cloudName\":\"\",\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"managedSecurityGroups\":false,\"network\":{},\"subnet\":{}}}}}",
67+
"cluster.x-k8s.io/conversion-data": "{\"spec\":{\"template\":{\"spec\":{\"allowAllInClusterTraffic\":false,\"apiServerLoadBalancer\":{},\"cloudName\":\"\",\"controlPlaneEndpoint\":{\"host\":\"\",\"port\":0},\"disableAPIServerFloatingIP\":false,\"disableExternalNetwork\":false,\"externalNetwork\":{},\"managedSecurityGroups\":false,\"network\":{}}}}}",
6868
},
6969
},
7070
},

api/v1alpha5/zz_generated.conversion.go

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

api/v1alpha6/conversion.go

Lines changed: 33 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 {
@@ -486,6 +504,12 @@ func Convert_v1alpha8_OpenStackClusterSpec_To_v1alpha6_OpenStackClusterSpec(in *
486504
out.ExternalNetworkID = in.ExternalNetwork.ID
487505
}
488506

507+
if len(in.Subnets) >= 1 {
508+
if err := Convert_v1alpha8_SubnetFilter_To_v1alpha6_SubnetFilter(&in.Subnets[0], &out.Subnet, s); err != nil {
509+
return err
510+
}
511+
}
512+
489513
return nil
490514
}
491515

@@ -501,6 +525,15 @@ func Convert_v1alpha6_OpenStackClusterSpec_To_v1alpha8_OpenStackClusterSpec(in *
501525
}
502526
}
503527

528+
emptySubnet := SubnetFilter{}
529+
if in.Subnet != emptySubnet {
530+
subnet := infrav1.SubnetFilter{}
531+
if err := Convert_v1alpha6_SubnetFilter_To_v1alpha8_SubnetFilter(&in.Subnet, &subnet, s); err != nil {
532+
return err
533+
}
534+
out.Subnets = []infrav1.SubnetFilter{subnet}
535+
}
536+
504537
return nil
505538
}
506539

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/v1alpha6/zz_generated.conversion.go

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

api/v1alpha7/conversion.go

Lines changed: 19 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 {
@@ -383,6 +387,15 @@ func Convert_v1alpha7_OpenStackClusterSpec_To_v1alpha8_OpenStackClusterSpec(in *
383387
}
384388
}
385389

390+
emptySubnet := SubnetFilter{}
391+
if in.Subnet != emptySubnet {
392+
subnet := infrav1.SubnetFilter{}
393+
if err := Convert_v1alpha7_SubnetFilter_To_v1alpha8_SubnetFilter(&in.Subnet, &subnet, s); err != nil {
394+
return err
395+
}
396+
out.Subnets = []infrav1.SubnetFilter{subnet}
397+
}
398+
386399
return nil
387400
}
388401

@@ -396,5 +409,11 @@ func Convert_v1alpha8_OpenStackClusterSpec_To_v1alpha7_OpenStackClusterSpec(in *
396409
out.ExternalNetworkID = in.ExternalNetwork.ID
397410
}
398411

412+
if len(in.Subnets) >= 1 {
413+
if err := Convert_v1alpha8_SubnetFilter_To_v1alpha7_SubnetFilter(&in.Subnets[0], &out.Subnet, s); err != nil {
414+
return err
415+
}
416+
}
417+
399418
return nil
400419
}

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

api/v1alpha7/zz_generated.conversion.go

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

0 commit comments

Comments
 (0)