From 707039eb267bd7dae8ff76a63ebb869ee0c90a35 Mon Sep 17 00:00:00 2001 From: Michael Kuzmin Date: Wed, 21 Mar 2018 02:03:47 +0300 Subject: [PATCH] Detect datastore automatically (#69) --- clone/builder_acc_test.go | 1 - driver/datastore.go | 28 +++++++++++++++++++++++++--- driver/datastore_acc_test.go | 2 +- driver/vm.go | 4 ++-- driver/vm_clone_acc_test.go | 1 - driver/vm_create_acc_test.go | 1 - examples/driver/main.go | 25 +++++++++++++++++++++++++ iso/builder.go | 1 + iso/builder_acc_test.go | 1 - iso/step_add_floppy.go | 5 +++-- 10 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 examples/driver/main.go diff --git a/clone/builder_acc_test.go b/clone/builder_acc_test.go index e788dcf60..8c07648ec 100644 --- a/clone/builder_acc_test.go +++ b/clone/builder_acc_test.go @@ -27,7 +27,6 @@ func defaultConfig() map[string]interface{} { "template": "alpine", "host": "esxi-1.vsphere65.test", - "datastore": "datastore1", "ssh_username": "root", "ssh_password": "jetbrains", diff --git a/driver/datastore.go b/driver/datastore.go index a0569457e..ef37b416c 100644 --- a/driver/datastore.go +++ b/driver/datastore.go @@ -5,6 +5,7 @@ import ( "github.com/vmware/govmomi/vim25/types" "github.com/vmware/govmomi/vim25/mo" "github.com/vmware/govmomi/vim25/soap" + "fmt" ) type Datastore struct { @@ -19,12 +20,33 @@ func (d *Driver) NewDatastore(ref *types.ManagedObjectReference) *Datastore { } } -// If name is an empty string, returns the default datastore (is exists) -func (d *Driver) FindDatastore(name string) (*Datastore, error) { - ds, err := d.finder.DatastoreOrDefault(d.ctx, name) +// If name is an empty string, then resolve host's one +func (d *Driver) FindDatastore(name string, host string) (*Datastore, error) { + if name == "" { + h, err := d.FindHost(host) + if err != nil { + return nil, err + } + + i, err := h.Info("datastore") + if err != nil { + return nil, err + } + + if len(i.Datastore) > 1 { + return nil, fmt.Errorf("Host has multiple datastores. Specify it explicitly") + } + + ds := d.NewDatastore(&i.Datastore[0]) + inf, err := ds.Info("name") + name = inf.Name + } + + ds, err := d.finder.Datastore(d.ctx, name) if err != nil { return nil, err } + return &Datastore{ ds: ds, driver: d, diff --git a/driver/datastore_acc_test.go b/driver/datastore_acc_test.go index 290ae3342..0b2686fe5 100644 --- a/driver/datastore_acc_test.go +++ b/driver/datastore_acc_test.go @@ -8,7 +8,7 @@ func TestDatastoreAcc(t *testing.T) { initDriverAcceptanceTest(t) d := newTestDriver(t) - ds, err := d.FindDatastore("datastore1") + ds, err := d.FindDatastore("datastore1", "") if err != nil { t.Fatalf("Cannot find the default datastore '%v': %v", "datastore1", err) } diff --git a/driver/vm.go b/driver/vm.go index cda16a314..a506645ea 100644 --- a/driver/vm.go +++ b/driver/vm.go @@ -96,7 +96,7 @@ func (d *Driver) CreateVM(config *CreateConfig) (*VirtualMachine, error) { host = h.host } - datastore, err := d.FindDatastore(config.Datastore) + datastore, err := d.FindDatastore(config.Datastore, config.Host) if err != nil { return nil, err } @@ -186,7 +186,7 @@ func (template *VirtualMachine) Clone(config *CloneConfig) (*VirtualMachine, err poolRef := pool.pool.Reference() relocateSpec.Pool = &poolRef - datastore, err := template.driver.FindDatastore(config.Datastore) + datastore, err := template.driver.FindDatastore(config.Datastore, config.Host) if err != nil { return nil, err } diff --git a/driver/vm_clone_acc_test.go b/driver/vm_clone_acc_test.go index ef4a474c3..0f1ed17ce 100644 --- a/driver/vm_clone_acc_test.go +++ b/driver/vm_clone_acc_test.go @@ -29,7 +29,6 @@ func TestVMAcc_clone(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { tc.config.Host = TestHostName - tc.config.Datastore = "datastore1" tc.config.Name = newVMName() templateName := "alpine" diff --git a/driver/vm_create_acc_test.go b/driver/vm_create_acc_test.go index 15ebb3640..cc8dcb051 100644 --- a/driver/vm_create_acc_test.go +++ b/driver/vm_create_acc_test.go @@ -19,7 +19,6 @@ func TestVMAcc_create(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { tc.config.Host = TestHostName - tc.config.Datastore = "datastore1" tc.config.Name = newVMName() d := newTestDriver(t) diff --git a/examples/driver/main.go b/examples/driver/main.go new file mode 100644 index 000000000..8136ff3e3 --- /dev/null +++ b/examples/driver/main.go @@ -0,0 +1,25 @@ +package main + +import ( + "github.com/jetbrains-infra/packer-builder-vsphere/driver" + "fmt" +) + +func main() { + d, err := driver.NewDriver(&driver.ConnectConfig{ + VCenterServer: "vcenter.vsphere65.test", + Username: "root", + Password: "jetbrains", + InsecureConnection: true, + }) + if err != nil { + panic(err) + } + + ds, err := d.FindDatastore("", "esxi-1.vsphere65.test") + if err != nil { + panic(err) + } + + fmt.Println(ds.Name()) +} diff --git a/iso/builder.go b/iso/builder.go index 6730ec969..5e00117df 100644 --- a/iso/builder.go +++ b/iso/builder.go @@ -49,6 +49,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe &StepAddFloppy{ Config: &b.config.FloppyConfig, Datastore: b.config.Datastore, + Host: b.config.Host, }, &StepConfigParams{ Config: &b.config.ConfigParamsConfig, diff --git a/iso/builder_acc_test.go b/iso/builder_acc_test.go index 2ba34862e..5e05d4c0e 100644 --- a/iso/builder_acc_test.go +++ b/iso/builder_acc_test.go @@ -27,7 +27,6 @@ func defaultConfig() map[string]interface{} { "insecure_connection": true, "host": "esxi-1.vsphere65.test", - "datastore": "datastore1", "ssh_username": "root", "ssh_password": "jetbrains", diff --git a/iso/step_add_floppy.go b/iso/step_add_floppy.go index b645265e2..04d337716 100644 --- a/iso/step_add_floppy.go +++ b/iso/step_add_floppy.go @@ -29,6 +29,7 @@ func (c *FloppyConfig) Prepare() []error { type StepAddFloppy struct { Config *FloppyConfig Datastore string + Host string uploadedFloppyPath string } @@ -51,7 +52,7 @@ func (s *StepAddFloppy) runImpl(state multistep.StateBag) error { if tmpFloppy != nil { ui.Say("Uploading created floppy image") - ds, err := d.FindDatastore(s.Datastore) + ds, err := d.FindDatastore(s.Datastore, s.Host) if err != nil { return err } @@ -102,7 +103,7 @@ func (s *StepAddFloppy) Cleanup(state multistep.StateBag) { } if s.uploadedFloppyPath != "" { - ds, err := d.FindDatastore(s.Datastore) + ds, err := d.FindDatastore(s.Datastore, s.Host) if err != nil { ui.Error(err.Error()) return