Improve `TestVMAcc_running_snapshot` and `TestVMAcc_template`

This commit is contained in:
Andrey Tonkikh 2017-10-25 23:54:13 +03:00
parent c339fbfb39
commit d154a0ff32
3 changed files with 93 additions and 124 deletions

View File

@ -1,12 +1,12 @@
package main
import (
"testing"
"encoding/json"
builderT "github.com/hashicorp/packer/helper/builder/testing"
"github.com/hashicorp/packer/packer"
"encoding/json"
"github.com/jetbrains-infra/packer-builder-vsphere/driver"
driverT "github.com/jetbrains-infra/packer-builder-vsphere/driver/testing"
"testing"
)
func TestBuilderAcc_default(t *testing.T) {
@ -14,7 +14,12 @@ func TestBuilderAcc_default(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
Template: renderConfig(config),
Check: checkDefault(t, config["vm_name"].(string), config["host"].(string), "datastore1"),
Check: func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
driverT.VMCheckDefault(t, d, getVM(t, d, artifacts), config["vm_name"].(string),
config["host"].(string), driverT.DefaultDatastore)
return nil
},
})
}
@ -35,14 +40,6 @@ func defaultConfig() map[string]interface{} {
return config
}
func checkDefault(t *testing.T, name string, host string, datastore string) builderT.TestCheckFunc {
return func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
vm := getVM(t, d, artifacts)
return driverT.VMCheckDefault(t, d, vm, name, host, datastore)
}
}
func TestBuilderAcc_artifact(t *testing.T) {
config := defaultConfig()
builderT.Test(t, builderT.TestCase{
@ -149,7 +146,11 @@ func TestBuilderAcc_datastore(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
Template: datastoreConfig(),
Check: checkDatastore(t, "datastore1"), // on esxi-1.vsphere55.test
Check: func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
driverT.VMCheckDatastore(t, d, getVM(t, d, artifacts), driverT.DefaultDatastore)
return nil
},
})
}
@ -159,30 +160,8 @@ func datastoreConfig() string {
return renderConfig(config)
}
func checkDatastore(t *testing.T, name string) builderT.TestCheckFunc {
return func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
vm := getVM(t, d, artifacts)
vmInfo, err := vm.Info("datastore")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
}
n := len(vmInfo.Datastore)
if n != 1 {
t.Fatalf("VM should have 1 datastore, got %v", n)
}
ds := d.NewDatastore(&vmInfo.Datastore[0])
driverT.CheckDatastoreName(t, ds, name)
return nil
}
}
func TestBuilderAcc_multipleDatastores(t *testing.T) {
t.Skip("test must fail") // FIXME
t.Skip("test must fail")
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
@ -232,7 +211,11 @@ func TestBuilderAcc_hardware(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
Template: hardwareConfig(),
Check: checkHardware(t),
Check: func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
driverT.VMCheckHardware(t, d, getVM(t, d, artifacts))
return nil
},
})
}
@ -248,14 +231,6 @@ func hardwareConfig() string {
return renderConfig(config)
}
func checkHardware(t *testing.T) builderT.TestCheckFunc {
return func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
vm := getVM(t, d, artifacts)
return driverT.VMCheckHardware(t, d, vm)
}
}
func TestBuilderAcc_RAMReservation(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
@ -309,7 +284,11 @@ func TestBuilderAcc_snapshot(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
Template: snapshotConfig(),
Check: checkSnapshot(t),
Check: func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
driverT.VMCheckSnapshor(t, d, getVM(t, d, artifacts))
return nil
},
})
}
@ -319,30 +298,15 @@ func snapshotConfig() string {
return renderConfig(config)
}
func checkSnapshot(t *testing.T) builderT.TestCheckFunc {
return func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
vm := getVM(t, d, artifacts)
vmInfo, err := vm.Info("layoutEx.disk")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
}
layers := len(vmInfo.LayoutEx.Disk[0].Chain)
if layers != 2 {
t.Errorf("VM should have a single snapshot. expected 2 disk layers, got %v", layers)
}
return nil
}
}
func TestBuilderAcc_template(t *testing.T) {
builderT.Test(t, builderT.TestCase{
Builder: &Builder{},
Template: templateConfig(),
Check: checkTemplate(t),
Check: func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
driverT.VMCheckTemplate(t, d, getVM(t, d, artifacts))
return nil
},
})
}
@ -353,24 +317,6 @@ func templateConfig() string {
return renderConfig(config)
}
func checkTemplate(t *testing.T) builderT.TestCheckFunc {
return func(artifacts []packer.Artifact) error {
d := driverT.NewTestDriver(t)
vm := getVM(t, d, artifacts)
vmInfo, err := vm.Info("config.template")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
}
if vmInfo.Config.Template != true {
t.Error("Not a template")
}
return nil
}
}
func renderConfig(config map[string]interface{}) string {
t := map[string][]map[string]interface{}{
"builders": {

View File

@ -17,7 +17,7 @@ func NewTestDriver(t *testing.T) *driver.Driver {
InsecureConnection: true,
})
if err != nil {
t.Fatal("Cannot connect: ", err)
t.Fatalf("Cannot connect: %v", err)
}
return d
}
@ -28,11 +28,10 @@ func NewVMName() string {
}
func CheckDatastoreName(t *testing.T, ds *driver.Datastore, name string) {
info, err := ds.Info("name")
if err != nil {
t.Fatalf("Cannot read datastore properties: %v", err)
}
if info.Name != name {
switch info, err := ds.Info("name"); {
case err != nil:
t.Errorf("Cannot read datastore properties: %v", err)
case info.Name != name:
t.Errorf("Wrong datastore. expected: %v, got: %v", name, info.Name)
}
}
@ -53,7 +52,7 @@ func initDriverAcceptanceTest(t *testing.T) {
}
func VMCheckDefault(t *testing.T, d *driver.Driver, vm *driver.VirtualMachine,
name string, host string, datastore string) error {
name string, host string, datastore string) {
vmInfo, err := vm.Info("name", "parent", "runtime.host", "resourcePool", "datastore", "layoutEx.disk")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
@ -64,50 +63,45 @@ func VMCheckDefault(t *testing.T, d *driver.Driver, vm *driver.VirtualMachine,
}
f := d.NewFolder(vmInfo.Parent)
folderPath, err := f.Path()
if err != nil {
t.Fatalf("Cannot read folder name: %v", err)
}
if folderPath != "" {
switch folderPath, err := f.Path(); {
case err != nil:
t.Errorf("Cannot read folder name: %v", err)
case folderPath != "":
t.Errorf("Invalid folder: expected '/', got '%v'", folderPath)
}
h := d.NewHost(vmInfo.Runtime.Host)
hostInfo, err := h.Info("name")
if err != nil {
t.Fatal("Cannot read host properties: ", err)
}
if hostInfo.Name != host {
switch hostInfo, err := h.Info("name"); {
case err != nil:
t.Errorf("Cannot read host properties: %v", err)
case hostInfo.Name != host:
t.Errorf("Invalid host name: expected '%v', got '%v'", host, hostInfo.Name)
}
p := d.NewResourcePool(vmInfo.ResourcePool)
poolPath, err := p.Path()
if err != nil {
t.Fatalf("Cannot read resource pool name: %v", err)
}
if poolPath != "" {
switch poolPath, err := p.Path(); {
case err != nil:
t.Errorf("Cannot read resource pool name: %v", err)
case poolPath != "":
t.Error("Invalid resource pool: expected '/', got '%v'", poolPath)
}
dsr := vmInfo.Datastore[0].Reference()
ds := d.NewDatastore(&dsr)
dsInfo, err := ds.Info("name")
if err != nil {
t.Fatal("Cannot read datastore properties: ", err)
}
if dsInfo.Name != datastore {
switch dsInfo, err := ds.Info("name"); {
case err != nil:
t.Errorf("Cannot read datastore properties: %v", err)
case dsInfo.Name != datastore:
t.Errorf("Invalid datastore name: expected '%v', got '%v'", datastore, dsInfo.Name)
}
if len(vmInfo.LayoutEx.Disk[0].Chain) != 1 {
t.Error("Not a full clone")
}
return nil
}
func VMCheckHardware(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine) error {
func VMCheckHardware(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine) {
vmInfo, err := vm.Info("config")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
@ -137,6 +131,40 @@ func VMCheckHardware(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine)
if ramReservation != 1024 {
t.Errorf("VM should have RAM reservation for 1024 MB, got %v", ramReservation)
}
return nil
}
func VMCheckTemplate(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine) {
switch vmInfo, err := vm.Info("config.template"); {
case err != nil:
t.Errorf("Cannot read VM properties: %v", err)
case !vmInfo.Config.Template:
t.Error("Not a template")
}
}
func VMCheckDatastore(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine, name string) {
vmInfo, err := vm.Info("datastore")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
}
n := len(vmInfo.Datastore)
if n != 1 {
t.Fatalf("VM should have 1 datastore, got %v", n)
}
ds := d.NewDatastore(&vmInfo.Datastore[0])
CheckDatastoreName(t, ds, name)
}
func VMCheckSnapshor(t* testing.T, d *driver.Driver, vm *driver.VirtualMachine) {
vmInfo, err := vm.Info("layoutEx.disk")
if err != nil {
t.Fatalf("Cannot read VM properties: %v", err)
}
layers := len(vmInfo.LayoutEx.Disk[0].Chain)
if layers != 2 {
t.Errorf("VM should have a single snapshot. expected 2 disk layers, got %v", layers)
}
}

View File

@ -107,25 +107,20 @@ func TestVMAcc_running(t *testing.T) {
}
func TestVMAcc_running_snapshot(t *testing.T) {
_ /*d*/, vm, vmName, vmDestructor := initVMAccTest(t)
d, vm, vmName, vmDestructor := initVMAccTest(t)
defer vmDestructor()
stopper := startVM(t, vm, vmName)
defer stopper()
vm.CreateSnapshot("test-snapshot")
// TODO: check
VMCheckSnapshor(t, d, vm)
}
func TestVMAcc_template(t *testing.T) {
_ /*d*/, vm, vmName, vmDestructor := initVMAccTest(t)
d, vm, _ /*vmName*/, vmDestructor := initVMAccTest(t)
defer vmDestructor()
vm.ConvertToTemplate()
switch info, err := vm.Info("config"); {
case err != nil:
t.Fatalf("Cannot read VM properties for '%v': %v", vmName, err)
case !info.Config.Template:
t.Fatalf("'%v' seems not to be a template", vmName)
}
VMCheckTemplate(t, d, vm)
}