diff --git a/bus/events.go b/bus/events.go index 09e906e..c52d422 100644 --- a/bus/events.go +++ b/bus/events.go @@ -83,14 +83,16 @@ var AllEvents = []pluggable.EventType{ EventRecoveryStop, EventAvailableReleases, EventVersionImage, + InitProviderInstall, + InitProviderConfigure, } // IsEventDefined checks wether an event is defined in the bus. // It accepts strings or EventType, returns a boolean indicating that // the event was defined among the events emitted by the bus. -func IsEventDefined(i interface{}) bool { +func IsEventDefined(i interface{}, events ...pluggable.EventType) bool { checkEvent := func(e pluggable.EventType) bool { - for _, ee := range AllEvents { + for _, ee := range append(AllEvents, events...) { if ee == e { return true } diff --git a/bus/manager.go b/bus/manager.go new file mode 100644 index 0000000..855cdc1 --- /dev/null +++ b/bus/manager.go @@ -0,0 +1,116 @@ +package bus + +import ( + "os" + + "github.com/kairos-io/kairos-sdk/types" + "github.com/mudler/go-pluggable" +) + +const ( + DefaultProviderPrefix = "agent-provider" + DefaultLogName = "kairos-bus" +) + +var DefaultProviderPaths = []string{"/system/providers", "/usr/local/system/providers"} + +func NewBus(withEvents ...pluggable.EventType) *Bus { + if len(withEvents) == 0 { + withEvents = AllEvents + } + return &Bus{ + Manager: pluggable.NewManager(withEvents), + } +} + +type Bus struct { + *pluggable.Manager + registered bool + logger *types.KairosLogger // Fully override the logger + logLevel string // Log level for the logger, defaults to "info" unless BUS_DEBUG is set to "true". This only valid if logger is not set. + logName string // Name of the logger, defaults to "bus". This only valid if logger is not set. + providerPrefix string // Prefix for provider plugins, defaults to "agent-provider". This is used to autoload providers. + providerPaths []string // Paths to search for provider plugins, defaults to system and current working directory. +} + +func (b *Bus) LoadProviders() *pluggable.Manager { + return b.Autoload(b.providerPrefix, b.providerPaths...).Register() +} + +func (b *Bus) Initialize(o ...Options) { + if b.registered { + return + } + + for _, opt := range o { + opt(b) + } + + // If no provider prefix is set, use the default "agent-provider" + if b.providerPrefix == "" { + b.providerPrefix = DefaultProviderPrefix + } + + // If no provider paths are set, use the default system paths and current working directory + if b.providerPaths == nil { + wd, _ := os.Getwd() + b.providerPaths = append(DefaultProviderPaths, wd) + } + + // If no logger is set, create a new one with the default log level and name + if b.logger == nil { + if b.logLevel == "" { + b.logLevel = "info" + } + + if os.Getenv("BUS_DEBUG") == "true" { + b.logLevel = "debug" + } + if b.logName == "" { + b.logName = DefaultLogName + } + l := types.NewKairosLogger(b.logName, b.logLevel, false) + b.logger = &l + } + + b.LoadProviders() + b.registered = true + b.logger.Logger.Debug().Interface("bus", b).Msg("Bus initialized with options") +} + +type Options func(d *Bus) + +// WithLogger allows to set a custom logger for the bus. If set, it will override the default logger. +func WithLogger(logger *types.KairosLogger) Options { + return func(d *Bus) { + d.logger = logger + } +} + +// WithLoggerLevel allows to set the log level for the bus logger. If set, it will override the default log level. +func WithLoggerLevel(level string) Options { + return func(d *Bus) { + d.logLevel = level + } +} + +// WithLoggerName allows to set the name of the logger for the bus. If set, it will override the default logger name. +func WithLoggerName(name string) Options { + return func(d *Bus) { + d.logName = name + } +} + +// WithProviderPrefix allows to set the prefix for provider plugins. If set, it will override the default prefix. +func WithProviderPrefix(prefix string) Options { + return func(d *Bus) { + d.providerPrefix = prefix + } +} + +// WithProviderPaths allows to set the paths to search for provider plugins. If set, it will override the default paths. +func WithProviderPaths(paths ...string) Options { + return func(d *Bus) { + d.providerPaths = paths + } +} diff --git a/go.mod b/go.mod index 36ed3ec..1c5b2fc 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/kairos-io/kairos-sdk -go 1.24.2 +go 1.24.5 require ( github.com/anatol/luks.go v0.0.0-20250316021219-8cd744c3576f