From 4ecbe749e45b4335e7426a493ab21c1fbe9e79cf Mon Sep 17 00:00:00 2001 From: Nathan Lowe Date: Tue, 9 Jul 2019 23:23:35 -0400 Subject: [PATCH] Retention: Implement Filter: Keep Latest K Signed-off-by: Nathan Lowe --- .../policy/rule/latestk/evaluator.go | 10 +++- .../policy/rule/latestk/evaluator_test.go | 57 +++++++++++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 src/pkg/retention/policy/rule/latestk/evaluator_test.go diff --git a/src/pkg/retention/policy/rule/latestk/evaluator.go b/src/pkg/retention/policy/rule/latestk/evaluator.go index a49c5e1cc..cd4f137cd 100644 --- a/src/pkg/retention/policy/rule/latestk/evaluator.go +++ b/src/pkg/retention/policy/rule/latestk/evaluator.go @@ -38,8 +38,12 @@ type evaluator struct { // Process the candidates based on the rule definition func (e *evaluator) Process(artifacts []*res.Candidate) ([]*res.Candidate, error) { - // TODO: REPLACE SAMPLE CODE WITH REAL IMPLEMENTATION - return artifacts, nil + i := e.k + if i > len(artifacts) { + i = len(artifacts) + } + + return artifacts[:i], nil } // Specify what action is performed to the candidates processed by this evaluator @@ -51,7 +55,7 @@ func (e *evaluator) Action() string { func New(params rule.Parameters) rule.Evaluator { if params != nil { if param, ok := params[ParameterK]; ok { - if v, ok := param.(int); ok { + if v, ok := param.(int); ok && v >= 0 { return &evaluator{ k: v, } diff --git a/src/pkg/retention/policy/rule/latestk/evaluator_test.go b/src/pkg/retention/policy/rule/latestk/evaluator_test.go new file mode 100644 index 000000000..e88a2f49c --- /dev/null +++ b/src/pkg/retention/policy/rule/latestk/evaluator_test.go @@ -0,0 +1,57 @@ +package latestk + +import ( + "strconv" + "testing" + + "github.com/goharbor/harbor/src/pkg/retention/policy/rule" + "github.com/goharbor/harbor/src/pkg/retention/res" + "github.com/stretchr/testify/require" +) + +func TestEvaluator_New(t *testing.T) { + tests := []struct { + Name string + args rule.Parameters + expectedK int + }{ + {Name: "Valid", args: map[string]rule.Parameter{ParameterK: 5}, expectedK: 5}, + {Name: "Default If Negative", args: map[string]rule.Parameter{ParameterK: -1}, expectedK: DefaultK}, + {Name: "Default If Not Set", args: map[string]rule.Parameter{}, expectedK: DefaultK}, + {Name: "Default If Wrong Type", args: map[string]rule.Parameter{ParameterK: "foo"}, expectedK: DefaultK}, + } + + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + e := New(tt.args).(*evaluator) + + require.Equal(t, tt.expectedK, e.k) + }) + } +} + +func TestEvaluator_Process(t *testing.T) { + data := []*res.Candidate{{}, {}, {}, {}, {}} + + tests := []struct { + k int + expected int + }{ + {k: 0, expected: 0}, + {k: 1, expected: 1}, + {k: 3, expected: 3}, + {k: 5, expected: 5}, + {k: 6, expected: 5}, + } + + for _, tt := range tests { + t.Run(strconv.Itoa(tt.k), func(t *testing.T) { + e := New(map[string]rule.Parameter{ParameterK: tt.k}) + + result, err := e.Process(data) + + require.NoError(t, err) + require.Len(t, result, tt.expected) + }) + } +}