84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hashicorp/go-hclog"
|
|
"github.com/hashicorp/vagrant-plugin-sdk/core"
|
|
"github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk"
|
|
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
|
|
"github.com/hashicorp/vagrant/internal/serverclient"
|
|
"github.com/mitchellh/mapstructure"
|
|
)
|
|
|
|
// TargetIndex represents
|
|
type TargetIndex struct {
|
|
ctx context.Context
|
|
logger hclog.Logger
|
|
|
|
client *serverclient.VagrantClient
|
|
project *Project
|
|
// The below are resources we need to close when Close is called, if non-nil
|
|
closers []func() error
|
|
}
|
|
|
|
func (t *TargetIndex) Delete(target core.Target) (err error) {
|
|
_, err = t.client.DeleteTarget(
|
|
t.ctx,
|
|
&vagrant_server.DeleteTargetRequest{
|
|
Target: target.Ref().(*vagrant_plugin_sdk.Ref_Target),
|
|
},
|
|
)
|
|
return
|
|
}
|
|
|
|
func (t *TargetIndex) Get(ref *vagrant_plugin_sdk.Ref_Target) (entry core.Target, err error) {
|
|
return t.project.Target(ref.Name)
|
|
}
|
|
|
|
func (t *TargetIndex) Includes(ref *vagrant_plugin_sdk.Ref_Target) (exists bool, err error) {
|
|
var req *vagrant_server.Target
|
|
mapstructure.Decode(ref, &req)
|
|
resp, err := t.client.FindTarget(
|
|
t.ctx,
|
|
&vagrant_server.FindTargetRequest{
|
|
Target: req,
|
|
},
|
|
)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
// TODO: Not sure what should be returned by the api
|
|
// if there is not Target found. For now assuming that
|
|
// if a target is not found, no error is returned,
|
|
// and the resp is nil
|
|
if resp == nil {
|
|
exists = false
|
|
} else {
|
|
exists = true
|
|
}
|
|
return
|
|
}
|
|
|
|
func (t *TargetIndex) Set(entry core.Target) (updatedEntry core.Target, err error) {
|
|
target := entry.(*Target)
|
|
updatedTarget, err := t.client.UpsertTarget(
|
|
t.ctx,
|
|
&vagrant_server.UpsertTargetRequest{
|
|
Target: target.target,
|
|
},
|
|
)
|
|
// TODO: check if this actually gets back a full target
|
|
updatedEntry, err = NewTarget(
|
|
t.ctx,
|
|
WithTargetName(updatedTarget.Target.Name),
|
|
)
|
|
return
|
|
}
|
|
|
|
func (t *TargetIndex) All() (targets []core.Target, err error) {
|
|
return t.project.Targets()
|
|
}
|
|
|
|
var _ core.TargetIndex = (*TargetIndex)(nil)
|