Skip to content

Commit b0c5116

Browse files
committed
Improve logging and error handling
1 parent 89f4029 commit b0c5116

File tree

70 files changed

+1154
-1620
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+1154
-1620
lines changed

controllers/clustermodule_reconciler.go

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -65,47 +65,50 @@ func NewReconciler(controllerManagerCtx *capvcontext.ControllerManagerContext) R
6565

6666
func (r Reconciler) Reconcile(ctx context.Context, clusterCtx *capvcontext.ClusterContext) (reconcile.Result, error) {
6767
log := ctrl.LoggerFrom(ctx)
68-
log.Info("Reconciling cluster modules")
6968

7069
if !clustermodule.IsClusterCompatible(clusterCtx) {
7170
conditions.MarkFalse(clusterCtx.VSphereCluster, infrav1.ClusterModulesAvailableCondition, infrav1.VCenterVersionIncompatibleReason, clusterv1.ConditionSeverityInfo,
72-
"vCenter API version %s is not compatible with cluster modules", clusterCtx.VSphereCluster.Status.VCenterVersion)
73-
log.Info("Cluster is not compatible for anti affinity (vCenter >= 7 required)",
74-
"vCenterVersion", clusterCtx.VSphereCluster.Status.VCenterVersion)
71+
"vCenter version %s does not support cluster modules", clusterCtx.VSphereCluster.Status.VCenterVersion)
72+
log.V(3).Info(fmt.Sprintf("vCenter version %s does not support cluster modules to implement anti affinity (vCenter >= 7 required)", clusterCtx.VSphereCluster.Status.VCenterVersion))
7573
return reconcile.Result{}, nil
7674
}
7775

7876
objectMap, err := r.fetchMachineOwnerObjects(ctx, clusterCtx)
7977
if err != nil {
80-
return reconcile.Result{}, err
78+
return reconcile.Result{}, errors.Wrapf(err, "failed to get Machine owner objects")
8179
}
8280

8381
modErrs := []clusterModError{}
8482

8583
clusterModuleSpecs := []infrav1.ClusterModule{}
8684
for _, mod := range clusterCtx.VSphereCluster.Spec.ClusterModules {
8785
// Note: We have to use := here to not overwrite log & ctx outside the for loop.
88-
log := log.WithValues("targetObjectName", mod.TargetObjectName, "moduleUUID", mod.ModuleUUID)
86+
log := log
87+
// It is safe to infer KubeadmControlPlane or MachineDeployment from .ControlPlane as modules
88+
// are only implemented for these types.
89+
if mod.ControlPlane {
90+
log = log.WithValues("KubeadmControlPlane", klog.KRef(clusterCtx.VSphereCluster.Namespace, mod.TargetObjectName), "moduleUUID", mod.ModuleUUID)
91+
} else {
92+
log = log.WithValues("MachineDeployment", klog.KRef(clusterCtx.VSphereCluster.Namespace, mod.TargetObjectName), "moduleUUID", mod.ModuleUUID)
93+
}
8994
ctx := ctrl.LoggerInto(ctx, log)
9095

9196
curr := mod.TargetObjectName
9297
if mod.ControlPlane {
9398
curr = appendKCPKey(curr)
9499
}
95100
if obj, ok := objectMap[curr]; !ok {
96-
// delete the cluster module as the object is marked for deletion
97-
// or already deleted.
101+
// Delete the cluster module as the object is marked for deletion or already deleted.
98102
if err := r.ClusterModuleService.Remove(ctx, clusterCtx, mod.ModuleUUID); err != nil {
99-
log.Error(err, "failed to delete cluster module for object")
103+
log.Error(err, "Failed to delete cluster module for object")
100104
}
101105
delete(objectMap, curr)
102106
} else {
103-
// verify the cluster module
107+
// Verify the cluster module
104108
exists, err := r.ClusterModuleService.DoesExist(ctx, clusterCtx, obj, mod.ModuleUUID)
105109
if err != nil {
106-
// Add the error to modErrs so it gets handled below.
107-
modErrs = append(modErrs, clusterModError{obj.GetName(), errors.Wrapf(err, "failed to verify cluster module %q", mod.ModuleUUID)})
108-
log.Error(err, "failed to verify cluster module for object")
110+
modErrs = append(modErrs, clusterModError{obj.GetName(), errors.Wrapf(err, "failed to check if cluster module %q exists", mod.ModuleUUID)})
111+
log.Error(err, "Failed to check if cluster module for object exists")
109112
// Append the module and remove it from objectMap to not create new ones instead.
110113
clusterModuleSpecs = append(clusterModuleSpecs, infrav1.ClusterModule{
111114
ControlPlane: obj.IsControlPlane(),
@@ -116,7 +119,7 @@ func (r Reconciler) Reconcile(ctx context.Context, clusterCtx *capvcontext.Clust
116119
continue
117120
}
118121

119-
// append the module and object info to the VSphereCluster object
122+
// Append the module and object info to the VSphereCluster object
120123
// and remove it from the object map since no new cluster module
121124
// needs to be created.
122125
if exists {
@@ -127,16 +130,20 @@ func (r Reconciler) Reconcile(ctx context.Context, clusterCtx *capvcontext.Clust
127130
})
128131
delete(objectMap, curr)
129132
} else {
130-
log.Info("module for object not found")
133+
log.V(4).Info("Module for object not found (will be created)")
131134
}
132135
}
133136
}
134137

135138
for _, obj := range objectMap {
139+
// Note: We have to use := here to create a new variable and not overwrite log & ctx outside the for loop.
140+
log := log.WithValues(obj.GetObjectKind().GroupVersionKind().Kind, klog.KObj(obj))
141+
ctx := ctrl.LoggerInto(ctx, log)
142+
136143
moduleUUID, err := r.ClusterModuleService.Create(ctx, clusterCtx, obj)
137144
if err != nil {
138-
log.Error(err, "failed to create cluster module for target object", "targetObjectName", obj.GetName())
139-
modErrs = append(modErrs, clusterModError{obj.GetName(), err})
145+
modErrs = append(modErrs, clusterModError{obj.GetName(), errors.Wrapf(err, "failed to create cluster module")})
146+
log.Error(err, "Failed to create cluster module for object")
140147
continue
141148
}
142149
// module creation was skipped
@@ -180,14 +187,14 @@ func (r Reconciler) toAffinityInput(ctx context.Context, obj client.Object) []re
180187
OwnerReferences: obj.GetOwnerReferences(),
181188
})
182189
if err != nil {
183-
log.Error(err, "failed to get owner cluster")
190+
log.V(4).Error(err, "Failed to get owner Cluster")
184191
return nil
185192
}
186193
log = log.WithValues("Cluster", klog.KObj(cluster))
187194
ctx = ctrl.LoggerInto(ctx, log)
188195

189196
if cluster.Spec.InfrastructureRef == nil {
190-
log.Error(err, "Cluster infrastructureRef not set. Requeueing")
197+
log.V(4).Error(err, "Failed to get VSphereCluster: Cluster.spec.infrastructureRef not set")
191198
return nil
192199
}
193200

@@ -199,7 +206,7 @@ func (r Reconciler) toAffinityInput(ctx context.Context, obj client.Object) []re
199206
Name: cluster.Spec.InfrastructureRef.Name,
200207
Namespace: cluster.Namespace,
201208
}, vsphereCluster); err != nil {
202-
log.Error(err, "Failed to get vSphereCluster object")
209+
log.V(4).Error(err, "Failed to get VSphereCluster")
203210
return nil
204211
}
205212

@@ -244,7 +251,7 @@ func (r Reconciler) fetchMachineOwnerObjects(ctx context.Context, clusterCtx *ca
244251

245252
name, ok := clusterCtx.VSphereCluster.GetLabels()[clusterv1.ClusterNameLabel]
246253
if !ok {
247-
return nil, errors.Errorf("missing CAPI cluster label")
254+
return nil, errors.Errorf("failed to get Cluster name from VSphereCluster: missing cluster name label")
248255
}
249256

250257
labels := map[string]string{clusterv1.ClusterNameLabel: name}
@@ -253,10 +260,10 @@ func (r Reconciler) fetchMachineOwnerObjects(ctx context.Context, clusterCtx *ca
253260
ctx, kcpList,
254261
client.InNamespace(clusterCtx.VSphereCluster.GetNamespace()),
255262
client.MatchingLabels(labels)); err != nil {
256-
return nil, errors.Wrapf(err, "failed to list control plane objects")
263+
return nil, errors.Wrapf(err, "failed to list KubeadmControlPlane objects")
257264
}
258265
if len(kcpList.Items) > 1 {
259-
return nil, errors.Errorf("multiple control plane objects found, expected 1, found %d", len(kcpList.Items))
266+
return nil, errors.Errorf("multiple KubeadmControlPlane objects found, expected 1, found %d", len(kcpList.Items))
260267
}
261268

262269
if len(kcpList.Items) != 0 {
@@ -270,7 +277,7 @@ func (r Reconciler) fetchMachineOwnerObjects(ctx context.Context, clusterCtx *ca
270277
ctx, mdList,
271278
client.InNamespace(clusterCtx.VSphereCluster.GetNamespace()),
272279
client.MatchingLabels(labels)); err != nil {
273-
return nil, errors.Wrapf(err, "failed to list machine deployment objects")
280+
return nil, errors.Wrapf(err, "failed to list MachineDeployment objects")
274281
}
275282
for _, md := range mdList.Items {
276283
if md.DeletionTimestamp.IsZero() {

controllers/clustermodule_reconciler_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -409,8 +409,8 @@ func TestReconciler_Reconcile(t *testing.T) {
409409
if tt.beforeFn != nil {
410410
tt.beforeFn(md)
411411
}
412-
controllerCtx := fake.NewControllerContext(fake.NewControllerManagerContext(kcp, md))
413-
clusterCtx := fake.NewClusterContext(ctx, controllerCtx)
412+
controllerManagerContext := fake.NewControllerManagerContext(kcp, md)
413+
clusterCtx := fake.NewClusterContext(ctx, controllerManagerContext)
414414
clusterCtx.VSphereCluster.Spec.ClusterModules = tt.clusterModules
415415
clusterCtx.VSphereCluster.Status = infrav1.VSphereClusterStatus{VCenterVersion: infrav1.NewVCenterVersion("7.0.0")}
416416

@@ -420,7 +420,7 @@ func TestReconciler_Reconcile(t *testing.T) {
420420
}
421421

422422
r := Reconciler{
423-
Client: controllerCtx.Client,
423+
Client: controllerManagerContext.Client,
424424
ClusterModuleService: svc,
425425
}
426426
_, err := r.Reconcile(ctx, clusterCtx)
@@ -485,9 +485,9 @@ func TestReconciler_fetchMachineOwnerObjects(t *testing.T) {
485485
for _, tt := range tests {
486486
t.Run(tt.name, func(t *testing.T) {
487487
g := gomega.NewWithT(t)
488-
controllerCtx := fake.NewControllerContext(fake.NewControllerManagerContext(tt.initObjs...))
489-
clusterCtx := fake.NewClusterContext(ctx, controllerCtx)
490-
r := Reconciler{Client: controllerCtx.Client}
488+
controllerManagerContext := fake.NewControllerManagerContext(tt.initObjs...)
489+
clusterCtx := fake.NewClusterContext(ctx, controllerManagerContext)
490+
r := Reconciler{Client: controllerManagerContext.Client}
491491
objMap, err := r.fetchMachineOwnerObjects(ctx, clusterCtx)
492492
if tt.hasError {
493493
g.Expect(err).To(gomega.HaveOccurred())
@@ -506,13 +506,13 @@ func TestReconciler_fetchMachineOwnerObjects(t *testing.T) {
506506
mdToBeDeleted := machineDeployment("foo-1", metav1.NamespaceDefault, fake.Clusterv1a2Name)
507507
mdToBeDeleted.DeletionTimestamp = &currTime
508508
mdToBeDeleted.ObjectMeta.Finalizers = append(mdToBeDeleted.ObjectMeta.Finalizers, "keep-this-for-the-test")
509-
controllerCtx := fake.NewControllerContext(fake.NewControllerManagerContext(
509+
controllerManagerContext := fake.NewControllerManagerContext(
510510
controlPlane("foo", metav1.NamespaceDefault, fake.Clusterv1a2Name),
511511
machineDeployment("foo", metav1.NamespaceDefault, fake.Clusterv1a2Name),
512512
mdToBeDeleted,
513-
))
514-
clusterCtx := fake.NewClusterContext(ctx, controllerCtx)
515-
objMap, err := Reconciler{Client: controllerCtx.Client}.fetchMachineOwnerObjects(ctx, clusterCtx)
513+
)
514+
clusterCtx := fake.NewClusterContext(ctx, controllerManagerContext)
515+
objMap, err := Reconciler{Client: controllerManagerContext.Client}.fetchMachineOwnerObjects(ctx, clusterCtx)
516516
g.Expect(err).NotTo(gomega.HaveOccurred())
517517
g.Expect(objMap).To(gomega.HaveLen(2))
518518
})

controllers/controllers_suite_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ func setup() {
9393
panic(fmt.Sprintf("unable to create ClusterCacheReconciler controller: %v", err))
9494
}
9595

96-
if err := AddClusterControllerToManager(ctx, testEnv.GetControllerManagerContext(), testEnv.Manager, &infrav1.VSphereCluster{}, controllerOpts); err != nil {
96+
if err := AddClusterControllerToManager(ctx, testEnv.GetControllerManagerContext(), testEnv.Manager, false, controllerOpts); err != nil {
9797
panic(fmt.Sprintf("unable to setup VsphereCluster controller: %v", err))
9898
}
99-
if err := AddMachineControllerToManager(ctx, testEnv.GetControllerManagerContext(), testEnv.Manager, &infrav1.VSphereMachine{}, controllerOpts); err != nil {
99+
if err := AddMachineControllerToManager(ctx, testEnv.GetControllerManagerContext(), testEnv.Manager, false, controllerOpts); err != nil {
100100
panic(fmt.Sprintf("unable to setup VsphereMachine controller: %v", err))
101101
}
102102
if err := AddVMControllerToManager(ctx, testEnv.GetControllerManagerContext(), testEnv.Manager, tracker, controllerOpts); err != nil {

0 commit comments

Comments
 (0)