Skip to content

Commit 10d4cb0

Browse files
Jeff McCormickchurrodata
andauthored
change prune strategy to separate resource removal from the strategy implementations (#76)
Co-authored-by: churromechanic <[email protected]>
1 parent 68f5b7b commit 10d4cb0

File tree

5 files changed

+56
-41
lines changed

5 files changed

+56
-41
lines changed

prune/maxage.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,26 @@ import (
2020
)
2121

2222
// maxAge looks for and prunes resources, currently jobs and pods,
23-
// that exceed a user specified age (e.g. 3d)
24-
func pruneByMaxAge(ctx context.Context, config Config, resources []ResourceInfo) (err error) {
23+
// that exceed a user specified age (e.g. 3d), resources to be removed
24+
// are returned
25+
func pruneByMaxAge(_ context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
2526
config.log.V(1).Info("maxAge running", "setting", config.Strategy.MaxAgeSetting)
2627

27-
maxAgeDuration, _ := time.ParseDuration(config.Strategy.MaxAgeSetting)
28+
maxAgeDuration, e := time.ParseDuration(config.Strategy.MaxAgeSetting)
29+
if e != nil {
30+
return resourcesToRemove, e
31+
}
32+
2833
maxAgeTime := time.Now().Add(-maxAgeDuration)
2934

3035
for i := 0; i < len(resources); i++ {
3136
config.log.V(1).Info("age of pod ", "age", time.Since(resources[i].StartTime), "maxage", maxAgeTime)
3237
if resources[i].StartTime.Before(maxAgeTime) {
3338
config.log.V(1).Info("pruning ", "kind", resources[i].GVK, "name", resources[i].Name)
3439

35-
err := config.removeResource(ctx, resources[i])
36-
if err != nil {
37-
return err
38-
}
40+
resourcesToRemove = append(resourcesToRemove, resources[i])
3941
}
4042
}
4143

42-
return nil
44+
return resourcesToRemove, nil
4345
}

prune/maxcount.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,25 @@ package prune
1616

1717
import (
1818
"context"
19+
"fmt"
1920
"time"
2021
)
2122

2223
// pruneByMaxCount looks for and prunes resources, currently jobs and pods,
2324
// that exceed a user specified count (e.g. 3), the oldest resources
24-
// are pruned
25-
func pruneByMaxCount(ctx context.Context, config Config, resources []ResourceInfo) (err error) {
25+
// are pruned, resources to remove are returned
26+
func pruneByMaxCount(_ context.Context, config Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
2627
config.log.V(1).Info("pruneByMaxCount running ", "max count", config.Strategy.MaxCountSetting, "resource count", len(resources))
28+
if config.Strategy.MaxCountSetting < 0 {
29+
return resourcesToRemove, fmt.Errorf("max count setting less than zero")
30+
}
2731

2832
if len(resources) > config.Strategy.MaxCountSetting {
2933
removeCount := len(resources) - config.Strategy.MaxCountSetting
3034
for i := len(resources) - 1; i >= 0; i-- {
3135
config.log.V(1).Info("pruning pod ", "pod name", resources[i].Name, "age", time.Since(resources[i].StartTime))
3236

33-
err := config.removeResource(ctx, resources[i])
34-
if err != nil {
35-
return err
36-
}
37+
resourcesToRemove = append(resourcesToRemove, resources[i])
3738

3839
removeCount--
3940
if removeCount == 0 {
@@ -42,5 +43,5 @@ func pruneByMaxCount(ctx context.Context, config Config, resources []ResourceInf
4243
}
4344
}
4445

45-
return nil
46+
return resourcesToRemove, nil
4647
}

prune/prune.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type StrategyConfig struct {
5454

5555
// StrategyFunc function allows a means to specify
5656
// custom prune strategies
57-
type StrategyFunc func(cfg Config, resources []ResourceInfo) error
57+
type StrategyFunc func(cfg Config, resources []ResourceInfo) ([]ResourceInfo, error)
5858

5959
// PreDelete function is called before a resource is pruned
6060
type PreDelete func(cfg Config, something ResourceInfo) error
@@ -101,19 +101,26 @@ func (config Config) Execute(ctx context.Context) error {
101101
config.log.V(1).Info("jobs ", "count", len(resourceList))
102102
}
103103

104+
var resourcesToRemove []ResourceInfo
105+
104106
switch config.Strategy.Mode {
105107
case MaxAgeStrategy:
106-
err = pruneByMaxAge(ctx, config, resourceList)
108+
resourcesToRemove, err = pruneByMaxAge(ctx, config, resourceList)
107109
case MaxCountStrategy:
108-
err = pruneByMaxCount(ctx, config, resourceList)
110+
resourcesToRemove, err = pruneByMaxCount(ctx, config, resourceList)
109111
case CustomStrategy:
110-
err = config.CustomStrategy(config, resourceList)
112+
resourcesToRemove, err = config.CustomStrategy(config, resourceList)
111113
default:
112114
return fmt.Errorf("unknown strategy")
113115
}
114116
if err != nil {
115117
return err
116118
}
119+
120+
err = config.removeResources(ctx, resourcesToRemove)
121+
if err != nil {
122+
return err
123+
}
117124
}
118125

119126
config.log.V(1).Info("Prune completed")

prune/remove.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,32 +21,36 @@ import (
2121
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2222
)
2323

24-
func (config Config) removeResource(ctx context.Context, resource ResourceInfo) (err error) {
24+
func (config Config) removeResources(ctx context.Context, resources []ResourceInfo) (err error) {
2525

2626
if config.DryRun {
2727
return nil
2828
}
2929

30-
if config.PreDeleteHook != nil {
31-
err = config.PreDeleteHook(config, resource)
32-
if err != nil {
33-
return err
34-
}
35-
}
30+
for i := 0; i < len(resources); i++ {
31+
r := resources[i]
3632

37-
switch resource.GVK.Kind {
38-
case PodKind:
39-
err := config.Clientset.CoreV1().Pods(resource.Namespace).Delete(ctx, resource.Name, metav1.DeleteOptions{})
40-
if err != nil {
41-
return err
33+
if config.PreDeleteHook != nil {
34+
err = config.PreDeleteHook(config, r)
35+
if err != nil {
36+
return err
37+
}
4238
}
43-
case JobKind:
44-
err := config.Clientset.BatchV1().Jobs(resource.Namespace).Delete(ctx, resource.Name, metav1.DeleteOptions{})
45-
if err != nil {
46-
return err
39+
40+
switch resources[i].GVK.Kind {
41+
case PodKind:
42+
err := config.Clientset.CoreV1().Pods(r.Namespace).Delete(ctx, r.Name, metav1.DeleteOptions{})
43+
if err != nil {
44+
return err
45+
}
46+
case JobKind:
47+
err := config.Clientset.BatchV1().Jobs(r.Namespace).Delete(ctx, r.Name, metav1.DeleteOptions{})
48+
if err != nil {
49+
return err
50+
}
51+
default:
52+
return fmt.Errorf("unsupported resource kind")
4753
}
48-
default:
49-
return fmt.Errorf("unsupported resource kind")
5054
}
5155

5256
return nil

prune/resource_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,11 +325,12 @@ func myhook(cfg Config, x ResourceInfo) error {
325325

326326
// myStrategy shows how you can write your own strategy, in this
327327
// example, the strategy doesn't really do another other than count
328-
// the number of resources
329-
func myStrategy(cfg Config, resources []ResourceInfo) error {
328+
// the number of resources, returning a list of resources to delete in
329+
// this case zero.
330+
func myStrategy(cfg Config, resources []ResourceInfo) (resourcesToRemove []ResourceInfo, err error) {
330331
fmt.Printf("myStrategy is called with resources %v config %v\n", resources, cfg)
331332
if len(resources) != 3 {
332-
return fmt.Errorf("count of resources did not equal our expectation")
333+
return resourcesToRemove, fmt.Errorf("count of resources did not equal our expectation")
333334
}
334-
return nil
335+
return resourcesToRemove, nil
335336
}

0 commit comments

Comments
 (0)