Allow plugin manager to have sub managers

This commit is contained in:
Chris Roberts 2021-08-13 15:23:03 -07:00 committed by Paul Hinze
parent 3bbab430bc
commit 0f4c6f5921
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0

View File

@ -26,10 +26,13 @@ type Manager struct {
builtins *Builtin builtins *Builtin
builtinsLoaded bool builtinsLoaded bool
legacyLoaded bool closers []func() error
ctx context.Context
discoveredPaths []path.Path discoveredPaths []path.Path
legacyLoaded bool
logger hclog.Logger logger hclog.Logger
m sync.Mutex m sync.Mutex
parent *Manager
} }
// Create a new plugin manager // Create a new plugin manager
@ -37,10 +40,30 @@ func NewManager(ctx context.Context, l hclog.Logger) *Manager {
return &Manager{ return &Manager{
Plugins: []*Plugin{}, Plugins: []*Plugin{},
builtins: NewBuiltins(ctx, l), builtins: NewBuiltins(ctx, l),
ctx: ctx,
logger: l, logger: l,
} }
} }
// Create a sub manager based off current manager
func (m *Manager) Sub(name string) *Manager {
if name == "" {
name = "submanager"
}
s := &Manager{
builtinsLoaded: true,
closers: []func() error{},
ctx: m.ctx,
discoveredPaths: m.discoveredPaths,
legacyLoaded: true,
logger: m.logger.Named(name),
parent: m,
}
m.closer(func() error { return s.Close() })
return m
}
// Load legacy Ruby based Vagrant plugins using a // Load legacy Ruby based Vagrant plugins using a
// running Vagrant runtime // running Vagrant runtime
func (m *Manager) LoadLegacyPlugins( func (m *Manager) LoadLegacyPlugins(
@ -218,6 +241,11 @@ func (m *Manager) Find(
return return
} }
} }
if m.parent != nil {
return m.parent.Find(n, t)
}
return nil, fmt.Errorf("failed to locate plugin `%s`", n) return nil, fmt.Errorf("failed to locate plugin `%s`", n)
} }
@ -239,6 +267,14 @@ func (m *Manager) Typed(
"type", t.String(), "type", t.String(),
"count", len(result)) "count", len(result))
if m.parent != nil {
pt, err := m.parent.Typed(t)
if err != nil {
return nil, err
}
result = append(result, pt...)
}
return result, nil return result, nil
} }
@ -247,6 +283,12 @@ func (m *Manager) Close() (err error) {
m.m.Lock() m.m.Lock()
defer m.m.Unlock() defer m.m.Unlock()
for _, c := range m.closers {
if e := c(); err != nil {
err = multierror.Append(err, e)
}
}
for _, p := range m.Plugins { for _, p := range m.Plugins {
if e := p.Close(); e != nil { if e := p.Close(); e != nil {
err = multierror.Append(err, e) err = multierror.Append(err, e)
@ -305,3 +347,7 @@ func (m *Manager) register(
m.Plugins = append(m.Plugins, plg) m.Plugins = append(m.Plugins, plg)
return return
} }
func (m *Manager) closer(f func() error) {
m.closers = append(m.closers, f)
}