diff --git a/pkg/operator/controller/ttl_report.go b/pkg/operator/controller/ttl_report.go index d2493a14b..41e1a1c83 100644 --- a/pkg/operator/controller/ttl_report.go +++ b/pkg/operator/controller/ttl_report.go @@ -5,6 +5,9 @@ import ( "fmt" "time" + "github.com/aquasecurity/starboard/pkg/ext" + "github.com/aquasecurity/starboard/pkg/utils" + "github.com/aquasecurity/starboard/pkg/apis/aquasecurity/v1alpha1" "github.com/aquasecurity/starboard/pkg/operator/etc" "github.com/aquasecurity/starboard/pkg/operator/predicate" @@ -20,6 +23,7 @@ type TTLReportReconciler struct { logr.Logger etc.Config client.Client + ext.Clock } func (r *TTLReportReconciler) SetupWithManager(mgr ctrl.Manager) error { @@ -63,11 +67,7 @@ func (r *TTLReportReconciler) reconcileReport() reconcile.Func { if err != nil { return ctrl.Result{}, fmt.Errorf("failed parsing %v with value %v %w", v1alpha1.TTLReportAnnotation, ttlReportAnnotationStr, err) } - creationTime := report.Report.UpdateTimestamp - ttlExpired, durationToTTLExpiration, err := ttlIsExpired(reportTTLTime, creationTime.Time) - if err != nil { - return ctrl.Result{}, err - } + ttlExpired, durationToTTLExpiration := utils.IsTTLExpired(reportTTLTime, report.Report.UpdateTimestamp.Time, r.Clock) if ttlExpired { log.V(1).Info("Removing vulnerabilityReport with expired TTL") err := r.Client.Delete(ctx, report, &client.DeleteOptions{}) @@ -81,16 +81,3 @@ func (r *TTLReportReconciler) reconcileReport() reconcile.Func { return ctrl.Result{RequeueAfter: durationToTTLExpiration}, nil } } - -func ttlIsExpired(reportTTL time.Duration, creationTime time.Time) (bool, time.Duration, error) { - expiresAt := creationTime.Add(reportTTL) - currentTime := time.Now() - isExpired := currentTime.After(expiresAt) - - if isExpired { - return true, time.Duration(0), nil - } - - expiresIn := expiresAt.Sub(currentTime) - return false, expiresIn, nil -} diff --git a/pkg/operator/controller/ttl_report_test.go b/pkg/operator/controller/ttl_report_test.go deleted file mode 100644 index 45c4a09b4..000000000 --- a/pkg/operator/controller/ttl_report_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package controller - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestTTLIsExpired(t *testing.T) { - ttlReportAnnotationStr := "10h" - ttlReportTime, _ := time.ParseDuration(ttlReportAnnotationStr) - creationTime := time.Now() - ttlExpired, _, err := ttlIsExpired(ttlReportTime, creationTime) - assert.NoError(t, err) - assert.False(t, ttlExpired) -} - -func TestTTLIsNotExpired(t *testing.T) { - ttlReportAnnotationStr := "10s" - ttlReportTime, _ := time.ParseDuration(ttlReportAnnotationStr) - creationTime := time.Now() - then := creationTime.Add(time.Duration(-10) * time.Minute) - ttlExpired, durationToTTLExp, err := ttlIsExpired(ttlReportTime, then) - t.Logf("Duration to ttl expiration %s, we should rescheduel check", durationToTTLExp) - assert.NoError(t, err) - assert.True(t, ttlExpired) -} diff --git a/pkg/operator/operator.go b/pkg/operator/operator.go index f9cbc4e1f..95a66f9a8 100644 --- a/pkg/operator/operator.go +++ b/pkg/operator/operator.go @@ -167,6 +167,7 @@ func Start(ctx context.Context, buildInfo starboard.BuildInfo, operatorConfig et Logger: ctrl.Log.WithName("reconciler").WithName("ttlreport"), Config: operatorConfig, Client: mgr.GetClient(), + Clock: ext.NewSystemClock(), }).SetupWithManager(mgr); err != nil { return fmt.Errorf("unable to setup TTLreport reconciler: %w", err) } diff --git a/pkg/utils/dateutil.go b/pkg/utils/dateutil.go index 8ca908807..3e87f1855 100644 --- a/pkg/utils/dateutil.go +++ b/pkg/utils/dateutil.go @@ -26,3 +26,9 @@ func DurationExceeded(duration time.Duration) bool { func timeToExpiration(expiresAt time.Time, clock ext.Clock) time.Duration { return expiresAt.Sub(clock.Now()) } + +// IsTTLExpired check whether current time has exceeded creation time + ttl duration +func IsTTLExpired(ttl time.Duration, creationTime time.Time, clock ext.Clock) (bool, time.Duration) { + durationToTTLExpiration := timeToExpiration(creationTime.Add(ttl), clock) + return DurationExceeded(durationToTTLExpiration), durationToTTLExpiration +} diff --git a/pkg/utils/dateutil_test.go b/pkg/utils/dateutil_test.go index 0bd3c7e05..5e19619f9 100644 --- a/pkg/utils/dateutil_test.go +++ b/pkg/utils/dateutil_test.go @@ -59,3 +59,22 @@ func TestDurationExceeded(t *testing.T) { }) } } + +func TestTTLIsNotExpired(t *testing.T) { + ttlReportAnnotationStr := "10h" + ttlReportTime, _ := time.ParseDuration(ttlReportAnnotationStr) + creationTime := time.Now() + ttlExpired, duration := IsTTLExpired(ttlReportTime, creationTime, ext.NewSystemClock()) + assert.True(t, duration > 0) + assert.False(t, ttlExpired) +} + +func TestTTLIsExpired(t *testing.T) { + ttlReportAnnotationStr := "10s" + ttlReportTime, _ := time.ParseDuration(ttlReportAnnotationStr) + creationTime := time.Now() + then := creationTime.Add(time.Duration(-10) * time.Minute) + ttlExpired, duration := IsTTLExpired(ttlReportTime, then, ext.NewSystemClock()) + assert.True(t, duration <= 0) + assert.True(t, ttlExpired) +}