Skip to content

Commit 4dfb47b

Browse files
authored
Merge pull request #2303 from killianmuldoon/pr-fix-vspherevm-nil
🐛 Fix nil pointer error in retrieveVcenterSession
2 parents 61d0956 + 9ded617 commit 4dfb47b

File tree

2 files changed

+68
-33
lines changed

2 files changed

+68
-33
lines changed

controllers/vspherevm_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
apierrors "k8s.io/apimachinery/pkg/api/errors"
2929
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3030
apitypes "k8s.io/apimachinery/pkg/types"
31+
"k8s.io/klog/v2"
3132
"k8s.io/utils/pointer"
3233
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3334
"sigs.k8s.io/cluster-api/controllers/remote"
@@ -569,6 +570,9 @@ func (r vmReconciler) retrieveVcenterSession(ctx goctx.Context, vsphereVM *infra
569570
params)
570571
}
571572

573+
if cluster.Spec.InfrastructureRef == nil {
574+
return nil, errors.Errorf("cannot retrieve vCenter session for cluster %s: .spec.infrastructureRef is nil", klog.KObj(cluster))
575+
}
572576
key := ctrlclient.ObjectKey{
573577
Namespace: cluster.Namespace,
574578
Name: cluster.Spec.InfrastructureRef.Name,

controllers/vspherevm_controller_test.go

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -420,18 +420,6 @@ func TestRetrievingVCenterCredentialsFromCluster(t *testing.T) {
420420
},
421421
}
422422

423-
cluster := &clusterv1.Cluster{
424-
ObjectMeta: metav1.ObjectMeta{
425-
Name: "valid-cluster",
426-
Namespace: "test",
427-
},
428-
Spec: clusterv1.ClusterSpec{
429-
InfrastructureRef: &corev1.ObjectReference{
430-
Name: vsphereCluster.Name,
431-
},
432-
},
433-
}
434-
435423
machine := &clusterv1.Machine{
436424
ObjectMeta: metav1.ObjectMeta{
437425
Name: "foo",
@@ -442,8 +430,6 @@ func TestRetrievingVCenterCredentialsFromCluster(t *testing.T) {
442430
},
443431
}
444432

445-
initObjs := createMachineOwnerHierarchy(machine)
446-
447433
vsphereMachine := &infrav1.VSphereMachine{
448434
ObjectMeta: metav1.ObjectMeta{
449435
Name: "foo-vm",
@@ -480,26 +466,71 @@ func TestRetrievingVCenterCredentialsFromCluster(t *testing.T) {
480466
Status: infrav1.VSphereVMStatus{},
481467
}
482468

483-
initObjs = append(initObjs, secret, vsphereVM, vsphereMachine, machine, cluster, vsphereCluster)
484-
controllerMgrContext := fake.NewControllerManagerContext(initObjs...)
469+
t.Run("Retrieve credentials from cluster", func(t *testing.T) {
470+
cluster := &clusterv1.Cluster{
471+
ObjectMeta: metav1.ObjectMeta{
472+
Name: "valid-cluster",
473+
Namespace: "test",
474+
},
475+
Spec: clusterv1.ClusterSpec{
476+
InfrastructureRef: &corev1.ObjectReference{
477+
Name: vsphereCluster.Name,
478+
},
479+
},
480+
}
485481

486-
controllerContext := &context.ControllerContext{
487-
ControllerManagerContext: controllerMgrContext,
488-
Recorder: record.New(apirecord.NewFakeRecorder(100)),
489-
Logger: log.Log,
490-
}
491-
r := vmReconciler{ControllerContext: controllerContext}
492-
493-
_, err = r.Reconcile(goctx.Background(), ctrl.Request{NamespacedName: util.ObjectKey(vsphereVM)})
494-
g := NewWithT(t)
495-
g.Expect(err).NotTo(HaveOccurred())
496-
497-
vm := &infrav1.VSphereVM{}
498-
vmKey := util.ObjectKey(vsphereVM)
499-
g.Expect(r.Client.Get(goctx.Background(), vmKey, vm)).NotTo(HaveOccurred())
500-
g.Expect(conditions.Has(vm, infrav1.VCenterAvailableCondition)).To(BeTrue())
501-
vCenterCondition := conditions.Get(vm, infrav1.VCenterAvailableCondition)
502-
g.Expect(vCenterCondition.Status).To(Equal(corev1.ConditionTrue))
482+
initObjs := createMachineOwnerHierarchy(machine)
483+
initObjs = append(initObjs, secret, vsphereVM, vsphereMachine, machine, cluster, vsphereCluster)
484+
controllerMgrContext := fake.NewControllerManagerContext(initObjs...)
485+
486+
controllerContext := &context.ControllerContext{
487+
ControllerManagerContext: controllerMgrContext,
488+
Recorder: record.New(apirecord.NewFakeRecorder(100)),
489+
Logger: log.Log,
490+
}
491+
r := vmReconciler{ControllerContext: controllerContext}
492+
493+
_, err = r.Reconcile(goctx.Background(), ctrl.Request{NamespacedName: util.ObjectKey(vsphereVM)})
494+
g := NewWithT(t)
495+
g.Expect(err).NotTo(HaveOccurred())
496+
497+
vm := &infrav1.VSphereVM{}
498+
vmKey := util.ObjectKey(vsphereVM)
499+
g.Expect(r.Client.Get(goctx.Background(), vmKey, vm)).NotTo(HaveOccurred())
500+
g.Expect(conditions.Has(vm, infrav1.VCenterAvailableCondition)).To(BeTrue())
501+
vCenterCondition := conditions.Get(vm, infrav1.VCenterAvailableCondition)
502+
g.Expect(vCenterCondition.Status).To(Equal(corev1.ConditionTrue))
503+
},
504+
)
505+
506+
t.Run("Error if cluster infrastructureRef is nil", func(t *testing.T) {
507+
cluster := &clusterv1.Cluster{
508+
ObjectMeta: metav1.ObjectMeta{
509+
Name: "valid-cluster",
510+
Namespace: "test",
511+
},
512+
513+
// InfrastructureRef is nil so we should get an error.
514+
Spec: clusterv1.ClusterSpec{
515+
InfrastructureRef: nil,
516+
},
517+
}
518+
initObjs := createMachineOwnerHierarchy(machine)
519+
initObjs = append(initObjs, secret, vsphereVM, vsphereMachine, machine, cluster, vsphereCluster)
520+
controllerMgrContext := fake.NewControllerManagerContext(initObjs...)
521+
522+
controllerContext := &context.ControllerContext{
523+
ControllerManagerContext: controllerMgrContext,
524+
Recorder: record.New(apirecord.NewFakeRecorder(100)),
525+
Logger: log.Log,
526+
}
527+
r := vmReconciler{ControllerContext: controllerContext}
528+
529+
_, err = r.Reconcile(goctx.Background(), ctrl.Request{NamespacedName: util.ObjectKey(vsphereVM)})
530+
g := NewWithT(t)
531+
g.Expect(err).To(HaveOccurred())
532+
},
533+
)
503534
}
504535

505536
func Test_reconcile(t *testing.T) {

0 commit comments

Comments
 (0)