Skip to content

Commit

Permalink
refactor: cleanup
Browse files Browse the repository at this point in the history
Signed-off-by: Jian Zeng <[email protected]>
  • Loading branch information
knight42 committed Jan 2, 2024
1 parent 7937caa commit 50ab69f
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 166 deletions.
20 changes: 0 additions & 20 deletions pkg/cron/cron.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,13 @@ type FuncJob = cron.FuncJob

var scheduledJobs sync.Map

// Parse parses job specification.
func Parse(spec string) (cron.Schedule, error) {
return cron.ParseStandard(spec)
}

// New returns an instance of Cron.
func New() *Cron {
c := cron.New()
c.Start()
return &Cron{c}
}

func (c *Cron) Entries() []cron.Entry {
return c.inner.Entries()
}

// Jobs returns a map of job names to job.
func (c *Cron) Jobs() map[string]cron.Entry {
ret := map[string]cron.Entry{}
Expand All @@ -54,11 +45,6 @@ func (c *Cron) Jobs() map[string]cron.Entry {
return ret
}

func (c *Cron) AddFunc(spec string, cmd func()) error {
_, err := c.inner.AddFunc(spec, cmd)
return err
}

// AddJob removes the job with the same name first and adds a new job.
func (c *Cron) AddJob(name, spec string, cmd FuncJob) error {
c.RemoveJob(name)
Expand All @@ -70,12 +56,6 @@ func (c *Cron) AddJob(name, spec string, cmd FuncJob) error {
return nil
}

// HasJob returns whether the given job exists.
func (c *Cron) HasJob(name string) bool {
_, ok := scheduledJobs.Load(name)
return ok
}

// RemoveJob remove the job with the given name.
func (c *Cron) RemoveJob(name string) {
if v, ok := scheduledJobs.Load(name); ok {
Expand Down
2 changes: 1 addition & 1 deletion pkg/cron/cron_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ func TestCron(t *testing.T) {
next := now.Add(time.Second * 4)
wg.Add(1)
cron := New()
err := cron.AddFunc("@every 3s", func() {
err := cron.AddJob("test", "@every 3s", func() {
wg.Done()
})
require.NoError(t, err)
Expand Down
2 changes: 1 addition & 1 deletion pkg/model/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ type StringMap map[string]string
type Repo struct {
Name string `gorm:"primaryKey" json:"name" validate:"required"`
Cron string `json:"cron" validate:"required,cron"`
Image string `json:"image" validate:"required,containsrune=:"`
Image string `json:"image" validate:"required"`
StorageDir string `json:"storageDir" validate:"required,dir"`
User string `json:"user"`
BindIP string `json:"bindIP" validate:"omitempty,ip"`
Expand Down
83 changes: 2 additions & 81 deletions pkg/server/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@ package server

import (
"fmt"
"log/slog"
"os"
"time"

"github.com/go-playground/validator/v10"
"github.com/spf13/viper"

"github.com/ustclug/Yuki/pkg/fs"
)

type AppConfig struct {
type Config struct {
Debug bool `mapstructure:"debug"`
DbURL string `mapstructure:"db_url" validate:"required"`
FileSystem string `mapstructure:"fs" validate:"oneof=xfs zfs default"`
Expand All @@ -31,26 +25,7 @@ type AppConfig struct {
SeccompProfile string `mapstructure:"seccomp_profile" validate:"omitempty,filepath"`
}

type Config struct {
Debug bool
DbURL string
DockerEndpoint string
Owner string
LogFile string
RepoLogsDir string
RepoConfigDir []string
LogLevel slog.Level
ListenAddr string
BindIP string
NamePrefix string
PostSync []string
ImagesUpgradeInterval time.Duration
SyncTimeout time.Duration
SeccompProfile string
GetSizer fs.GetSizer
}

var DefaultAppConfig = AppConfig{
var DefaultConfig = Config{
FileSystem: "default",
DockerEndpoint: "unix:///var/run/docker.sock",
LogFile: "/dev/stderr",
Expand All @@ -61,57 +36,3 @@ var DefaultAppConfig = AppConfig{
LogLevel: "info",
ImagesUpgradeInterval: time.Hour,
}

func loadConfig(configPath string) (*Config, error) {
v := viper.New()
v.SetConfigFile(configPath)
if err := v.ReadInConfig(); err != nil {
return nil, err
}
appCfg := DefaultAppConfig
if err := v.Unmarshal(&appCfg); err != nil {
return nil, err
}
validate := validator.New()
if err := validate.Struct(&appCfg); err != nil {
return nil, err
}
cfg := Config{
Debug: appCfg.Debug,
DbURL: appCfg.DbURL,
DockerEndpoint: appCfg.DockerEndpoint,
Owner: appCfg.Owner,
LogFile: appCfg.LogFile,
RepoConfigDir: appCfg.RepoConfigDir,
RepoLogsDir: appCfg.RepoLogsDir,
ListenAddr: appCfg.ListenAddr,
BindIP: appCfg.BindIP,
NamePrefix: appCfg.NamePrefix,
PostSync: appCfg.PostSync,
ImagesUpgradeInterval: appCfg.ImagesUpgradeInterval,
SyncTimeout: appCfg.SyncTimeout,
SeccompProfile: appCfg.SeccompProfile,
}

switch appCfg.FileSystem {
case "zfs":
cfg.GetSizer = fs.New(fs.ZFS)
case "xfs":
cfg.GetSizer = fs.New(fs.XFS)
default:
cfg.GetSizer = fs.New(fs.DEFAULT)
}

switch appCfg.LogLevel {
case "debug":
cfg.LogLevel = slog.LevelDebug
case "warn":
cfg.LogLevel = slog.LevelWarn
case "error":
cfg.LogLevel = slog.LevelError
default:
cfg.LogLevel = slog.LevelInfo
}

return &cfg, nil
}
28 changes: 11 additions & 17 deletions pkg/server/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,19 @@ import (
testutils "github.com/ustclug/Yuki/test/utils"
)

func TestLoadSyncTimeoutConfig(t *testing.T) {
f, err := os.CreateTemp("", "sync_timeout*.toml")
func TestLoadConfig(t *testing.T) {
tmp, err := os.CreateTemp("", "TestLoadConfig*.toml")
require.NoError(t, err)
t.Cleanup(func() {
_ = f.Close()
_ = os.Remove(f.Name())
})

testutils.WriteFile(t, f.Name(), `
db_url = "test"
repo_logs_dir = "/tmp/log_yuki/"
repo_config_dir = "/tmp/config_yuki"
defer os.Remove(tmp.Name())
defer tmp.Close()
testutils.WriteFile(t, tmp.Name(), `
db_url = ":memory:"
repo_logs_dir = "/tmp"
repo_config_dir = "/tmp"
sync_timeout = "15s"
`)

config, err := loadConfig(f.Name())
srv, err := New(tmp.Name())
require.NoError(t, err)
require.EqualValues(t, time.Second*15, config.SyncTimeout)
require.EqualValues(t, time.Second*15, srv.config.SyncTimeout)
require.EqualValues(t, "/tmp", srv.config.RepoConfigDir[0])
}
66 changes: 39 additions & 27 deletions pkg/server/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,19 @@ import (
"log/slog"
"net/http"
"os"
"strings"
"sync"
"time"

"github.com/go-playground/validator/v10"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/spf13/viper"
"gorm.io/driver/sqlite"
"gorm.io/gorm"

"github.com/ustclug/Yuki/pkg/cron"
"github.com/ustclug/Yuki/pkg/docker"
"github.com/ustclug/Yuki/pkg/fs"
"github.com/ustclug/Yuki/pkg/model"
)

Expand All @@ -28,40 +29,32 @@ type Server struct {

e *echo.Echo
dockerCli docker.Client
config *Config
config Config
cron *cron.Cron
db *gorm.DB
logger *slog.Logger
getSize func(string) int64
}

func New(configPath string) (*Server, error) {
cfg, err := loadConfig(configPath)
v := viper.New()
v.SetConfigFile(configPath)
err := v.ReadInConfig()
if err != nil {
return nil, err
}
cfg := DefaultConfig
if err := v.Unmarshal(&cfg); err != nil {
return nil, err
}
validate := validator.New()
if err := validate.Struct(&cfg); err != nil {
return nil, err
}
return NewWithConfig(cfg)
}

func newSlogger(writer io.Writer, addSource bool, level slog.Leveler) *slog.Logger {
return slog.New(slog.NewTextHandler(writer, &slog.HandlerOptions{
AddSource: addSource,
Level: level,
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
// Taken from https://gist.github.com/HalCanary/6bd335057c65f3b803088cc55b9ebd2b
if a.Key == slog.SourceKey {
source, _ := a.Value.Any().(*slog.Source)
if source != nil {
_, after, _ := strings.Cut(source.File, "Yuki")
source.File = after
}
}
return a
},
}))
}

func NewWithConfig(cfg *Config) (*Server, error) {
func NewWithConfig(cfg Config) (*Server, error) {
db, err := gorm.Open(sqlite.Open(cfg.DbURL), &gorm.Config{
QueryFields: true,
})
Expand All @@ -80,7 +73,20 @@ func NewWithConfig(cfg *Config) (*Server, error) {
if err != nil {
return nil, err
}
slogger := newSlogger(logfile, cfg.Debug, cfg.LogLevel)

var logLvl slog.Level
switch cfg.LogLevel {
case "debug":
logLvl = slog.LevelDebug
case "warn":
logLvl = slog.LevelWarn
case "error":
logLvl = slog.LevelError
default:
logLvl = slog.LevelInfo
}

slogger := newSlogger(logfile, cfg.Debug, logLvl)

s := Server{
e: echo.New(),
Expand All @@ -89,12 +95,18 @@ func NewWithConfig(cfg *Config) (*Server, error) {
logger: slogger,
dockerCli: dockerCli,
config: cfg,

getSize: cfg.GetSizer.GetSize,
}
switch cfg.FileSystem {
case "zfs":
s.getSize = fs.New(fs.ZFS).GetSize
case "xfs":
s.getSize = fs.New(fs.XFS).GetSize
default:
s.getSize = fs.New(fs.DEFAULT).GetSize
}

v := validator.New()
s.e.Validator = echoValidator(v.Struct)
validate := validator.New()
s.e.Validator = echoValidator(validate.Struct)
s.e.Debug = cfg.Debug
s.e.HideBanner = true
s.e.Logger.SetOutput(io.Discard)
Expand Down
2 changes: 1 addition & 1 deletion pkg/server/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ func NewTestEnv(t *testing.T) *TestEnv {
dbFile, err := os.CreateTemp("", "yukid*.db")
require.NoError(t, err)
t.Cleanup(func() {
_ = dbFile.Close()
_ = os.Remove(dbFile.Name())
})
db, err := gorm.Open(sqlite.Open(dbFile.Name()), &gorm.Config{
Expand All @@ -65,7 +66,6 @@ func NewTestEnv(t *testing.T) *TestEnv {
db: db,
cron: cron.New(),
logger: slogger,
config: &Config{},
dockerCli: fakedocker.NewClient(),
getSize: fs.New(fs.DEFAULT).GetSize,
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/server/repo_handlers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func TestHandlerReloadAllRepos(t *testing.T) {
t.Cleanup(func() {
_ = os.RemoveAll(stateDir)
})
te.server.config = &Config{
te.server.config = Config{
RepoLogsDir: filepath.Join(stateDir, "logs"),
RepoConfigDir: []string{"/no/such/dir", stateDir},
}
Expand Down
Loading

0 comments on commit 50ab69f

Please sign in to comment.