Skip to content

Commit 466549a

Browse files
committed
update
1 parent 1de701a commit 466549a

File tree

11 files changed

+84
-119
lines changed

11 files changed

+84
-119
lines changed

examples/builtins/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
appsv1 "k8s.io/api/apps/v1"
2323
corev1 "k8s.io/api/core/v1"
2424
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
25-
2625
"sigs.k8s.io/controller-runtime/pkg/client/config"
2726
"sigs.k8s.io/controller-runtime/pkg/controller"
2827
"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -51,7 +50,7 @@ func main() {
5150

5251
// Setup a new controller to reconcile ReplicaSets
5352
entryLog.Info("Setting up controller")
54-
c, err := controller.New("foo-controller", nil, mgr, controller.Options{
53+
c, err := controller.New("foo-controller", mgr, controller.Options{
5554
Reconciler: &reconcileReplicaSet{client: mgr.GetClient()},
5655
})
5756
if err != nil {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ require (
2121
k8s.io/apimachinery v0.23.0
2222
k8s.io/client-go v0.23.0
2323
k8s.io/component-base v0.23.0
24+
k8s.io/klog/v2 v2.30.0
2425
k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b
2526
sigs.k8s.io/yaml v1.3.0
2627
)
@@ -59,7 +60,6 @@ require (
5960
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
6061
gopkg.in/yaml.v2 v2.4.0 // indirect
6162
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
62-
k8s.io/klog/v2 v2.30.0 // indirect
6363
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
6464
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
6565
sigs.k8s.io/structured-merge-diff/v4 v4.2.0 // indirect

pkg/builder/controller.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/go-logr/logr"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/apimachinery/pkg/runtime/schema"
26+
"k8s.io/klog/v2"
2627

2728
"sigs.k8s.io/controller-runtime/pkg/client"
2829
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
@@ -148,9 +149,9 @@ func (blder *Builder) WithOptions(options controller.Options) *Builder {
148149
return blder
149150
}
150151

151-
// WithLogger overrides the controller options's logger used.
152-
func (blder *Builder) WithLogger(log logr.Logger) *Builder {
153-
blder.ctrlOptions.Log = log
152+
// WithLogConstructor overrides the controller options's LogConstructor.
153+
func (blder *Builder) WithLogConstructor(logConstructor func(*reconcile.Request) logr.Logger) *Builder {
154+
blder.ctrlOptions.LogConstructor = logConstructor
154155
return blder
155156
}
156157

@@ -289,6 +290,9 @@ func (blder *Builder) doController(r reconcile.Reconciler) error {
289290
if err != nil {
290291
return err
291292
}
293+
if gvk.Kind == "" {
294+
return fmt.Errorf("kind should not be empty")
295+
}
292296

293297
// Setup concurrency.
294298
if ctrlOptions.MaxConcurrentReconciles == 0 {
@@ -304,12 +308,25 @@ func (blder *Builder) doController(r reconcile.Reconciler) error {
304308
ctrlOptions.CacheSyncTimeout = *globalOpts.CacheSyncTimeout
305309
}
306310

311+
controllerName := blder.getControllerName(gvk)
312+
307313
// Setup the logger.
308-
if ctrlOptions.Log.GetSink() == nil {
309-
ctrlOptions.Log = blder.mgr.GetLogger()
314+
if ctrlOptions.LogConstructor == nil {
315+
log := blder.mgr.GetLogger()
316+
log = log.WithValues("reconcilerGroup", gvk.Group, "reconcilerKind", gvk.Kind)
317+
log = log.WithValues("controller", controllerName)
318+
319+
lowerCamelCaseKind := strings.ToLower(gvk.Kind[:1]) + gvk.Kind[1:]
320+
321+
ctrlOptions.LogConstructor = func(req *reconcile.Request) logr.Logger {
322+
if req != nil {
323+
log = log.WithValues(lowerCamelCaseKind, klog.KRef(req.Namespace, req.Name))
324+
}
325+
return log
326+
}
310327
}
311328

312329
// Build the controller and return.
313-
blder.ctrl, err = newController(blder.getControllerName(gvk), &gvk, blder.mgr, ctrlOptions)
330+
blder.ctrl, err = newController(controllerName, blder.mgr, ctrlOptions)
314331
return err
315332
}

pkg/builder/controller_test.go

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ var _ = Describe("application", func() {
143143
})
144144

145145
It("should return an error if it cannot create the controller", func() {
146-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (
146+
newController = func(name string, mgr manager.Manager, options controller.Options) (
147147
controller.Controller, error) {
148148
return nil, fmt.Errorf("expected error")
149149
}
@@ -163,10 +163,10 @@ var _ = Describe("application", func() {
163163

164164
It("should override max concurrent reconcilers during creation of controller", func() {
165165
const maxConcurrentReconciles = 5
166-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (
166+
newController = func(name string, mgr manager.Manager, options controller.Options) (
167167
controller.Controller, error) {
168168
if options.MaxConcurrentReconciles == maxConcurrentReconciles {
169-
return controller.New(name, gvk, mgr, options)
169+
return controller.New(name, mgr, options)
170170
}
171171
return nil, fmt.Errorf("max concurrent reconcilers expected %d but found %d", maxConcurrentReconciles, options.MaxConcurrentReconciles)
172172
}
@@ -186,10 +186,10 @@ var _ = Describe("application", func() {
186186

187187
It("should override max concurrent reconcilers during creation of controller, when using", func() {
188188
const maxConcurrentReconciles = 10
189-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (
189+
newController = func(name string, mgr manager.Manager, options controller.Options) (
190190
controller.Controller, error) {
191191
if options.MaxConcurrentReconciles == maxConcurrentReconciles {
192-
return controller.New(name, gvk, mgr, options)
192+
return controller.New(name, mgr, options)
193193
}
194194
return nil, fmt.Errorf("max concurrent reconcilers expected %d but found %d", maxConcurrentReconciles, options.MaxConcurrentReconciles)
195195
}
@@ -214,9 +214,9 @@ var _ = Describe("application", func() {
214214

215215
It("should override rate limiter during creation of controller", func() {
216216
rateLimiter := workqueue.DefaultItemBasedRateLimiter()
217-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
217+
newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
218218
if options.RateLimiter == rateLimiter {
219-
return controller.New(name, gvk, mgr, options)
219+
return controller.New(name, mgr, options)
220220
}
221221
return nil, fmt.Errorf("rate limiter expected %T but found %T", rateLimiter, options.RateLimiter)
222222
}
@@ -237,11 +237,11 @@ var _ = Describe("application", func() {
237237
It("should override logger during creation of controller", func() {
238238

239239
logger := &testLogger{}
240-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
241-
if options.Log.GetSink() == logger {
242-
return controller.New(name, gvk, mgr, options)
240+
newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
241+
if options.LogConstructor(nil).GetSink() == logger {
242+
return controller.New(name, mgr, options)
243243
}
244-
return nil, fmt.Errorf("logger expected %T but found %T", logger, options.Log)
244+
return nil, fmt.Errorf("logger expected %T but found %T", logger, options.LogConstructor)
245245
}
246246

247247
By("creating a controller manager")
@@ -251,18 +251,20 @@ var _ = Describe("application", func() {
251251
instance, err := ControllerManagedBy(m).
252252
For(&appsv1.ReplicaSet{}).
253253
Owns(&appsv1.ReplicaSet{}).
254-
WithLogger(logr.New(logger)).
254+
WithLogConstructor(func(request *reconcile.Request) logr.Logger {
255+
return logr.New(logger)
256+
}).
255257
Build(noop)
256258
Expect(err).NotTo(HaveOccurred())
257259
Expect(instance).NotTo(BeNil())
258260
})
259261

260262
It("should prefer reconciler from options during creation of controller", func() {
261-
newController = func(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
263+
newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) {
262264
if options.Reconciler != (typedNoop{}) {
263-
return nil, fmt.Errorf("custom reconciler expected %T but found %T", typedNoop{}, options.Reconciler)
265+
return nil, fmt.Errorf("Custom reconciler expected %T but found %T", typedNoop{}, options.Reconciler)
264266
}
265-
return controller.New(name, gvk, mgr, options)
267+
return controller.New(name, mgr, options)
266268
}
267269

268270
By("creating a controller manager")

pkg/controller/controller.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"time"
2626

2727
"github.com/go-logr/logr"
28-
"k8s.io/apimachinery/pkg/runtime/schema"
2928
"k8s.io/client-go/util/workqueue"
3029

3130
"sigs.k8s.io/controller-runtime/pkg/handler"
@@ -50,9 +49,9 @@ type Options struct {
5049
// The overall is a token bucket and the per-item is exponential.
5150
RateLimiter ratelimiter.RateLimiter
5251

53-
// Log is the logger used for this controller and passed to each reconciliation
54-
// request via the context field.
55-
Log logr.Logger
52+
// LogConstructor is used to construct a logger used for this controller and passed
53+
// to each reconciliation via the context field.
54+
LogConstructor func(request *reconcile.Request) logr.Logger
5655

5756
// CacheSyncTimeout refers to the time limit set to wait for syncing caches.
5857
// Defaults to 2 minutes if not set.
@@ -88,8 +87,8 @@ type Controller interface {
8887

8988
// New returns a new Controller registered with the Manager. The Manager will ensure that shared Caches have
9089
// been synced before the Controller is Started.
91-
func New(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options Options) (Controller, error) {
92-
c, err := NewUnmanaged(name, gvk, mgr, options)
90+
func New(name string, mgr manager.Manager, options Options) (Controller, error) {
91+
c, err := NewUnmanaged(name, mgr, options)
9392
if err != nil {
9493
return nil, err
9594
}
@@ -100,7 +99,7 @@ func New(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options
10099

101100
// NewUnmanaged returns a new controller without adding it to the manager. The
102101
// caller is responsible for starting the returned controller.
103-
func NewUnmanaged(name string, gvk *schema.GroupVersionKind, mgr manager.Manager, options Options) (Controller, error) {
102+
func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller, error) {
104103
if options.Reconciler == nil {
105104
return nil, fmt.Errorf("must specify Reconciler")
106105
}
@@ -109,8 +108,10 @@ func NewUnmanaged(name string, gvk *schema.GroupVersionKind, mgr manager.Manager
109108
return nil, fmt.Errorf("must specify Name for Controller")
110109
}
111110

112-
if options.Log.GetSink() == nil {
113-
options.Log = mgr.GetLogger()
111+
if options.LogConstructor == nil {
112+
options.LogConstructor = func(request *reconcile.Request) logr.Logger {
113+
return mgr.GetLogger()
114+
}
114115
}
115116

116117
if options.MaxConcurrentReconciles <= 0 {
@@ -130,12 +131,6 @@ func NewUnmanaged(name string, gvk *schema.GroupVersionKind, mgr manager.Manager
130131
return nil, err
131132
}
132133

133-
// Add controller and reconciler group / kind to logger.
134-
log := options.Log.WithValues("controller", name)
135-
if gvk != nil {
136-
log = log.WithValues("reconciler group", gvk.Group, "reconciler kind", gvk.Kind)
137-
}
138-
139134
// Initialize random source, later used to generate reconcileIDs.
140135
var rngSeed int64
141136
if err := binary.Read(crand.Reader, binary.LittleEndian, &rngSeed); err != nil {
@@ -153,8 +148,7 @@ func NewUnmanaged(name string, gvk *schema.GroupVersionKind, mgr manager.Manager
153148
CacheSyncTimeout: options.CacheSyncTimeout,
154149
SetFields: mgr.SetFields,
155150
Name: name,
156-
GroupVersionKind: gvk,
157-
Log: log,
151+
LogConstructor: options.LogConstructor,
158152
RandSource: randSource,
159153
RecoverPanic: options.RecoverPanic,
160154
}, nil

pkg/controller/controller_integration_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/apimachinery/pkg/runtime/schema"
2626
"k8s.io/apimachinery/pkg/types"
27-
2827
"sigs.k8s.io/controller-runtime/pkg/cache"
2928
"sigs.k8s.io/controller-runtime/pkg/controller"
3029
"sigs.k8s.io/controller-runtime/pkg/controller/controllertest"
@@ -34,7 +33,6 @@ import (
3433

3534
. "github.com/onsi/ginkgo"
3635
. "github.com/onsi/gomega"
37-
3836
"sigs.k8s.io/controller-runtime/pkg/manager"
3937
)
4038

@@ -56,7 +54,7 @@ var _ = Describe("controller", func() {
5654
Expect(err).NotTo(HaveOccurred())
5755

5856
By("Creating the Controller")
59-
instance, err := controller.New("foo-controller", nil, cm, controller.Options{
57+
instance, err := controller.New("foo-controller", cm, controller.Options{
6058
Reconciler: reconcile.Func(
6159
func(_ context.Context, request reconcile.Request) (reconcile.Result, error) {
6260
reconciled <- request

pkg/controller/controller_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ var _ = Describe("controller.Controller", func() {
4545
It("should return an error if Name is not Specified", func() {
4646
m, err := manager.New(cfg, manager.Options{})
4747
Expect(err).NotTo(HaveOccurred())
48-
c, err := controller.New("", nil, m, controller.Options{Reconciler: rec})
48+
c, err := controller.New("", m, controller.Options{Reconciler: rec})
4949
Expect(c).To(BeNil())
5050
Expect(err.Error()).To(ContainSubstring("must specify Name for Controller"))
5151
})
@@ -54,7 +54,7 @@ var _ = Describe("controller.Controller", func() {
5454
m, err := manager.New(cfg, manager.Options{})
5555
Expect(err).NotTo(HaveOccurred())
5656

57-
c, err := controller.New("foo", nil, m, controller.Options{})
57+
c, err := controller.New("foo", m, controller.Options{})
5858
Expect(c).To(BeNil())
5959
Expect(err.Error()).To(ContainSubstring("must specify Reconciler"))
6060
})
@@ -63,7 +63,7 @@ var _ = Describe("controller.Controller", func() {
6363
m, err := manager.New(cfg, manager.Options{})
6464
Expect(err).NotTo(HaveOccurred())
6565

66-
c, err := controller.New("foo", nil, m, controller.Options{Reconciler: &failRec{}})
66+
c, err := controller.New("foo", m, controller.Options{Reconciler: &failRec{}})
6767
Expect(c).To(BeNil())
6868
Expect(err).To(HaveOccurred())
6969
Expect(err.Error()).To(ContainSubstring("expected error"))
@@ -73,11 +73,11 @@ var _ = Describe("controller.Controller", func() {
7373
m, err := manager.New(cfg, manager.Options{})
7474
Expect(err).NotTo(HaveOccurred())
7575

76-
c1, err := controller.New("c1", nil, m, controller.Options{Reconciler: rec})
76+
c1, err := controller.New("c1", m, controller.Options{Reconciler: rec})
7777
Expect(err).NotTo(HaveOccurred())
7878
Expect(c1).ToNot(BeNil())
7979

80-
c2, err := controller.New("c2", nil, m, controller.Options{Reconciler: rec})
80+
c2, err := controller.New("c2", m, controller.Options{Reconciler: rec})
8181
Expect(err).NotTo(HaveOccurred())
8282
Expect(c2).ToNot(BeNil())
8383
})
@@ -107,7 +107,7 @@ var _ = Describe("controller.Controller", func() {
107107
m, err := manager.New(cfg, manager.Options{})
108108
Expect(err).NotTo(HaveOccurred())
109109

110-
c, err := controller.New("new-controller", nil, m, controller.Options{Reconciler: rec})
110+
c, err := controller.New("new-controller", m, controller.Options{Reconciler: rec})
111111
Expect(c.Watch(watch, &handler.EnqueueRequestForObject{})).To(Succeed())
112112
Expect(err).NotTo(HaveOccurred())
113113

@@ -134,7 +134,7 @@ var _ = Describe("controller.Controller", func() {
134134
m, err := manager.New(cfg, manager.Options{})
135135
Expect(err).NotTo(HaveOccurred())
136136

137-
_, err = controller.New("new-controller", nil, m, controller.Options{Reconciler: rec})
137+
_, err = controller.New("new-controller", m, controller.Options{Reconciler: rec})
138138
Expect(err).NotTo(HaveOccurred())
139139

140140
// force-close keep-alive connections. These'll time anyway (after

pkg/controller/example_test.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
corev1 "k8s.io/api/core/v1"
2424
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2525
"k8s.io/apimachinery/pkg/runtime/schema"
26-
2726
"sigs.k8s.io/controller-runtime/pkg/controller"
2827
"sigs.k8s.io/controller-runtime/pkg/handler"
2928
logf "sigs.k8s.io/controller-runtime/pkg/log"
@@ -42,7 +41,7 @@ var (
4241
// This example creates a new Controller named "pod-controller" with a no-op reconcile function. The
4342
// manager.Manager will be used to Start the Controller, and will provide it a shared Cache and Client.
4443
func ExampleNew() {
45-
_, err := controller.New("pod-controller", nil, mgr, controller.Options{
44+
_, err := controller.New("pod-controller", mgr, controller.Options{
4645
Reconciler: reconcile.Func(func(context.Context, reconcile.Request) (reconcile.Result, error) {
4746
// Your business logic to implement the API by creating, updating, deleting objects goes here.
4847
return reconcile.Result{}, nil
@@ -60,7 +59,7 @@ func ExampleController() {
6059

6160
// Create a new Controller that will call the provided Reconciler function in response
6261
// to events.
63-
c, err := controller.New("pod-controller", nil, mgr, controller.Options{
62+
c, err := controller.New("pod-controller", mgr, controller.Options{
6463
Reconciler: reconcile.Func(func(context.Context, reconcile.Request) (reconcile.Result, error) {
6564
// Your business logic to implement the API by creating, updating, deleting objects goes here.
6665
return reconcile.Result{}, nil
@@ -91,7 +90,7 @@ func ExampleController_unstructured() {
9190

9291
// Create a new Controller that will call the provided Reconciler function in response
9392
// to events.
94-
c, err := controller.New("pod-controller", nil, mgr, controller.Options{
93+
c, err := controller.New("pod-controller", mgr, controller.Options{
9594
Reconciler: reconcile.Func(func(context.Context, reconcile.Request) (reconcile.Result, error) {
9695
// Your business logic to implement the API by creating, updating, deleting objects goes here.
9796
return reconcile.Result{}, nil
@@ -130,7 +129,7 @@ func ExampleNewUnmanaged() {
130129

131130
// Configure creates a new controller but does not add it to the supplied
132131
// manager.
133-
c, err := controller.NewUnmanaged("pod-controller", nil, mgr, controller.Options{
132+
c, err := controller.NewUnmanaged("pod-controller", mgr, controller.Options{
134133
Reconciler: reconcile.Func(func(context.Context, reconcile.Request) (reconcile.Result, error) {
135134
return reconcile.Result{}, nil
136135
}),

0 commit comments

Comments
 (0)