Update guest and synced folder plugin loading to seed machine

This commit is contained in:
Chris Roberts 2022-02-09 09:22:39 -08:00 committed by Paul Hinze
parent f9bb6100a8
commit bf393065fa
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0

View File

@ -72,6 +72,19 @@ func (m *Machine) Box() (b core.Box, err error) {
// Guest implements core.Machine
func (m *Machine) Guest() (g core.Guest, err error) {
defer func() {
if g == nil {
return
}
s, ok := g.(core.Seeder)
if !ok {
m.logger.Error("synced folder plugin does not implement seeder interface")
err = fmt.Errorf("cannot seed synced folder plugin")
return
}
err = m.seedWithMachine(s)
return
}()
// Try to see if a guest has already been found
if m.guest != nil {
return m.guest, nil
@ -88,7 +101,8 @@ func (m *Machine) Guest() (g core.Guest, err error) {
if guest != nil {
m.guest = guest.Value.(core.Guest)
m.seedPlugin(m.guest)
return m.guest, nil
g = m.guest
return
}
}
@ -146,6 +160,7 @@ func (m *Machine) Guest() (g core.Guest, err error) {
// TODO(spox): Fix this in the plugin manager
m.seedPlugin(result)
m.guest = result
g = result
return result, nil
}
@ -220,15 +235,32 @@ func (m *Machine) SyncedFolders() (folders []*core.MachineSyncedFolder, err erro
machineConfig := config.ConfigVm
syncedFolders := machineConfig.SyncedFolders
// TODO(spox): Synced folders are getting duped in config. The `seen` is just a temporary
// hack to prevent duplicate entries
seen := map[string]bool{}
folders = []*core.MachineSyncedFolder{}
for _, folder := range syncedFolders {
if _, ok := seen[folder.Destination]; ok {
continue
}
seen[folder.Destination] = true
// TODO: get default synced folder type
folder.Type = "virtualbox"
plg, err := m.project.basis.component(m.ctx, component.SyncedFolderType, folder.Type)
if err != nil {
return nil, err
}
m.seedPlugin(plg.Value)
if s, ok := plg.Value.(core.Seeder); ok {
if err = m.seedWithMachine(s); err != nil {
return nil, err
}
} else {
m.logger.Error("synced folder plugin does not implement seeder interface")
return nil, fmt.Errorf("cannot seed synced folder plugin")
}
var f *core.Folder
mapstructure.Decode(folder, &f)
folders = append(folders, &core.MachineSyncedFolder{
@ -253,5 +285,40 @@ func (m *Machine) toTarget() core.Target {
return m
}
func (m *Machine) seedWithMachine(s core.Seeder) error {
m.logger.Debug("seeding machine into plugin",
"plugin", hclog.Fmt("%T", s),
)
seeds, err := s.Seeds()
if err != nil {
m.logger.Error("failed to fetch seeds from plugin",
"plugin", hclog.Fmt("%T", s),
"error", err,
)
return err
}
for _, t := range seeds.Typed {
sm, ok := t.(*Machine)
if !ok {
continue
}
if m.target.ResourceId == sm.target.ResourceId {
return nil
}
}
seeds.Typed = append(seeds.Typed, m)
if err = s.Seed(seeds); err != nil {
m.logger.Error("failed to seed plugin",
"plugin", hclog.Fmt("%T", s),
"error", err,
)
}
return nil
}
var _ core.Machine = (*Machine)(nil)
var _ core.Target = (*Machine)(nil)