Allow plugin manager to have sub managers
This commit is contained in:
parent
3bbab430bc
commit
0f4c6f5921
@ -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)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user