Move functions from machine to target. Clean arguments for dynamic call

This commit is contained in:
Chris Roberts 2021-05-25 13:27:06 -07:00 committed by Paul Hinze
parent 2ee3f6bfd3
commit c2d19f7a95
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0
2 changed files with 76 additions and 23 deletions

View File

@ -120,16 +120,32 @@ func (p *Project) JobInfo() *component.JobInfo {
return p.jobInfo
}
func (p *Project) Target(nameOrId string) *Target {
func (p *Project) Target(nameOrId string) (*Target, error) {
if t, ok := p.targets[nameOrId]; ok {
return t
return t, nil
}
for _, t := range p.targets {
if t.target.ResourceId == nameOrId {
return t
return t, nil
}
}
return nil
return nil, errors.New("requested target does not exist")
}
func (p *Project) TargetNames() ([]string, error) {
var names []string
for _, t := range p.project.Targets {
names = append(names, t.Name)
}
return names, nil
}
func (p *Project) TargetIds() ([]string, error) {
var ids []string
for _, t := range p.project.Targets {
ids = append(ids, t.ResourceId)
}
return ids, nil
}
func (p *Project) LoadTarget(topts ...TargetOption) (t *Target, err error) {
@ -153,10 +169,18 @@ func (p *Project) LoadTarget(topts ...TargetOption) (t *Target, err error) {
}
// If the machine is already loaded, return that
if target, ok := p.targets[t.target.Name]; ok {
if target, ok := p.targets[t.target.ResourceId]; ok {
return target, nil
}
p.targets[t.target.ResourceId] = t
if t.dir == nil {
if t.dir, err = p.dir.Target(t.target.Name); err != nil {
return
}
}
// Ensure any modifications to the target are persisted
t.Closer(func() error { return t.Save() })
@ -224,9 +248,7 @@ func (p *Project) Run(ctx context.Context, task *vagrant_server.Task) (err error
(interface{})(nil),
cmd,
cmd.Value.(component.Command).ExecuteFunc(strings.Split(task.CommandName, " ")),
argmapper.Typed(task.CliArgs),
argmapper.Typed(p),
argmapper.Named("project", p),
argmapper.Typed(task.CliArgs, p.jobInfo, p.dir),
)
if err != nil || result == nil || result.(int64) != 0 {
p.logger.Error("failed to execute command", "type", component.CommandType, "name", task.Component.Name, "result", result, "error", err)
@ -311,13 +333,12 @@ func (p *Project) callDynamicFunc(
args = append(args,
argmapper.ConverterFunc(p.mappers...),
argmapper.Typed(
p.jobInfo,
p.dir,
p.UI,
),
argmapper.Typed(p),
argmapper.Named("project", p),
argmapper.Named("project_ui", p.UI),
)
p.logger.Info("running dynamic call from project", "project", p)
return p.basis.callDynamicFunc(ctx, log, result, c, f, args...)
}
@ -454,5 +475,4 @@ func WithProjectRef(r *vagrant_plugin_sdk.Ref_Project) ProjectOption {
}
}
var _ *Project = (*Project)(nil)
var _ core.Project = (*Project)(nil)

View File

@ -5,6 +5,7 @@ import (
"errors"
"strings"
"sync"
"time"
"github.com/golang/protobuf/proto"
"github.com/hashicorp/go-argmapper"
@ -19,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/helper/path"
"github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk"
"github.com/hashicorp/vagrant-plugin-sdk/terminal"
@ -55,6 +57,30 @@ func (t *Target) Name() (string, error) {
return t.target.Name, nil
}
func (t *Target) SetName(value string) (err error) {
return
}
func (t *Target) Provider() (p core.Provider, err error) {
return
}
func (t *Target) VagrantfileName() (name string, err error) {
return
}
func (t *Target) VagrantfilePath() (p path.Path, err error) {
return
}
func (t *Target) Communicate() (c core.Communicator, err error) {
return
}
func (t *Target) UpdatedAt() (tm *time.Time, err error) {
return
}
func (t *Target) ResourceId() (string, error) {
return t.target.ResourceId, nil
}
@ -79,6 +105,10 @@ func (t *Target) Record() (*anypb.Any, error) {
return t.target.Record, nil
}
func (t *Target) Specialize(_ interface{}) (core.Machine, error) {
return t.Machine(), nil
}
func (t *Target) JobInfo() *component.JobInfo {
return t.jobInfo
}
@ -142,9 +172,7 @@ func (t *Target) Run(ctx context.Context, task *vagrant_server.Task) (err error)
(interface{})(nil),
cmd,
cmd.Value.(component.Command).ExecuteFunc(strings.Split(task.CommandName, " ")),
argmapper.Typed(task.CliArgs),
argmapper.Typed(t),
argmapper.Named("target", t),
argmapper.Typed(task.CliArgs, t.jobInfo, t.dir),
)
if err != nil || result == nil || result.(int64) != 0 {
@ -169,13 +197,12 @@ func (t *Target) callDynamicFunc(
defer t.ui.Status().Close()
args = append(args,
argmapper.Typed(
t.jobInfo,
t.dir,
t.UI,
),
argmapper.Typed(t),
argmapper.Named("target", t),
argmapper.Named("target_ui", t.UI),
)
t.logger.Info("running dynamic call from target", "target", t)
return t.project.callDynamicFunc(ctx, log, result, c, f, args...)
}
@ -195,6 +222,12 @@ func (t *Target) doOperation(ctx context.Context, log hclog.Logger, op operation
return doOperation(ctx, log, t, op)
}
func (t *Target) Machine() core.Machine {
return &Machine{
Target: t,
}
}
type TargetOption func(*Target) error
func WithTargetName(name string) TargetOption {
@ -272,4 +305,4 @@ func WithTargetRef(r *vagrant_plugin_sdk.Ref_Target) TargetOption {
}
}
var _ *Target = (*Target)(nil)
var _ core.Target = (*Target)(nil)