From 52dbfbf56ebf325931625de34af4baa4ebce0129 Mon Sep 17 00:00:00 2001 From: Tom Wiesing Date: Wed, 7 Dec 2022 11:02:44 +0100 Subject: [PATCH] Add Cron interval to config --- cmd/server.go | 3 +-- internal/config/config.go | 4 ++++ internal/config/config_template | 3 +++ internal/dis/component/control/cron/cron.go | 10 ++++++---- pkg/stringparser/parse.go | 1 + pkg/stringparser/stringparser.go | 6 ++++++ 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index 7cffcbe..7d15c8a 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -2,7 +2,6 @@ package cmd import ( "net/http" - "time" wisski_distillery "github.com/FAU-CDI/wisski-distillery" "github.com/FAU-CDI/wisski-distillery/internal/cli" @@ -51,7 +50,7 @@ func (s server) Run(context wisski_distillery.Context) error { // start the cron tasks context.Printf("Starting cron tasks %s\n", s.Bind) - done := dis.Cron().Start(context.Context, time.Minute, notify) + done := dis.Cron().Start(context.Context, notify) defer func() { <-done }() diff --git a/internal/config/config.go b/internal/config/config.go index 4e93ac7..dd56190 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -6,6 +6,7 @@ import ( "net/url" "reflect" "strings" + "time" ) // Config represents the configuration of a WissKI Distillery. @@ -89,6 +90,9 @@ type Config struct { // name of docker network to use DockerNetworkName string `env:"DOCKER_NETWORK_NAME" default:"distillery" parser:"nonempty"` + // interval to trigger distillery cron tasks in + CronInterval time.Duration `env:"CRON_INTERVAL" default:"10m" parser:"duration"` + // ConfigPath is the path this configuration was loaded from (if any) ConfigPath string } diff --git a/internal/config/config_template b/internal/config/config_template index 4f24138..8773c17 100644 --- a/internal/config/config_template +++ b/internal/config/config_template @@ -76,3 +76,6 @@ KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD} # The admin user and password required to access the /dis/ server and api DIS_ADMIN_USER=${DIS_ADMIN_USER} DIS_ADMIN_PASSWORD=${DIS_ADMIN_PASSWORD} + +# the interval to run cron in +CRON_INTERVAL=10m \ No newline at end of file diff --git a/internal/dis/component/control/cron/cron.go b/internal/dis/component/control/cron/cron.go index 6742473..9691cc5 100644 --- a/internal/dis/component/control/cron/cron.go +++ b/internal/dis/component/control/cron/cron.go @@ -91,16 +91,18 @@ func (control *Cron) Once(ctx context.Context) { zerolog.Ctx(ctx).Info().Time("time", time.Now()).Msg("Finished Cron") } -// Start invokes all cron jobs regularly, waiting interval between invocations. +// Start invokes all cron jobs regularly, waiting between invocations as specified in configuration. // // The first run is invoked immediatly. // The call to Start returns after the first invocation of all cron tasks. // // The returned channel is closed once no more cron tasks are active. -func (control *Cron) Start(ctx context.Context, interval time.Duration, signal <-chan struct{}) <-chan struct{} { +func (control *Cron) Start(ctx context.Context, signal <-chan struct{}) <-chan struct{} { + zerolog.Ctx(ctx).Info().Dur("interval", control.Config.CronInterval).Msg("Scheduling Cron() tasks") + // run runs cron tasks with the configured timeout run := func() { - ctx, done := context.WithTimeout(ctx, interval) + ctx, done := context.WithTimeout(ctx, control.Config.CronInterval) defer done() control.Once(ctx) @@ -117,7 +119,7 @@ func (control *Cron) Start(ctx context.Context, interval time.Duration, signal < timer := timex.NewTimer() for { timex.StopTimer(timer) - timer.Reset(interval) + timer.Reset(control.Config.CronInterval) select { case <-timer.C: diff --git a/pkg/stringparser/parse.go b/pkg/stringparser/parse.go index 91c5741..1e3c9ad 100644 --- a/pkg/stringparser/parse.go +++ b/pkg/stringparser/parse.go @@ -47,6 +47,7 @@ var knownParsers map[string]Parser[any] = map[string]Parser[any]{ "abspath": asGenericParser(ParseAbspath), "domain": asGenericParser(ParseValidDomain), "domains": asGenericParser(ParseValidDomains), + "duration": asGenericParser(ParseDuration), "number": asGenericParser(ParseNumber), "port": asGenericParser(ParsePort), "https_url": asGenericParser(ParseHttpsURL), diff --git a/pkg/stringparser/stringparser.go b/pkg/stringparser/stringparser.go index 59c438f..07b4f11 100644 --- a/pkg/stringparser/stringparser.go +++ b/pkg/stringparser/stringparser.go @@ -6,6 +6,7 @@ import ( "regexp" "strconv" "strings" + "time" "github.com/FAU-CDI/wisski-distillery/pkg/environment" "github.com/FAU-CDI/wisski-distillery/pkg/fsx" @@ -116,3 +117,8 @@ func ParseSlug(env environment.Environment, s string) (string, error) { } return s, nil } + +// ParseDuration parses a time.Duration +func ParseDuration(env environment.Environment, s string) (time.Duration, error) { + return time.ParseDuration(s) +}