From 7e68e25994389cfd78a2ce4e4411fa4ddf797c44 Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Mon, 18 Apr 2022 12:11:46 -0700 Subject: [PATCH] Seed target and machine into plugins directly --- internal/core/machine.go | 47 +++++++++++++++++++++-------- internal/core/machine_test.go | 8 ++--- internal/core/project.go | 5 ++-- internal/core/target.go | 56 ++++++++++++++++++++++++++++++----- 4 files changed, 88 insertions(+), 28 deletions(-) diff --git a/internal/core/machine.go b/internal/core/machine.go index eec5a5535..4dfad641c 100644 --- a/internal/core/machine.go +++ b/internal/core/machine.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/go-hclog" "github.com/hashicorp/vagrant-plugin-sdk/component" "github.com/hashicorp/vagrant-plugin-sdk/core" + "github.com/hashicorp/vagrant-plugin-sdk/internal-shared/cacher" "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" ) @@ -20,7 +21,7 @@ type Machine struct { box *Box machine *vagrant_server.Target_Machine logger hclog.Logger - guest core.Guest + cache cacher.Cache } // Close implements core.Machine @@ -79,9 +80,18 @@ func (m *Machine) Box() (b core.Box, err error) { // Guest implements core.Machine func (m *Machine) Guest() (g core.Guest, err error) { - // Try to see if a guest has already been found - if m.guest != nil { - return m.guest, nil + defer func() { + if g != nil { + err = seedPlugin(g, m) + if err == nil { + m.cache.Register("guest", g) + } + } + }() + + i := m.cache.Get("guest") + if i != nil { + return i.(core.Guest), nil } // Check if a guest is provided by the Vagrantfile. If it is, then try @@ -96,8 +106,7 @@ func (m *Machine) Guest() (g core.Guest, err error) { return nil, cerr } if guest != nil { - m.guest = guest.Value.(core.Guest) - g = m.guest + g = guest.Value.(core.Guest) return } } @@ -125,8 +134,8 @@ func (m *Machine) Guest() (g core.Guest, err error) { for _, name := range names { guest := guests[name].Value.(core.Guest) - detected, err := guest.Detect(m.toTarget()) - if err != nil { + detected, gerr := guest.Detect(m.toTarget()) + if gerr != nil { m.logger.Error("guest error on detection check", "plugin", name, "type", "Guest", @@ -138,8 +147,8 @@ func (m *Machine) Guest() (g core.Guest, err error) { m.logger.Info("guest detection complete", "name", name, ) - m.guest = guest - return guest, nil + g = guest + return } } @@ -210,15 +219,27 @@ func (m *Machine) SyncedFolders() (folders []*core.MachineSyncedFolder, err erro defaultType := "virtualbox" folder.Type = &defaultType } - plg, err := m.project.basis.component(m.ctx, component.SyncedFolderType, *folder.Type) - if err != nil { + lookup := "syncedfolder_" + *(folder.Type) + v := m.cache.Get(lookup) + if v == nil { + plg, err := m.project.basis.component(m.ctx, component.SyncedFolderType, *folder.Type) + if err != nil { + return nil, err + } + + v = plg.Value.(core.SyncedFolder) + + m.cache.Register(lookup, v) + } + + if err = seedPlugin(v, m); err != nil { return nil, err } var f *core.Folder mapstructure.Decode(folder, &f) folders = append(folders, &core.MachineSyncedFolder{ - Plugin: plg.Value.(core.SyncedFolder), + Plugin: v.(core.SyncedFolder), Folder: f, }) } diff --git a/internal/core/machine_test.go b/internal/core/machine_test.go index 60ad5dc7b..48922f146 100644 --- a/internal/core/machine_test.go +++ b/internal/core/machine_test.go @@ -146,11 +146,11 @@ func TestMachineConfigedGuest(t *testing.T) { if tc.errors { require.Error(t, err) require.Nil(t, guest) - require.Nil(t, tm.guest) + require.Nil(t, tm.cache.Get("guest")) } else { require.NoError(t, err) require.NotNil(t, guest) - require.NotNil(t, tm.guest) + require.NotNil(t, tm.cache.Get("guest")) } } } @@ -208,7 +208,7 @@ func TestMachineNoConfigGuest(t *testing.T) { if tc.errors { require.Error(t, err) require.Nil(t, guest) - require.Nil(t, tm.guest) + require.Nil(t, tm.cache.Get("guest")) } else { n, _ := guest.PluginName() if n != tc.expectedPluginName { @@ -216,7 +216,7 @@ func TestMachineNoConfigGuest(t *testing.T) { } require.NoError(t, err) require.NotNil(t, guest) - require.NotNil(t, tm.guest) + require.NotNil(t, tm.cache.Get("guest")) } } } diff --git a/internal/core/project.go b/internal/core/project.go index 5d200cc97..10618aa53 100644 --- a/internal/core/project.go +++ b/internal/core/project.go @@ -17,6 +17,7 @@ import ( "github.com/hashicorp/vagrant-plugin-sdk/datadir" "github.com/hashicorp/vagrant-plugin-sdk/helper/path" "github.com/hashicorp/vagrant-plugin-sdk/helper/paths" + "github.com/hashicorp/vagrant-plugin-sdk/internal-shared/cacher" "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant-plugin-sdk/terminal" @@ -203,6 +204,7 @@ func (p *Project) LoadTarget(topts ...TargetOption) (t *Target, err error) { // Create our target t = &Target{ + cache: cacher.New(), ctx: p.ctx, project: p, logger: p.logger, @@ -220,9 +222,6 @@ func (p *Project) LoadTarget(topts ...TargetOption) (t *Target, err error) { return nil, err } - // Set seeds for any plugins that may be used - t.seed(nil) - if t.dir == nil { if t.dir, err = p.dir.Target(t.target.Name); err != nil { return nil, err diff --git a/internal/core/target.go b/internal/core/target.go index 47d309bd3..348862f6d 100644 --- a/internal/core/target.go +++ b/internal/core/target.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/vagrant-plugin-sdk/component" "github.com/hashicorp/vagrant-plugin-sdk/core" "github.com/hashicorp/vagrant-plugin-sdk/datadir" + "github.com/hashicorp/vagrant-plugin-sdk/internal-shared/cacher" "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant-plugin-sdk/terminal" @@ -37,8 +38,7 @@ type Target struct { jobInfo *component.JobInfo closers []func() error ui terminal.UI - - communicator core.Communicator + cache cacher.Cache } func (b *Target) Config() *vagrant_plugin_sdk.Vagrantfile_MachineConfig { @@ -79,6 +79,31 @@ func (t *Target) SetName(value string) (err error) { // Provider implements core.Target func (t *Target) Provider() (p core.Provider, err error) { + i := t.cache.Get("provider") + if i != nil { + p = i.(core.Provider) + return + } + + // TODO: get provider name from Vagrantfile + providerName := "virtualbox" + provider, err := t.project.basis.component( + t.ctx, component.ProviderType, providerName) + + if err != nil { + return + } + p = provider.Value.(core.Provider) + + if err = seedPlugin(p, t); err != nil { + t.logger.Error("failed to seed provider plugin", + "error", err, + ) + + return + } + t.cache.Register("provider", p) + return } @@ -91,18 +116,32 @@ func (t *Target) ProviderName() (string, error) { // Communicate implements core.Target func (t *Target) Communicate() (c core.Communicator, err error) { - if t.communicator != nil { - return t.communicator, nil + i := t.cache.Get("communicator") + if i != nil { + c = i.(core.Communicator) + return } // TODO: get the communicator name from the Vagrantfile // eg. t.target.Configuration.ConfigVm.Communicator communicatorName := "ssh" - communicator, err := t.project.basis.component(t.ctx, component.CommunicatorType, communicatorName) + communicator, err := t.project.basis.component( + t.ctx, component.CommunicatorType, communicatorName) + if err != nil { - return nil, err + return } - t.communicator = communicator.Value.(core.Communicator) - return t.communicator, nil + c = communicator.Value.(core.Communicator) + + if err = seedPlugin(c, t); err != nil { + t.logger.Error("failed to seed communicator plugin", + "error", err, + ) + + return + } + t.cache.Register("communicator", c) + + return } // UpdatedAt implements core.Target @@ -296,6 +335,7 @@ func (t *Target) Machine() core.Machine { Target: t, logger: t.logger, machine: targetMachine, + cache: cacher.New(), } }