Skip to content

Commit 4a5cd42

Browse files
authored
Merge pull request kubernetes-sigs#1984 from shiftstack/v1alpha5panics
🐛 Add fuzz tests for v1alpha5 conversion
2 parents de29a18 + 3cea05d commit 4a5cd42

File tree

2 files changed

+79
-1
lines changed

2 files changed

+79
-1
lines changed

api/v1alpha5/conversion.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@ func Convert_v1alpha5_Instance_To_v1beta1_BastionStatus(in *Instance, out *infra
456456
out.State = infrav1.InstanceState(in.State)
457457
out.IP = in.IP
458458
out.FloatingIP = in.FloatingIP
459+
460+
if out.Resolved == nil {
461+
out.Resolved = &infrav1.ResolvedMachineSpec{}
462+
}
459463
out.Resolved.ServerGroupID = in.ServerGroupID
460464
return nil
461465
}
@@ -468,7 +472,9 @@ func Convert_v1beta1_BastionStatus_To_v1alpha5_Instance(in *infrav1.BastionStatu
468472
out.State = InstanceState(in.State)
469473
out.IP = in.IP
470474
out.FloatingIP = in.FloatingIP
471-
out.ServerGroupID = in.Resolved.ServerGroupID
475+
if in.Resolved != nil {
476+
out.ServerGroupID = in.Resolved.ServerGroupID
477+
}
472478
return nil
473479
}
474480

api/v1alpha5/conversion_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,20 @@ limitations under the License.
1717
package v1alpha5
1818

1919
import (
20+
"runtime/debug"
2021
"testing"
2122

2223
"github.com/onsi/gomega"
24+
"github.com/onsi/gomega/format"
2325
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2426
runtime "k8s.io/apimachinery/pkg/runtime"
27+
runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer"
28+
"k8s.io/client-go/kubernetes/scheme"
29+
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
2530
ctrlconversion "sigs.k8s.io/controller-runtime/pkg/conversion"
2631

2732
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta1"
33+
testhelpers "sigs.k8s.io/cluster-api-provider-openstack/test/helpers"
2834
)
2935

3036
func TestConvertFrom(t *testing.T) {
@@ -165,3 +171,69 @@ func TestConvert_v1alpha5_OpenStackClusterSpec_To_v1beta1_OpenStackClusterSpec(t
165171
})
166172
}
167173
}
174+
175+
type convertiblePointer[T any] interface {
176+
ctrlconversion.Convertible
177+
*T
178+
}
179+
180+
type hubPointer[T any] interface {
181+
ctrlconversion.Hub
182+
*T
183+
}
184+
185+
func test_ObjectConvert[SP convertiblePointer[S], HP hubPointer[H], S, H any](tb testing.TB) {
186+
tb.Helper()
187+
188+
fuzzerFuncs := func(_ runtimeserializer.CodecFactory) []interface{} {
189+
return testhelpers.InfraV1FuzzerFuncs()
190+
}
191+
f := utilconversion.GetFuzzer(scheme.Scheme, fuzzerFuncs)
192+
g := gomega.NewWithT(tb)
193+
194+
for i := 0; i < 10000; i++ {
195+
var hub HP = new(H)
196+
f.Fuzz(hub)
197+
var spoke SP = new(S)
198+
199+
func() {
200+
defer func() {
201+
if r := recover(); r != nil {
202+
tb.Errorf("PANIC! Down-converting:\n%s\n%s", format.Object(hub, 1), debug.Stack())
203+
tb.FailNow()
204+
}
205+
}()
206+
g.Expect(spoke.ConvertFrom(hub)).To(gomega.Succeed())
207+
}()
208+
209+
spoke = new(S)
210+
f.Fuzz(spoke)
211+
hub = new(H)
212+
213+
func() {
214+
defer func() {
215+
if r := recover(); r != nil {
216+
tb.Errorf("PANIC! Up-converting:\n%s\n%s", format.Object(spoke, 1), debug.Stack())
217+
tb.FailNow()
218+
}
219+
}()
220+
g.Expect(spoke.ConvertTo(hub)).To(gomega.Succeed())
221+
}()
222+
}
223+
}
224+
225+
func Test_OpenStackClusterConvert(t *testing.T) {
226+
test_ObjectConvert[*OpenStackCluster, *infrav1.OpenStackCluster](t)
227+
}
228+
229+
func Test_OpenStackClusterTemplate(t *testing.T) {
230+
test_ObjectConvert[*OpenStackClusterTemplate, *infrav1.OpenStackClusterTemplate](t)
231+
}
232+
233+
func Test_OpenStackMachineConvert(t *testing.T) {
234+
test_ObjectConvert[*OpenStackMachine, *infrav1.OpenStackMachine](t)
235+
}
236+
237+
func Test_OpenStackMachineTemplateConvert(t *testing.T) {
238+
test_ObjectConvert[*OpenStackMachineTemplate, *infrav1.OpenStackMachineTemplate](t)
239+
}

0 commit comments

Comments
 (0)