Skip to content

Commit daea40b

Browse files
committed
Export Config.Log and make possible to configure logger through context (controller-runtime way)
Signed-off-by: Frederic Giloux <[email protected]>
1 parent 4cbd0e1 commit daea40b

File tree

6 files changed

+45
-25
lines changed

6 files changed

+45
-25
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,4 @@ jobs:
7373
fetch-depth: 0
7474

7575
- name: Run go-apidiff
76-
uses: joelanford/go-apidiff@master
76+
uses: joelanford/go-apidiff@main

prune/maxage.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ import (
2222
// maxAge looks for and prunes resources, currently jobs and pods,
2323
// that exceed a user specified age (e.g. 3d), resources to be removed
2424
// are returned
25-
func pruneByMaxAge(_ context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
26-
config.log.V(1).Info("maxAge running", "setting", config.Strategy.MaxAgeSetting)
25+
func pruneByMaxAge(ctx context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
26+
log := Logger(ctx, config)
27+
log.V(1).Info("maxAge running", "setting", config.Strategy.MaxAgeSetting)
2728

2829
maxAgeDuration, e := time.ParseDuration(config.Strategy.MaxAgeSetting)
2930
if e != nil {
@@ -33,9 +34,9 @@ func pruneByMaxAge(_ context.Context, config Config, resources []ResourceInfo) (
3334
maxAgeTime := time.Now().Add(-maxAgeDuration)
3435

3536
for i := 0; i < len(resources); i++ {
36-
config.log.V(1).Info("age of pod ", "age", time.Since(resources[i].StartTime), "maxage", maxAgeTime)
37+
log.V(1).Info("age of pod ", "age", time.Since(resources[i].StartTime), "maxage", maxAgeTime)
3738
if resources[i].StartTime.Before(maxAgeTime) {
38-
config.log.V(1).Info("pruning ", "kind", resources[i].GVK, "name", resources[i].Name)
39+
log.V(1).Info("pruning ", "kind", resources[i].GVK, "name", resources[i].Name)
3940

4041
resourcesToRemove = append(resourcesToRemove, resources[i])
4142
}

prune/maxcount.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,17 @@ import (
2323
// pruneByMaxCount looks for and prunes resources, currently jobs and pods,
2424
// that exceed a user specified count (e.g. 3), the oldest resources
2525
// are pruned, resources to remove are returned
26-
func pruneByMaxCount(_ context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
27-
config.log.V(1).Info("pruneByMaxCount running ", "max count", config.Strategy.MaxCountSetting, "resource count", len(resources))
26+
func pruneByMaxCount(ctx context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
27+
log := Logger(ctx, config)
28+
log.V(1).Info("pruneByMaxCount running ", "max count", config.Strategy.MaxCountSetting, "resource count", len(resources))
2829
if config.Strategy.MaxCountSetting < 0 {
2930
return resourcesToRemove, fmt.Errorf("max count setting less than zero")
3031
}
3132

3233
if len(resources) > config.Strategy.MaxCountSetting {
3334
removeCount := len(resources) - config.Strategy.MaxCountSetting
3435
for i := len(resources) - 1; i >= 0; i-- {
35-
config.log.V(1).Info("pruning pod ", "pod name", resources[i].Name, "age", time.Since(resources[i].StartTime))
36+
log.V(1).Info("pruning pod ", "pod name", resources[i].Name, "age", time.Since(resources[i].StartTime))
3637

3738
resourcesToRemove = append(resourcesToRemove, resources[i])
3839

prune/prune.go

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"k8s.io/apimachinery/pkg/labels"
2424
"k8s.io/apimachinery/pkg/runtime/schema"
2525
"k8s.io/client-go/kubernetes"
26+
27+
ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
2628
)
2729

2830
// ResourceStatus describes the Kubernetes resource status we are evaluating
@@ -54,10 +56,10 @@ type StrategyConfig struct {
5456

5557
// StrategyFunc function allows a means to specify
5658
// custom prune strategies
57-
type StrategyFunc func(cfg Config, resources []ResourceInfo) ([]ResourceInfo, error)
59+
type StrategyFunc func(ctx context.Context, cfg Config, resources []ResourceInfo) ([]ResourceInfo, error)
5860

5961
// PreDelete function is called before a resource is pruned
60-
type PreDelete func(cfg Config, something ResourceInfo) error
62+
type PreDelete func(ctx context.Context, cfg Config, something ResourceInfo) error
6163

6264
// Config defines a pruning configuration and ultimately
6365
// determines what will get pruned
@@ -70,13 +72,13 @@ type Config struct {
7072
Strategy StrategyConfig //strategy for pruning, either age or max
7173
CustomStrategy StrategyFunc //custom strategy
7274
PreDeleteHook PreDelete //called before resource is deleteds
73-
log logr.Logger
75+
Log logr.Logger //optional: to overwrite the logger set at context level
7476
}
7577

7678
// Execute causes the pruning work to be executed based on its configuration
7779
func (config Config) Execute(ctx context.Context) error {
78-
79-
config.log.V(1).Info("Execute Prune")
80+
log := Logger(ctx, config)
81+
log.V(1).Info("Execute Prune")
8082

8183
err := config.validate()
8284
if err != nil {
@@ -92,13 +94,13 @@ func (config Config) Execute(ctx context.Context) error {
9294
if err != nil {
9395
return err
9496
}
95-
config.log.V(1).Info("pods ", "count", len(resourceList))
97+
log.V(1).Info("pods ", "count", len(resourceList))
9698
} else if config.Resources[i].Kind == JobKind {
9799
resourceList, err = config.getCompletedJobs(ctx)
98100
if err != nil {
99101
return err
100102
}
101-
config.log.V(1).Info("jobs ", "count", len(resourceList))
103+
log.V(1).Info("jobs ", "count", len(resourceList))
102104
}
103105

104106
var resourcesToRemove []ResourceInfo
@@ -109,7 +111,7 @@ func (config Config) Execute(ctx context.Context) error {
109111
case MaxCountStrategy:
110112
resourcesToRemove, err = pruneByMaxCount(ctx, config, resourceList)
111113
case CustomStrategy:
112-
resourcesToRemove, err = config.CustomStrategy(config, resourceList)
114+
resourcesToRemove, err = config.CustomStrategy(ctx, config, resourceList)
113115
default:
114116
return fmt.Errorf("unknown strategy")
115117
}
@@ -123,7 +125,7 @@ func (config Config) Execute(ctx context.Context) error {
123125
}
124126
}
125127

126-
config.log.V(1).Info("Prune completed")
128+
log.V(1).Info("Prune completed")
127129

128130
return nil
129131
}
@@ -181,3 +183,17 @@ func (config Config) validate() (err error) {
181183
}
182184
return nil
183185
}
186+
187+
// Logger returns a logger from the context using logr method or Config.Log if none is found
188+
// controller-runtime automatically provides a logger in context.Context during Reconcile calls.
189+
// Note that there is no compile time check whether a logger can be retrieved by either way.
190+
// keysAndValues allow to add fields to the logs, cf logr documentation.
191+
func Logger(ctx context.Context, cfg Config, keysAndValues ...interface{}) logr.Logger {
192+
var log logr.Logger
193+
if cfg.Log != (logr.Logger{}) {
194+
log = cfg.Log
195+
} else {
196+
log = ctrllog.FromContext(ctx)
197+
}
198+
return log.WithValues(keysAndValues...)
199+
}

prune/remove.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (config Config) removeResources(ctx context.Context, resources []ResourceIn
3131
r := resources[i]
3232

3333
if config.PreDeleteHook != nil {
34-
err = config.PreDeleteHook(config, r)
34+
err = config.PreDeleteHook(ctx, config, r)
3535
if err != nil {
3636
return err
3737
}

prune/resource_test.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var _ = Describe("Prune", func() {
4141
client = testclient.NewSimpleClientset()
4242
ctx = context.Background()
4343
cfg = Config{
44-
log: logf.Log.WithName("prune"),
44+
Log: logf.Log.WithName("prune"),
4545
DryRun: false,
4646
Clientset: client,
4747
LabelSelector: "app=churro",
@@ -98,7 +98,7 @@ var _ = Describe("Prune", func() {
9898
)
9999
BeforeEach(func() {
100100
cfg = Config{}
101-
cfg.log = logf.Log.WithName("prune")
101+
cfg.Log = logf.Log.WithName("prune")
102102
ctx = context.Background()
103103
})
104104
It("should return an error when LabelSelector is not set", func() {
@@ -130,7 +130,7 @@ var _ = Describe("Prune", func() {
130130
ctx = context.Background()
131131
jobcfg = Config{
132132
DryRun: false,
133-
log: logf.Log.WithName("prune"),
133+
Log: logf.Log.WithName("prune"),
134134
Clientset: jobclient,
135135
LabelSelector: "app=churro",
136136
Resources: []schema.GroupVersionKind{
@@ -318,17 +318,19 @@ func createTestPods(client kubernetes.Interface) (err error) {
318318
return nil
319319
}
320320

321-
func myhook(cfg Config, x ResourceInfo) error {
322-
fmt.Println("myhook is called ")
321+
func myhook(ctx context.Context, cfg Config, x ResourceInfo) error {
322+
log := Logger(ctx, cfg)
323+
log.V(1).Info("myhook is called")
323324
return nil
324325
}
325326

326327
// myStrategy shows how you can write your own strategy, in this
327328
// example, the strategy doesn't really do another other than count
328329
// the number of resources, returning a list of resources to delete in
329330
// this case zero.
330-
func myStrategy(cfg Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
331-
fmt.Printf("myStrategy is called with resources %v config %v\n", resources, cfg)
331+
func myStrategy(ctx context.Context, cfg Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
332+
log := Logger(ctx, cfg)
333+
log.V(1).Info("myStrategy is called", "resources", resources, "config", cfg)
332334
if len(resources) != 3 {
333335
return resourcesToRemove, fmt.Errorf("count of resources did not equal our expectation")
334336
}

0 commit comments

Comments
 (0)