diff --git a/internal/agent/agent.go b/internal/agent/agent.go index e2e749d..668a297 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -68,7 +68,7 @@ func Run(opts ...Option) error { } // Re-load providers - bus.Manager.LoadProviders() + bus.Reload() err = machine.CreateSentinel("bundles") if !c.IgnoreBundleErrors && err != nil { return err diff --git a/internal/bus/bus.go b/internal/bus/bus.go index 2a50906..a8370e6 100644 --- a/internal/bus/bus.go +++ b/internal/bus/bus.go @@ -10,14 +10,24 @@ import ( ) // Manager is the bus instance manager, which subscribes plugins to events emitted. -var Manager = &Bus{ - Manager: pluggable.NewManager( - bus.AllEvents, - ), +var Manager = NewBus() + +func NewBus() *Bus { + return &Bus{ + Manager: pluggable.NewManager( + bus.AllEvents, + ), + } +} + +func Reload() { + Manager = NewBus() + Manager.Initialize() } type Bus struct { *pluggable.Manager + registered bool } func (b *Bus) LoadProviders() { @@ -26,29 +36,32 @@ func (b *Bus) LoadProviders() { } func (b *Bus) Initialize() { - b.LoadProviders() - for i := range b.Manager.Events { - e := b.Manager.Events[i] - b.Manager.Response(e, func(p *pluggable.Plugin, r *pluggable.EventResponse) { - if os.Getenv("BUS_DEBUG") == "true" { - fmt.Println( - fmt.Sprintf("[provider event: %s]", e), - "received from", - p.Name, - "at", - p.Executable, - r, - ) - } - if r.Errored() { - err := fmt.Sprintf("Provider %s at %s had an error: %s", p.Name, p.Executable, r.Error) - fmt.Println(err) - os.Exit(1) - } else { - if r.State != "" { - fmt.Println(fmt.Sprintf("[provider event: %s]", e), r.State) + if !b.registered { + b.LoadProviders() + for i := range b.Manager.Events { + e := b.Manager.Events[i] + b.Manager.Response(e, func(p *pluggable.Plugin, r *pluggable.EventResponse) { + if os.Getenv("BUS_DEBUG") == "true" { + fmt.Println( + fmt.Sprintf("[provider event: %s]", e), + "received from", + p.Name, + "at", + p.Executable, + r, + ) } - } - }) + if r.Errored() { + err := fmt.Sprintf("Provider %s at %s had an error: %s", p.Name, p.Executable, r.Error) + fmt.Println(err) + os.Exit(1) + } else { + if r.State != "" { + fmt.Println(fmt.Sprintf("[provider event: %s]", e), r.State) + } + } + }) + } + b.registered = true } }