diff --git a/builtin/myplugin/host/alwaystrue.go b/builtin/myplugin/host/alwaystrue.go index b0d30fd20..e995a1292 100644 --- a/builtin/myplugin/host/alwaystrue.go +++ b/builtin/myplugin/host/alwaystrue.go @@ -33,4 +33,5 @@ func (h *AlwaysTrueHost) InitializeCapabilities() (err error) { var ( _ component.Host = (*AlwaysTrueHost)(nil) + _ sdkcore.Host = (*AlwaysTrueHost)(nil) ) diff --git a/builtin/otherplugin/command.go b/builtin/otherplugin/command.go index 1bef1c037..52ab52231 100644 --- a/builtin/otherplugin/command.go +++ b/builtin/otherplugin/command.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/go-argmapper" "github.com/hashicorp/vagrant-plugin-sdk/component" plugincore "github.com/hashicorp/vagrant-plugin-sdk/core" + // "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant-plugin-sdk/terminal" //"google.golang.org/protobuf/types/known/anypb" @@ -158,8 +159,8 @@ func (c *Command) ExecuteOfni(trm terminal.UI) int64 { func (c *Command) ExecuteUseHostPlugin(trm terminal.UI, host plugincore.Host) int64 { trm.Output("I'm going to use a the host plugin to do something!") - host.HasCapability("write_hello") - if ok, _ := host.HasCapability("write_hello"); ok { + ok := host.HasCapability("write_hello") + if ok { trm.Output("Writing to file using `write_hello` capability") host.Capability("write_hello", argmapper.Typed(trm)) } else { diff --git a/internal/core/basis.go b/internal/core/basis.go index dc193bd64..544ab50a3 100644 --- a/internal/core/basis.go +++ b/internal/core/basis.go @@ -384,6 +384,31 @@ func (b *Basis) Run(ctx context.Context, task *vagrant_server.Task) (err error) return } +func (b *Basis) findHostPlugin(ctx context.Context) (*Component, error) { + f := b.factories[component.HostType] + for _, name := range f.Registered() { + if name != "myplugin" { + continue + } + h, err := componentCreatorMap[component.HostType].Create(ctx, b, name) + if err != nil { + return nil, err + } + detected, err := b.callDynamicFunc( + ctx, + b.logger, + (interface{})(nil), + h, + h.Value.(component.Host).DetectFunc(), + ) + if detected != nil && detected.(bool) { + return h, nil + } + // h.Close() + } + return nil, errors.New("host plugin not found") +} + func (b *Basis) component(ctx context.Context, typ component.Type, name string) (*Component, error) { // If this is a command type component, the plugin is registered // as only the root command diff --git a/internal/core/mappers.go b/internal/core/mappers.go index b84092e20..a09f4d056 100644 --- a/internal/core/mappers.go +++ b/internal/core/mappers.go @@ -94,9 +94,3 @@ func FlagsToProtoMapper(input []*option.Option) []*vagrant_server.Job_Flag { } return output } - -func HostComponentToProtoMapper(input Component) *vagrant_plugin_sdk.Args_Host { - return &vagrant_plugin_sdk.Args_Host{ - ServerAddr: input.Info.ServerAddr, - } -} diff --git a/internal/core/project.go b/internal/core/project.go index dc9389d40..0d2724989 100644 --- a/internal/core/project.go +++ b/internal/core/project.go @@ -97,8 +97,11 @@ func (p *Project) DefaultPrivateKey() (path string, err error) { } func (p *Project) Host() (host core.Host, err error) { - // TODO: implement - return + hostComponent, err := p.basis.findHostPlugin(p.ctx) + if err != nil { + return nil, err + } + return hostComponent.Value.(core.Host), nil } func (p *Project) MachineNames() (names []string, err error) { @@ -232,12 +235,7 @@ func (p *Project) Components(ctx context.Context) (results []*Component, err err func (p *Project) Run(ctx context.Context, task *vagrant_server.Task) (err error) { p.logger.Debug("running new task", "project", p, "task", task) - hostPluginName, err := p.findHostPlugin(ctx) - if hostPluginName != "" { - - } cmd, err := p.basis.component(ctx, component.CommandType, task.Component.Name) - hostPlugin, err := p.basis.component(ctx, component.HostType, hostPluginName) if err != nil { return err @@ -248,7 +246,6 @@ func (p *Project) Run(ctx context.Context, task *vagrant_server.Task) (err error return } - hostComponentToProtoMapper, _ := argmapper.NewFunc(HostComponentToProtoMapper) result, err := p.callDynamicFunc( ctx, p.logger, diff --git a/internal/core/target.go b/internal/core/target.go index 59cc6580c..5854e4995 100644 --- a/internal/core/target.go +++ b/internal/core/target.go @@ -166,13 +166,19 @@ func (t *Target) Run(ctx context.Context, task *vagrant_server.Task) (err error) return } + host, _ := t.project.Host() + + ok := host.HasCapability("write_hello") + if ok { + } + result, err := t.callDynamicFunc( ctx, t.logger, (interface{})(nil), cmd, cmd.Value.(component.Command).ExecuteFunc(strings.Split(task.CommandName, " ")), - argmapper.Typed(task.CliArgs, t.jobInfo, t.dir), + argmapper.Typed(task.CliArgs, t.jobInfo, t.dir, host), ) if err != nil || result == nil || result.(int64) != 0 {