From 0f4c6f5921ff80d4ce5369ffd1949a8dd2191e40 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Fri, 13 Aug 2021 15:23:03 -0700 Subject: [PATCH] Allow plugin manager to have sub managers --- internal/plugin/manager.go | 48 +++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/internal/plugin/manager.go b/internal/plugin/manager.go index 6da7a7507..fe9259c4b 100644 --- a/internal/plugin/manager.go +++ b/internal/plugin/manager.go @@ -26,10 +26,13 @@ type Manager struct { builtins *Builtin builtinsLoaded bool - legacyLoaded bool + closers []func() error + ctx context.Context discoveredPaths []path.Path + legacyLoaded bool logger hclog.Logger m sync.Mutex + parent *Manager } // Create a new plugin manager @@ -37,10 +40,30 @@ func NewManager(ctx context.Context, l hclog.Logger) *Manager { return &Manager{ Plugins: []*Plugin{}, builtins: NewBuiltins(ctx, l), + ctx: ctx, 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 // running Vagrant runtime func (m *Manager) LoadLegacyPlugins( @@ -218,6 +241,11 @@ func (m *Manager) Find( return } } + + if m.parent != nil { + return m.parent.Find(n, t) + } + return nil, fmt.Errorf("failed to locate plugin `%s`", n) } @@ -239,6 +267,14 @@ func (m *Manager) Typed( "type", t.String(), "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 } @@ -247,6 +283,12 @@ func (m *Manager) Close() (err error) { m.m.Lock() defer m.m.Unlock() + for _, c := range m.closers { + if e := c(); err != nil { + err = multierror.Append(err, e) + } + } + for _, p := range m.Plugins { if e := p.Close(); e != nil { err = multierror.Append(err, e) @@ -305,3 +347,7 @@ func (m *Manager) register( m.Plugins = append(m.Plugins, plg) return } + +func (m *Manager) closer(f func() error) { + m.closers = append(m.closers, f) +}