Skip to content

Commit a08556f

Browse files
committed
Improve controller manager logs
This now makes use of the tooling provided by upstream controller-runtime and component-base/logs. As a consequence, the manager now takes a standard set of flags to configure logging. The default logging format is configured to json, it's the direction upstream is going duwe to its tooling support. For tilt, using text for now until we provide better tooling to analyze the logs. Instead of injecting a logger in the reconciler on construction, we now use contextual logging. The benefit here is controller-runtime will inject a default set of values that uniquely identify the reconcile request.
1 parent 316a703 commit a08556f

15 files changed

+261
-210
lines changed

config/tilt/kustomization.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,12 @@ resources:
66
images:
77
- name: controller
88
newName: eks-a-controller-manager
9+
10+
patches:
11+
- patch: |-
12+
- op: add
13+
path: /spec/template/spec/containers/0/args/-
14+
value: --logging-format=text
15+
target:
16+
kind: Deployment
17+
name: eksa-controller-manager

controllers/cluster_controller.go

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,24 @@ const (
3535
// ClusterReconciler reconciles a Cluster object.
3636
type ClusterReconciler struct {
3737
client client.Client
38-
log logr.Logger
3938
providerReconcilerRegistry ProviderClusterReconcilerRegistry
4039
}
4140

4241
type ProviderClusterReconcilerRegistry interface {
4342
Get(datacenterKind string) clusters.ProviderClusterReconciler
4443
}
4544

46-
func NewClusterReconciler(client client.Client, log logr.Logger, registry ProviderClusterReconcilerRegistry) *ClusterReconciler {
45+
// NewClusterReconciler constructs a new ClusterReconciler.
46+
func NewClusterReconciler(client client.Client, registry ProviderClusterReconcilerRegistry) *ClusterReconciler {
4747
return &ClusterReconciler{
4848
client: client,
49-
log: log,
5049
providerReconcilerRegistry: registry,
5150
}
5251
}
5352

5453
// SetupWithManager sets up the controller with the Manager.
55-
func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
56-
childObjectHandler := handlers.ChildObjectToClusters(r.log)
54+
func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager, log logr.Logger) error {
55+
childObjectHandler := handlers.ChildObjectToClusters(log)
5756

5857
return ctrl.NewControllerManagedBy(mgr).
5958
For(&anywherev1.Cluster{}).
@@ -104,10 +103,10 @@ func (r *ClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
104103
// +kubebuilder:rbac:groups=distro.eks.amazonaws.com,resources=releases,verbs=get;list;watch
105104
// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=awssnowclusters;awssnowmachinetemplates;vsphereclusters;vspheremachinetemplates,verbs=get;list;watch;create;update;patch;delete
106105
func (r *ClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
107-
log := r.log.WithValues("cluster", req.NamespacedName)
106+
log := ctrl.LoggerFrom(ctx)
108107
// Fetch the Cluster object
109108
cluster := &anywherev1.Cluster{}
110-
log.Info("Reconciling cluster", "name", req.NamespacedName)
109+
log.Info("Reconciling cluster")
111110
if err := r.client.Get(ctx, req.NamespacedName, cluster); err != nil {
112111
if apierrors.IsNotFound(err) {
113112
return reconcile.Result{}, nil
@@ -133,7 +132,7 @@ func (r *ClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_
133132
controllerutil.AddFinalizer(cluster, clusterFinalizerName)
134133
}
135134
} else {
136-
return r.reconcileDelete(ctx, cluster)
135+
return r.reconcileDelete(ctx, log, cluster)
137136
}
138137

139138
// If the cluster is paused, return without any further processing.
@@ -152,10 +151,10 @@ func (r *ClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_
152151
return ctrl.Result{}, err
153152
}
154153

155-
return r.reconcile(ctx, cluster, log)
154+
return r.reconcile(ctx, log, cluster)
156155
}
157156

158-
func (r *ClusterReconciler) reconcile(ctx context.Context, cluster *anywherev1.Cluster, log logr.Logger) (ctrl.Result, error) {
157+
func (r *ClusterReconciler) reconcile(ctx context.Context, log logr.Logger, cluster *anywherev1.Cluster) (ctrl.Result, error) {
159158
clusterProviderReconciler := r.providerReconcilerRegistry.Get(cluster.Spec.DatacenterRef.Kind)
160159

161160
var reconcileResult controller.Result
@@ -173,26 +172,26 @@ func (r *ClusterReconciler) reconcile(ctx context.Context, cluster *anywherev1.C
173172
return reconcileResult.ToCtrlResult(), nil
174173
}
175174

176-
func (r *ClusterReconciler) reconcileDelete(ctx context.Context, cluster *anywherev1.Cluster) (ctrl.Result, error) {
175+
func (r *ClusterReconciler) reconcileDelete(ctx context.Context, log logr.Logger, cluster *anywherev1.Cluster) (ctrl.Result, error) {
177176
if cluster.IsSelfManaged() {
178177
return ctrl.Result{}, errors.New("deleting self-managed clusters is not supported")
179178
}
180179

181180
capiCluster := &clusterv1.Cluster{}
182181
capiClusterName := types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: cluster.Name}
183-
r.log.Info("Deleting", "name", cluster.Name)
182+
log.Info("Deleting", "name", cluster.Name)
184183
err := r.client.Get(ctx, capiClusterName, capiCluster)
185184

186185
switch {
187186
case err == nil:
188-
r.log.Info("Deleting CAPI cluster", "name", capiCluster.Name)
187+
log.Info("Deleting CAPI cluster", "name", capiCluster.Name)
189188
if err := r.client.Delete(ctx, capiCluster); err != nil {
190-
r.log.Info("Error deleting CAPI cluster", "name", capiCluster.Name)
189+
log.Info("Error deleting CAPI cluster", "name", capiCluster.Name)
191190
return ctrl.Result{}, err
192191
}
193192
return ctrl.Result{RequeueAfter: defaultRequeueTime}, nil
194193
case apierrors.IsNotFound(err):
195-
r.log.Info("Deleting EKS Anywhere cluster", "name", capiCluster.Name, "cluster.DeletionTimestamp", cluster.DeletionTimestamp, "finalizer", cluster.Finalizers)
194+
log.Info("Deleting EKS Anywhere cluster", "name", capiCluster.Name, "cluster.DeletionTimestamp", cluster.DeletionTimestamp, "finalizer", cluster.Finalizers)
196195

197196
// TODO delete GitOps,Datacenter and MachineConfig objects
198197
controllerutil.RemoveFinalizer(cluster, clusterFinalizerName)

controllers/cluster_controller_test.go

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77
"time"
88

9+
"github.com/go-logr/logr"
910
"github.com/golang/mock/gomock"
1011
. "github.com/onsi/gomega"
1112
apiv1 "k8s.io/api/core/v1"
@@ -17,11 +18,9 @@ import (
1718
"sigs.k8s.io/controller-runtime/pkg/client"
1819
"sigs.k8s.io/controller-runtime/pkg/client/fake"
1920
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
20-
logf "sigs.k8s.io/controller-runtime/pkg/log"
2121

2222
"github.com/aws/eks-anywhere/controllers"
2323
"github.com/aws/eks-anywhere/controllers/mocks"
24-
"github.com/aws/eks-anywhere/internal/test"
2524
_ "github.com/aws/eks-anywhere/internal/test/envtest"
2625
anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1"
2726
"github.com/aws/eks-anywhere/pkg/controller/clusters"
@@ -69,7 +68,7 @@ func newVsphereClusterReconcilerTest(t *testing.T, objs ...runtime.Object) *vsph
6968
Add(anywherev1.VSphereDatacenterKind, reconciler).
7069
Build()
7170

72-
r := controllers.NewClusterReconciler(cl, logf.Log, &registry)
71+
r := controllers.NewClusterReconciler(cl, &registry)
7372

7473
return &vsphereClusterReconcilerTest{
7574
govcClient: govcClient,
@@ -93,15 +92,14 @@ func TestClusterReconcilerReconcileSelfManagedCluster(t *testing.T) {
9392
},
9493
}
9594

96-
log := test.NewNullLogger()
9795
controller := gomock.NewController(t)
9896
providerReconciler := mocks.NewMockProviderClusterReconciler(controller)
9997
registry := newRegistryMock(providerReconciler)
10098
c := fake.NewClientBuilder().WithRuntimeObjects(selfManagedCluster).Build()
10199

102-
providerReconciler.EXPECT().ReconcileWorkerNodes(ctx, log, sameName(selfManagedCluster))
100+
providerReconciler.EXPECT().ReconcileWorkerNodes(ctx, gomock.AssignableToTypeOf(logr.Logger{}), sameName(selfManagedCluster))
103101

104-
r := controllers.NewClusterReconciler(c, log, registry)
102+
r := controllers.NewClusterReconciler(c, registry)
105103
result, err := r.Reconcile(ctx, clusterRequest(selfManagedCluster))
106104
g.Expect(err).ToNot(HaveOccurred())
107105
g.Expect(result).To(Equal(ctrl.Result{}))
@@ -124,13 +122,12 @@ func TestClusterReconcilerReconcileDeletedSelfManagedCluster(t *testing.T) {
124122
},
125123
}
126124

127-
log := test.NewNullLogger()
128125
controller := gomock.NewController(t)
129126
providerReconciler := mocks.NewMockProviderClusterReconciler(controller)
130127
registry := newRegistryMock(providerReconciler)
131128
c := fake.NewClientBuilder().WithRuntimeObjects(selfManagedCluster).Build()
132129

133-
r := controllers.NewClusterReconciler(c, log, registry)
130+
r := controllers.NewClusterReconciler(c, registry)
134131
_, err := r.Reconcile(ctx, clusterRequest(selfManagedCluster))
135132
g.Expect(err).To(MatchError(ContainSubstring("deleting self-managed clusters is not supported")))
136133
}

controllers/cluster_controller_test_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func TestClusterReconcilerEnsureOwnerReferences(t *testing.T) {
7272
cb := fake.NewClientBuilder()
7373
cl := cb.WithRuntimeObjects(objs...).Build()
7474

75-
r := controllers.NewClusterReconciler(cl, nullLog(), newRegistryForDummyProviderReconciler())
75+
r := controllers.NewClusterReconciler(cl, newRegistryForDummyProviderReconciler())
7676
_, err := r.Reconcile(ctx, clusterRequest(cluster))
7777
g.Expect(err).NotTo(HaveOccurred())
7878

@@ -89,10 +89,10 @@ func TestClusterReconcilerEnsureOwnerReferences(t *testing.T) {
8989

9090
func TestClusterReconcilerSetupWithManager(t *testing.T) {
9191
client := env.Client()
92-
r := controllers.NewClusterReconciler(client, logf.Log, newRegistryForDummyProviderReconciler())
92+
r := controllers.NewClusterReconciler(client, newRegistryForDummyProviderReconciler())
9393

9494
g := NewWithT(t)
95-
g.Expect(r.SetupWithManager(env.Manager())).To(Succeed())
95+
g.Expect(r.SetupWithManager(env.Manager(), env.Manager().GetLogger())).To(Succeed())
9696
}
9797

9898
func TestClusterReconcilerManagementClusterNotFound(t *testing.T) {
@@ -117,7 +117,7 @@ func TestClusterReconcilerManagementClusterNotFound(t *testing.T) {
117117
cb := fake.NewClientBuilder()
118118
cl := cb.WithRuntimeObjects(objs...).Build()
119119

120-
r := controllers.NewClusterReconciler(cl, nullLog(), newRegistryForDummyProviderReconciler())
120+
r := controllers.NewClusterReconciler(cl, newRegistryForDummyProviderReconciler())
121121
_, err := r.Reconcile(ctx, clusterRequest(cluster))
122122
g.Expect(err).To(MatchError(ContainSubstring("\"my-management-cluster\" not found")))
123123
}
@@ -151,7 +151,7 @@ func TestClusterReconcilerSetBundlesRef(t *testing.T) {
151151
mgmtCluster := &anywherev1.Cluster{}
152152
g.Expect(cl.Get(ctx, client.ObjectKey{Namespace: cluster.Namespace, Name: managementCluster.Name}, mgmtCluster)).To(Succeed())
153153

154-
r := controllers.NewClusterReconciler(cl, nullLog(), newRegistryForDummyProviderReconciler())
154+
r := controllers.NewClusterReconciler(cl, newRegistryForDummyProviderReconciler())
155155
_, err := r.Reconcile(ctx, clusterRequest(cluster))
156156
g.Expect(err).ToNot(HaveOccurred())
157157

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
package controllers
22

33
import (
4-
"github.com/go-logr/logr"
54
"sigs.k8s.io/controller-runtime/pkg/client"
65
)
76

87
// DockerDatacenterReconciler reconciles a DockerDatacenterConfig object.
98
type DockerDatacenterReconciler struct {
10-
log logr.Logger
119
client client.Client
1210
}
1311

1412
// NewDockerDatacenterReconciler creates a new instance of the DockerDatacenterReconciler struct.
15-
func NewDockerDatacenterReconciler(client client.Client, log logr.Logger) *DockerDatacenterReconciler {
13+
func NewDockerDatacenterReconciler(client client.Client) *DockerDatacenterReconciler {
1614
return &DockerDatacenterReconciler{
1715
client: client,
18-
log: log,
1916
}
2017
}

controllers/factory.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ func (f *Factory) WithClusterReconciler(capiProviders []clusterctlv1.Provider) *
8686

8787
f.reconcilers.ClusterReconciler = NewClusterReconciler(
8888
f.manager.GetClient(),
89-
f.logger,
9089
f.registry,
9190
)
9291

@@ -104,7 +103,6 @@ func (f *Factory) WithDockerDatacenterReconciler() *Factory {
104103

105104
f.reconcilers.DockerDatacenterReconciler = NewDockerDatacenterReconciler(
106105
f.manager.GetClient(),
107-
f.logger,
108106
)
109107

110108
return nil
@@ -122,7 +120,6 @@ func (f *Factory) WithVSphereDatacenterReconciler() *Factory {
122120

123121
f.reconcilers.VSphereDatacenterReconciler = NewVSphereDatacenterReconciler(
124122
f.manager.GetClient(),
125-
f.logger,
126123
f.deps.VSphereValidator,
127124
f.deps.VSphereDefaulter,
128125
)
@@ -141,7 +138,6 @@ func (f *Factory) WithSnowMachineConfigReconciler() *Factory {
141138
client := f.manager.GetClient()
142139
f.reconcilers.SnowMachineConfigReconciler = NewSnowMachineConfigReconciler(
143140
client,
144-
f.logger,
145141
snow.NewValidator(snowreconciler.NewAwsClientBuilder(client)),
146142
)
147143
return nil

controllers/resource/fetcher_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ func TestFetchCloudStackCluster(t *testing.T) {
534534
logger := logr.Discard()
535535
capiResourceFetcher := resource.NewCAPIResourceFetcher(reader, logger)
536536
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: tt.cluster.Name}, gomock.Any()).Do(
537-
func(ctx context.Context, arg1 types.NamespacedName, arg2 *cloudstackv1.CloudStackCluster) {
537+
func(ctx context.Context, arg1 types.NamespacedName, arg2 *cloudstackv1.CloudStackCluster, _ ...client.GetOption) {
538538
cloudstackCluster.DeepCopyInto(arg2)
539539
})
540540
_, err := capiResourceFetcher.CloudStackCluster(ctx, tt.cluster, anywherev1.WorkerNodeGroupConfiguration{Name: "test"})
@@ -567,7 +567,7 @@ func TestFetchCloudStackEtcdMachineTemplate(t *testing.T) {
567567
logger := logr.Discard()
568568
capiResourceFetcher := resource.NewCAPIResourceFetcher(reader, logger)
569569
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: "testCluster-etcd"}, gomock.Any()).Do(
570-
func(ctx context.Context, arg1 types.NamespacedName, arg2 *etcdv1.EtcdadmCluster) {
570+
func(ctx context.Context, arg1 types.NamespacedName, arg2 *etcdv1.EtcdadmCluster, _ ...client.GetOption) {
571571
etcdadmCluster.DeepCopyInto(arg2)
572572
})
573573
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: etcdadmCluster.Spec.InfrastructureTemplate.Name},
@@ -602,11 +602,11 @@ func TestFetchCloudStackCPMachineTemplate(t *testing.T) {
602602
logger := logr.Discard()
603603
capiResourceFetcher := resource.NewCAPIResourceFetcher(reader, logger)
604604
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: tt.cluster.Name}, gomock.Any()).Do(
605-
func(ctx context.Context, arg1 types.NamespacedName, arg2 *clusterv1.Cluster) {
605+
func(ctx context.Context, arg1 types.NamespacedName, arg2 *clusterv1.Cluster, _ ...client.GetOption) {
606606
capiCluster.DeepCopyInto(arg2)
607607
})
608608
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: capiCluster.Spec.ControlPlaneRef.Namespace, Name: capiCluster.Spec.ControlPlaneRef.Name}, gomock.Any()).Do(
609-
func(ctx context.Context, arg1 types.NamespacedName, arg2 *controlplanev1.KubeadmControlPlane) {
609+
func(ctx context.Context, arg1 types.NamespacedName, arg2 *controlplanev1.KubeadmControlPlane, _ ...client.GetOption) {
610610
kubeadmControlPlane.DeepCopyInto(arg2)
611611
})
612612
reader.EXPECT().Get(ctx, types.NamespacedName{Namespace: constants.EksaSystemNamespace, Name: kubeadmControlPlane.Spec.MachineTemplate.InfrastructureRef.Name},
@@ -851,7 +851,7 @@ type stubbedReader struct {
851851
clusterName string
852852
}
853853

854-
func (s *stubbedReader) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error {
854+
func (s *stubbedReader) Get(ctx context.Context, key client.ObjectKey, obj client.Object, _ ...client.GetOption) error {
855855
if s.kind == obj.GetObjectKind().GroupVersionKind().Kind {
856856
return nil
857857
}

controllers/resource/mocks/reader.go

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

controllers/snow_machineconfig_controller.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66

7-
"github.com/go-logr/logr"
87
kerrors "k8s.io/apimachinery/pkg/util/errors"
98
"sigs.k8s.io/cluster-api/util/patch"
109
ctrl "sigs.k8s.io/controller-runtime"
@@ -21,14 +20,13 @@ type Validator interface {
2120
// SnowMachineConfigReconciler reconciles a SnowMachineConfig object.
2221
type SnowMachineConfigReconciler struct {
2322
client client.Client
24-
log logr.Logger
2523
validator Validator
2624
}
2725

28-
func NewSnowMachineConfigReconciler(client client.Client, log logr.Logger, validator Validator) *SnowMachineConfigReconciler {
26+
// NewSnowMachineConfigReconciler constructs a new SnowMachineConfigReconciler.
27+
func NewSnowMachineConfigReconciler(client client.Client, validator Validator) *SnowMachineConfigReconciler {
2928
return &SnowMachineConfigReconciler{
3029
client: client,
31-
log: log,
3230
validator: validator,
3331
}
3432
}
@@ -41,8 +39,9 @@ func (r *SnowMachineConfigReconciler) SetupWithManager(mgr ctrl.Manager) error {
4139
}
4240

4341
// TODO: add here kubebuilder permissions as needed.
42+
// Reconcile implements the reconcile.Reconciler interface.
4443
func (r *SnowMachineConfigReconciler) Reconcile(ctx context.Context, req ctrl.Request) (_ ctrl.Result, reterr error) {
45-
log := r.log.WithValues("snowMachineConfig", req.NamespacedName)
44+
log := ctrl.LoggerFrom(ctx)
4645

4746
// Fetch the SnowMachineConfig object
4847
snowMachineConfig := &anywherev1.SnowMachineConfig{}

0 commit comments

Comments
 (0)