diff --git a/cmd/silod/main.go b/cmd/silod/main.go index 7530160..28f00a8 100644 --- a/cmd/silod/main.go +++ b/cmd/silod/main.go @@ -20,6 +20,7 @@ import ( "github.com/kindredsystems/silo/internal/config" "github.com/kindredsystems/silo/internal/db" "github.com/kindredsystems/silo/internal/jobdef" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/storage" "github.com/rs/zerolog" @@ -219,6 +220,16 @@ func main() { } } + // Initialize module registry + registry := modules.NewRegistry() + if err := modules.LoadState(registry, cfg, database.Pool()); err != nil { + logger.Fatal().Err(err).Msg("failed to load module state") + } + for _, m := range registry.All() { + logger.Info().Str("module", m.ID).Bool("enabled", registry.IsEnabled(m.ID)). + Bool("required", m.Required).Msg("module") + } + // Create SSE broker and server state broker := api.NewBroker(logger) serverState := api.NewServerState(logger, store, broker) @@ -232,27 +243,30 @@ func main() { // Create API server server := api.NewServer(logger, database, schemas, cfg.Schemas.Directory, store, authService, sessionManager, oidcBackend, &cfg.Auth, broker, serverState, - jobDefs, cfg.Jobs.Directory) + jobDefs, cfg.Jobs.Directory, registry, cfg) router := api.NewRouter(server, logger) - // Start background sweepers for job/runner timeouts - go func() { - ticker := time.NewTicker(time.Duration(cfg.Jobs.JobTimeoutCheck) * time.Second) - defer ticker.Stop() - for range ticker.C { - if n, err := jobRepo.TimeoutExpiredJobs(ctx); err != nil { - logger.Error().Err(err).Msg("job timeout sweep failed") - } else if n > 0 { - logger.Info().Int64("count", n).Msg("timed out expired jobs") - } + // Start background sweepers for job/runner timeouts (only when jobs module enabled) + if registry.IsEnabled(modules.Jobs) { + go func() { + ticker := time.NewTicker(time.Duration(cfg.Jobs.JobTimeoutCheck) * time.Second) + defer ticker.Stop() + for range ticker.C { + if n, err := jobRepo.TimeoutExpiredJobs(ctx); err != nil { + logger.Error().Err(err).Msg("job timeout sweep failed") + } else if n > 0 { + logger.Info().Int64("count", n).Msg("timed out expired jobs") + } - if n, err := jobRepo.ExpireStaleRunners(ctx, time.Duration(cfg.Jobs.RunnerTimeout)*time.Second); err != nil { - logger.Error().Err(err).Msg("runner expiry sweep failed") - } else if n > 0 { - logger.Info().Int64("count", n).Msg("expired stale runners") + if n, err := jobRepo.ExpireStaleRunners(ctx, time.Duration(cfg.Jobs.RunnerTimeout)*time.Second); err != nil { + logger.Error().Err(err).Msg("runner expiry sweep failed") + } else if n > 0 { + logger.Info().Int64("count", n).Msg("expired stale runners") + } } - } - }() + }() + logger.Info().Msg("job/runner sweepers started") + } // Create HTTP server addr := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) diff --git a/internal/api/auth_handlers_test.go b/internal/api/auth_handlers_test.go index 85e3a17..d16769a 100644 --- a/internal/api/auth_handlers_test.go +++ b/internal/api/auth_handlers_test.go @@ -11,6 +11,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/kindredsystems/silo/internal/auth" "github.com/kindredsystems/silo/internal/db" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/testutil" "github.com/rs/zerolog" @@ -38,8 +39,10 @@ func newAuthTestServer(t *testing.T) *Server { nil, // authConfig broker, state, - nil, // jobDefs - "", // jobDefsDir + nil, // jobDefs + "", // jobDefsDir + modules.NewRegistry(), // modules + nil, // cfg ) } diff --git a/internal/api/bom_handlers_test.go b/internal/api/bom_handlers_test.go index d63ca31..4b890f4 100644 --- a/internal/api/bom_handlers_test.go +++ b/internal/api/bom_handlers_test.go @@ -11,6 +11,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/kindredsystems/silo/internal/auth" "github.com/kindredsystems/silo/internal/db" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/testutil" "github.com/rs/zerolog" @@ -35,8 +36,10 @@ func newTestServer(t *testing.T) *Server { nil, // authConfig (nil = dev mode) broker, state, - nil, // jobDefs - "", // jobDefsDir + nil, // jobDefs + "", // jobDefsDir + modules.NewRegistry(), // modules + nil, // cfg ) } diff --git a/internal/api/csv_handlers_test.go b/internal/api/csv_handlers_test.go index 85edb10..bc194a7 100644 --- a/internal/api/csv_handlers_test.go +++ b/internal/api/csv_handlers_test.go @@ -13,6 +13,7 @@ import ( "testing" "github.com/go-chi/chi/v5" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/testutil" "github.com/rs/zerolog" @@ -64,8 +65,10 @@ func newTestServerWithSchemas(t *testing.T) *Server { nil, // authConfig broker, state, - nil, // jobDefs - "", // jobDefsDir + nil, // jobDefs + "", // jobDefsDir + modules.NewRegistry(), // modules + nil, // cfg ) } diff --git a/internal/api/dag_handlers_test.go b/internal/api/dag_handlers_test.go index 15cdae4..f987054 100644 --- a/internal/api/dag_handlers_test.go +++ b/internal/api/dag_handlers_test.go @@ -10,6 +10,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/kindredsystems/silo/internal/db" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/testutil" "github.com/rs/zerolog" @@ -29,6 +30,7 @@ func newDAGTestServer(t *testing.T) *Server { nil, nil, nil, nil, nil, broker, state, nil, "", + modules.NewRegistry(), nil, ) } diff --git a/internal/api/handlers.go b/internal/api/handlers.go index 3b3493f..3278953 100644 --- a/internal/api/handlers.go +++ b/internal/api/handlers.go @@ -19,6 +19,7 @@ import ( "github.com/kindredsystems/silo/internal/config" "github.com/kindredsystems/silo/internal/db" "github.com/kindredsystems/silo/internal/jobdef" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/partnum" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/storage" @@ -48,6 +49,8 @@ type Server struct { jobs *db.JobRepository jobDefs map[string]*jobdef.Definition jobDefsDir string + modules *modules.Registry + cfg *config.Config } // NewServer creates a new API server. @@ -65,6 +68,8 @@ func NewServer( state *ServerState, jobDefs map[string]*jobdef.Definition, jobDefsDir string, + registry *modules.Registry, + cfg *config.Config, ) *Server { items := db.NewItemRepository(database) projects := db.NewProjectRepository(database) @@ -96,6 +101,8 @@ func NewServer( jobs: jobs, jobDefs: jobDefs, jobDefsDir: jobDefsDir, + modules: registry, + cfg: cfg, } } diff --git a/internal/api/job_handlers_test.go b/internal/api/job_handlers_test.go index a26be57..b9899f1 100644 --- a/internal/api/job_handlers_test.go +++ b/internal/api/job_handlers_test.go @@ -10,6 +10,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/kindredsystems/silo/internal/db" + "github.com/kindredsystems/silo/internal/modules" "github.com/kindredsystems/silo/internal/schema" "github.com/kindredsystems/silo/internal/testutil" "github.com/rs/zerolog" @@ -29,6 +30,7 @@ func newJobTestServer(t *testing.T) *Server { nil, nil, nil, nil, nil, broker, state, nil, "", + modules.NewRegistry(), nil, ) }