This commit is contained in:
parent
be6403105c
commit
ed2e15a3dd
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
.cuddle/
|
.cuddle/
|
||||||
bin/
|
bin/
|
||||||
|
tmp/
|
||||||
|
@ -5,9 +5,16 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
"git.front.kjuulh.io/kjuulh/orbis/internal/app"
|
"git.front.kjuulh.io/kjuulh/orbis/internal/app"
|
||||||
|
"github.com/joho/godotenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
err := godotenv.Load()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("%s\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
app := app.NewApp()
|
app := app.NewApp()
|
||||||
|
|
||||||
if err := newRoot(app).Execute(); err != nil {
|
if err := newRoot(app).Execute(); err != nil {
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"git.front.kjuulh.io/kjuulh/orbis/internal/app"
|
"git.front.kjuulh.io/kjuulh/orbis/internal/app"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
@ -13,8 +15,13 @@ func newRoot(app *app.App) *cobra.Command {
|
|||||||
Short: "Orbis is a data workflow scheduler for all your batch and real-time needs",
|
Short: "Orbis is a data workflow scheduler for all your batch and real-time needs",
|
||||||
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
ctx := cmd.Context()
|
||||||
logger.Info("starting orbis")
|
logger.Info("starting orbis")
|
||||||
|
|
||||||
|
if err := app.Scheduler().Execute(ctx); err != nil {
|
||||||
|
return fmt.Errorf("scheduler failed with error: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
1
go.mod
1
go.mod
@ -6,6 +6,7 @@ require github.com/spf13/cobra v1.8.1
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
|
github.com/joho/godotenv v1.5.1 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
gitlab.com/greyxor/slogor v1.6.0 // indirect
|
gitlab.com/greyxor/slogor v1.6.0 // indirect
|
||||||
golang.org/x/sys v0.28.0 // indirect
|
golang.org/x/sys v0.28.0 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -1,6 +1,8 @@
|
|||||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
|
||||||
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
|
||||||
|
@ -2,6 +2,8 @@ package app
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
|
||||||
|
"git.front.kjuulh.io/kjuulh/orbis/internal/scheduler"
|
||||||
)
|
)
|
||||||
|
|
||||||
type App struct {
|
type App struct {
|
||||||
@ -17,3 +19,7 @@ func NewApp() *App {
|
|||||||
func (a *App) Logger() *slog.Logger {
|
func (a *App) Logger() *slog.Logger {
|
||||||
return a.logger
|
return a.logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) Scheduler() *scheduler.Scheduler {
|
||||||
|
return scheduler.NewScheduler(a.logger)
|
||||||
|
}
|
||||||
|
@ -3,10 +3,26 @@ package app
|
|||||||
import (
|
import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"gitlab.com/greyxor/slogor"
|
"gitlab.com/greyxor/slogor"
|
||||||
)
|
)
|
||||||
|
|
||||||
func setupLogging() *slog.Logger {
|
func setupLogging() *slog.Logger {
|
||||||
return slog.New(slogor.NewHandler(os.Stderr))
|
logLevelRaw := os.Getenv("ORBIS_LOG_LEVEL")
|
||||||
|
var logLevel slog.Leveler
|
||||||
|
switch strings.ToLower(logLevelRaw) {
|
||||||
|
case "debug":
|
||||||
|
logLevel = slog.LevelDebug
|
||||||
|
case "info":
|
||||||
|
logLevel = slog.LevelInfo
|
||||||
|
case "warn":
|
||||||
|
logLevel = slog.LevelWarn
|
||||||
|
case "error":
|
||||||
|
logLevel = slog.LevelError
|
||||||
|
default:
|
||||||
|
logLevel = slog.LevelInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
return slog.New(slogor.NewHandler(os.Stderr, slogor.SetLevel(logLevel)))
|
||||||
}
|
}
|
||||||
|
1
internal/lifecycles/lifecycles.go
Normal file
1
internal/lifecycles/lifecycles.go
Normal file
@ -0,0 +1 @@
|
|||||||
|
package lifecycles
|
41
internal/scheduler/scheduler.go
Normal file
41
internal/scheduler/scheduler.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package scheduler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Scheduler struct {
|
||||||
|
logger *slog.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewScheduler(logger *slog.Logger) *Scheduler {
|
||||||
|
return &Scheduler{
|
||||||
|
logger: logger,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Scheduler) Execute(ctx context.Context) error {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
s.logger.Info("gracefully shutting down scheduler")
|
||||||
|
return nil
|
||||||
|
default:
|
||||||
|
if err := s.process(ctx); err != nil {
|
||||||
|
return fmt.Errorf("scheduler failed: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Scheduler) process(ctx context.Context) error {
|
||||||
|
s.logger.Debug("scheduler processing items")
|
||||||
|
|
||||||
|
// FIXME: simulate work
|
||||||
|
time.Sleep(time.Second * 5)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
25
internal/utilities/singleton.go
Normal file
25
internal/utilities/singleton.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package utilities
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Singleton[T any](init func() (T, error)) func() T {
|
||||||
|
var (
|
||||||
|
once sync.Once
|
||||||
|
t T
|
||||||
|
)
|
||||||
|
|
||||||
|
return func() T {
|
||||||
|
once.Do(func() {
|
||||||
|
var err error
|
||||||
|
t, err = init()
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("creating %T failed: %s", t, err))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
}
|
@ -1 +0,0 @@
|
|||||||
exit status 1exit status 1exit status 1exit status 1
|
|
Loading…
Reference in New Issue
Block a user