bug: Make bus Initialize idempotent, add Reload

This commit is contained in:
Ettore Di Giacinto
2022-08-20 21:47:16 +00:00
committed by Itxaka
parent 1254c09745
commit 6b5c4d416c
2 changed files with 41 additions and 28 deletions

View File

@@ -68,7 +68,7 @@ func Run(opts ...Option) error {
} }
// Re-load providers // Re-load providers
bus.Manager.LoadProviders() bus.Reload()
err = machine.CreateSentinel("bundles") err = machine.CreateSentinel("bundles")
if !c.IgnoreBundleErrors && err != nil { if !c.IgnoreBundleErrors && err != nil {
return err return err

View File

@@ -10,14 +10,24 @@ import (
) )
// Manager is the bus instance manager, which subscribes plugins to events emitted. // Manager is the bus instance manager, which subscribes plugins to events emitted.
var Manager = &Bus{ var Manager = NewBus()
Manager: pluggable.NewManager(
bus.AllEvents, func NewBus() *Bus {
), return &Bus{
Manager: pluggable.NewManager(
bus.AllEvents,
),
}
}
func Reload() {
Manager = NewBus()
Manager.Initialize()
} }
type Bus struct { type Bus struct {
*pluggable.Manager *pluggable.Manager
registered bool
} }
func (b *Bus) LoadProviders() { func (b *Bus) LoadProviders() {
@@ -26,29 +36,32 @@ func (b *Bus) LoadProviders() {
} }
func (b *Bus) Initialize() { func (b *Bus) Initialize() {
b.LoadProviders() if !b.registered {
for i := range b.Manager.Events { b.LoadProviders()
e := b.Manager.Events[i] for i := range b.Manager.Events {
b.Manager.Response(e, func(p *pluggable.Plugin, r *pluggable.EventResponse) { e := b.Manager.Events[i]
if os.Getenv("BUS_DEBUG") == "true" { b.Manager.Response(e, func(p *pluggable.Plugin, r *pluggable.EventResponse) {
fmt.Println( if os.Getenv("BUS_DEBUG") == "true" {
fmt.Sprintf("[provider event: %s]", e), fmt.Println(
"received from", fmt.Sprintf("[provider event: %s]", e),
p.Name, "received from",
"at", p.Name,
p.Executable, "at",
r, 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 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
} }
} }