diff --git a/internal/core/project.go b/internal/core/project.go index eb416d8f2..83ea06420 100644 --- a/internal/core/project.go +++ b/internal/core/project.go @@ -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) diff --git a/internal/core/target.go b/internal/core/target.go index d1f5dfebe..007c5d691 100644 --- a/internal/core/target.go +++ b/internal/core/target.go @@ -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)