Seed target and machine into plugins directly

This commit is contained in:
Chris Roberts 2022-04-18 12:11:46 -07:00 committed by Paul Hinze
parent 373fc9c7b4
commit 7e68e25994
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0
4 changed files with 88 additions and 28 deletions

View File

@ -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,
})
}

View File

@ -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"))
}
}
}

View File

@ -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

View File

@ -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(),
}
}