Seed target and machine into plugins directly
This commit is contained in:
parent
373fc9c7b4
commit
7e68e25994
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
@ -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"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user