diff options
| author | Paul Buetow <paul@buetow.org> | 2024-08-22 10:31:43 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-08-22 10:31:43 +0300 |
| commit | f2b9094e301ac764930feaca93f1f0705f3e1a04 (patch) | |
| tree | 62dedc06f8a90c1c4f9906269e8e44698f530257 /internal | |
| parent | b9aac1245c586ed3a78713e7b47f1e00c71a9aa2 (diff) | |
initial scheduler
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/config/server/server.go | 22 | ||||
| -rw-r--r-- | internal/server/cron/cron.go | 41 | ||||
| -rw-r--r-- | internal/server/health/health.go | 7 | ||||
| -rw-r--r-- | internal/server/scheduler/scheduler.go | 7 | ||||
| -rw-r--r-- | internal/server/server.go | 8 |
5 files changed, 50 insertions, 35 deletions
diff --git a/internal/config/server/server.go b/internal/config/server/server.go index b43166c..88211a4 100644 --- a/internal/config/server/server.go +++ b/internal/config/server/server.go @@ -10,14 +10,15 @@ import ( ) type ServerConfig struct { - ListenAddr string `json:"ListenAddr,omitempty"` - Partner string `json:"Partner,omitempty"` - APIKey string `json:"APIKey,omitempty"` - DataDir string `json:"StateDir,omitempty"` - EmailTo string `json:"EmailTo,omitempty"` - EmailFrom string `json:"EmailFrom,omitempty"` - SMTPServer string `json:"SMTPServer,omitempty"` - CRONMergeIntervalS int `json:"CRONMergeInterval,omitempty"` + ListenAddr string `json:"ListenAddr,omitempty"` + Partner string `json:"Partner,omitempty"` + APIKey string `json:"APIKey,omitempty"` + DataDir string `json:"StateDir,omitempty"` + EmailTo string `json:"EmailTo,omitempty"` + EmailFrom string `json:"EmailFrom,omitempty"` + SMTPServer string `json:"SMTPServer,omitempty"` + MergeIntervalS int `json:"MergeInterval,omitempty"` + ScheduleIntervalS int `json:"ScheduleInterval,omitempty"` } func New(configFile string) (ServerConfig, error) { @@ -38,7 +39,10 @@ func New(configFile string) (ServerConfig, error) { return fmt.Sprintf("%s:25", hostname) }) - conf.CRONMergeIntervalS = config.EnvToInt("GOS_CRON_MERGE_INTERVAL", 3600) + const oneHour = 3600 + conf.MergeIntervalS = config.EnvToInt("GOS_MERGE_INTERVAL", oneHour) + conf.ScheduleIntervalS = config.EnvToInt("GOS_SCHEDULER_INTERVAL", oneHour*6) + return conf, nil } diff --git a/internal/server/cron/cron.go b/internal/server/cron/cron.go index 4ec3107..b31b48f 100644 --- a/internal/server/cron/cron.go +++ b/internal/server/cron/cron.go @@ -2,32 +2,37 @@ package cron import ( "context" + "fmt" "log" "time" config "codeberg.org/snonux/gos/internal/config/server" + "codeberg.org/snonux/gos/internal/server/health" "codeberg.org/snonux/gos/internal/server/repository" + "codeberg.org/snonux/gos/internal/server/scheduler" ) -func Start(ctx context.Context, conf config.ServerConfig) error { - go func() { - helloTicker := time.NewTicker(time.Hour) - mergeTicker := time.NewTicker(time.Second * time.Duration(conf.CRONMergeIntervalS)) +func Run(ctx context.Context, conf config.ServerConfig, status health.Status) { + helloTicker := time.NewTicker(time.Hour) + mergeTicker := time.NewTicker(time.Second * time.Duration(conf.MergeIntervalS)) + scheduleTicker := time.NewTicker(time.Second * time.Duration(conf.ScheduleIntervalS)) - for { - select { - case <-ctx.Done(): - return - case <-helloTicker.C: - log.Println("CRON hello ticker ticked") - case <-mergeTicker.C: - log.Println("CRON ticker initiating remote merge operation") - if err := repository.Instance(conf).MergeRemotely(ctx); err != nil { - log.Println(err) - } + for { + select { + case <-ctx.Done(): + return + case <-helloTicker.C: + log.Println("CRON hello ticker ticked") + case <-mergeTicker.C: + log.Println("CRON ticker initiating remote merge operation") + if err := repository.Instance(conf).MergeRemotely(ctx); err != nil { + status.Set(health.Critical, "cron", fmt.Errorf("unable to merge remote repository: %w", err)) + } + case <-scheduleTicker.C: + log.Println("CRON ticker initiating schedule operation") + if err := scheduler.Run(ctx); err != nil { + status.Set(health.Critical, "cron", fmt.Errorf("unable to schedule post(s): %w", err)) } } - }() - - return nil + } } diff --git a/internal/server/health/health.go b/internal/server/health/health.go index 5f57cba..a75c475 100644 --- a/internal/server/health/health.go +++ b/internal/server/health/health.go @@ -52,12 +52,13 @@ func NewStatus() Status { } } -func (hs Status) Set(s Severity, what, text string) { - log.Println("alerting", what, "to", text, "with severity", s) - +func (hs Status) Set(s Severity, what string, info any) { hs.mu.Lock() defer hs.mu.Unlock() + text := fmt.Sprintf("%v", info) + log.Println("alerting", what, "to", text, "with severity", s) + hs.alerts[what] = alert{ text: text, severity: s, diff --git a/internal/server/scheduler/scheduler.go b/internal/server/scheduler/scheduler.go new file mode 100644 index 0000000..8aae0ed --- /dev/null +++ b/internal/server/scheduler/scheduler.go @@ -0,0 +1,7 @@ +package scheduler + +import "context" + +func Run(ctx context.Context) error { + return nil +} diff --git a/internal/server/server.go b/internal/server/server.go index 7ab4df0..0c77d4f 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -18,13 +18,11 @@ type Server struct { type HandlerFuncWithError func(http.ResponseWriter, *http.Request) error -func New(conf config.ServerConfig) Server { - serv := Server{ +func New(conf config.ServerConfig, status health.Status) Server { + return Server{ Conf: conf, - Status: health.NewStatus(), + Status: status, } - - return serv } func (serv Server) Handle(name string, handler HandlerFuncWithError) { |
