vsphere: fallback to vcsim for testing authentication

The TestVSphereLogin method still defaults to testing against a real vCenter,
but if the required environment variables are not set, it can test against vcsim.

More tests can be converted to use configFromEnvOrSim(), but can be in follow up PRs.
This commit is contained in:
Doug MacEachern 2018-05-05 17:13:53 -07:00
parent e7f74d83c6
commit e22f9ca4ae
8 changed files with 66 additions and 18 deletions

View File

@ -53,7 +53,8 @@ const (
// Test Constants // Test Constants
const ( const (
testDefaultDatacenter = "DC0" TestDefaultDatacenter = "DC0"
testDefaultDatastore = "LocalDS_0" TestDefaultDatastore = "LocalDS_0"
TestDefaultNetwork = "VM Network"
testNameNotFound = "enoent" testNameNotFound = "enoent"
) )

View File

@ -54,7 +54,7 @@ func TestDatacenter(t *testing.T) {
t.Error("expected error") t.Error("expected error")
} }
dc, err := GetDatacenter(ctx, vc, testDefaultDatacenter) dc, err := GetDatacenter(ctx, vc, TestDefaultDatacenter)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -74,7 +74,7 @@ func TestDatacenter(t *testing.T) {
t.Error("expected error") t.Error("expected error")
} }
vm, err := dc.GetVMByPath(ctx, testDefaultDatacenter+"/vm/"+avm.Name) vm, err := dc.GetVMByPath(ctx, TestDefaultDatacenter+"/vm/"+avm.Name)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -103,7 +103,7 @@ func TestDatacenter(t *testing.T) {
t.Error("expected error") t.Error("expected error")
} }
ds, err := dc.GetDatastoreByName(ctx, testDefaultDatastore) ds, err := dc.GetDatastoreByName(ctx, TestDefaultDatastore)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -113,7 +113,7 @@ func TestDatacenter(t *testing.T) {
t.Error("expected error") t.Error("expected error")
} }
_, err = dc.GetFolderByPath(ctx, testDefaultDatacenter+"/vm") _, err = dc.GetFolderByPath(ctx, TestDefaultDatacenter+"/vm")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -47,7 +47,7 @@ func TestDatastore(t *testing.T) {
vc := &VSphereConnection{Client: c.Client} vc := &VSphereConnection{Client: c.Client}
dc, err := GetDatacenter(ctx, vc, testDefaultDatacenter) dc, err := GetDatacenter(ctx, vc, TestDefaultDatacenter)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -49,7 +49,7 @@ func TestFolder(t *testing.T) {
vc := &VSphereConnection{Client: c.Client} vc := &VSphereConnection{Client: c.Client}
dc, err := GetDatacenter(ctx, vc, testDefaultDatacenter) dc, err := GetDatacenter(ctx, vc, TestDefaultDatacenter)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -48,7 +48,7 @@ func TestUtils(t *testing.T) {
vc := &VSphereConnection{Client: c.Client} vc := &VSphereConnection{Client: c.Client}
dc, err := GetDatacenter(ctx, vc, testDefaultDatacenter) dc, err := GetDatacenter(ctx, vc, TestDefaultDatacenter)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -45,7 +45,7 @@ func TestVirtualMachine(t *testing.T) {
vc := &VSphereConnection{Client: c.Client} vc := &VSphereConnection{Client: c.Client}
dc, err := GetDatacenter(ctx, vc, testDefaultDatacenter) dc, err := GetDatacenter(ctx, vc, TestDefaultDatacenter)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@ -360,7 +360,10 @@ func populateVsphereInstanceMap(cfg *VSphereConfig) (map[string]*VSphereInstance
return vsphereInstanceMap, nil return vsphereInstanceMap, nil
} }
// Creates new Contreoller node interface and returns // getVMUUID allows tests to override GetVMUUID
var getVMUUID = GetVMUUID
// Creates new Controller node interface and returns
func newControllerNode(cfg VSphereConfig) (*VSphere, error) { func newControllerNode(cfg VSphereConfig) (*VSphere, error) {
var err error var err error
@ -399,7 +402,7 @@ func newControllerNode(cfg VSphereConfig) (*VSphere, error) {
glog.Errorf("Failed to get hostname. err: %+v", err) glog.Errorf("Failed to get hostname. err: %+v", err)
return nil, err return nil, err
} }
vs.vmUUID, err = GetVMUUID() vs.vmUUID, err = getVMUUID()
if err != nil { if err != nil {
glog.Errorf("Failed to get uuid. err: %+v", err) glog.Errorf("Failed to get uuid. err: %+v", err)
return nil, err return nil, err

View File

@ -18,12 +18,14 @@ package vsphere
import ( import (
"context" "context"
"crypto/tls"
"log" "log"
"os" "os"
"strconv" "strconv"
"strings" "strings"
"testing" "testing"
"github.com/vmware/govmomi/simulator"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/rand" "k8s.io/apimachinery/pkg/util/rand"
"k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/cloudprovider"
@ -59,6 +61,50 @@ func configFromEnv() (cfg VSphereConfig, ok bool) {
return return
} }
// configFromEnvOrSim returns config from configFromEnv if set,
// otherwise starts a vcsim instance and returns config for use against the vcsim instance.
func configFromEnvOrSim() (VSphereConfig, func()) {
cfg, ok := configFromEnv()
if ok {
return cfg, func() {}
}
model := simulator.VPX()
err := model.Create()
if err != nil {
log.Fatal(err)
}
model.Service.TLS = new(tls.Config)
s := model.Service.NewServer()
cfg.Global.InsecureFlag = true
cfg.Global.VCenterIP = s.URL.Hostname()
cfg.Global.VCenterPort = s.URL.Port()
cfg.Global.User = s.URL.User.Username()
cfg.Global.Password, _ = s.URL.User.Password()
cfg.Global.Datacenter = vclib.TestDefaultDatacenter
cfg.Network.PublicNetwork = vclib.TestDefaultNetwork
cfg.Global.DefaultDatastore = vclib.TestDefaultDatastore
cfg.Disk.SCSIControllerType = os.Getenv("VSPHERE_SCSICONTROLLER_TYPE")
cfg.Global.WorkingDir = os.Getenv("VSPHERE_WORKING_DIR")
cfg.Global.VMName = os.Getenv("VSPHERE_VM_NAME")
if cfg.Global.WorkingDir == "" {
cfg.Global.WorkingDir = "vm" // top-level Datacenter.VmFolder
}
uuid := simulator.Map.Any("VirtualMachine").(*simulator.VirtualMachine).Config.Uuid
getVMUUID = func() (string, error) { return uuid, nil }
return cfg, func() {
getVMUUID = GetVMUUID
s.Close()
model.Remove()
}
}
func TestReadConfig(t *testing.T) { func TestReadConfig(t *testing.T) {
_, err := readConfig(nil) _, err := readConfig(nil)
if err == nil { if err == nil {
@ -110,10 +156,8 @@ func TestNewVSphere(t *testing.T) {
} }
func TestVSphereLogin(t *testing.T) { func TestVSphereLogin(t *testing.T) {
cfg, ok := configFromEnv() cfg, cleanup := configFromEnvOrSim()
if !ok { defer cleanup()
t.Skipf("No config found in environment")
}
// Create vSphere configuration object // Create vSphere configuration object
vs, err := newControllerNode(cfg) vs, err := newControllerNode(cfg)
@ -126,8 +170,8 @@ func TestVSphereLogin(t *testing.T) {
defer cancel() defer cancel()
// Create vSphere client // Create vSphere client
var vcInstance *VSphereInstance vcInstance, ok := vs.vsphereInstanceMap[cfg.Global.VCenterIP]
if vcInstance, ok = vs.vsphereInstanceMap[cfg.Global.VCenterIP]; !ok { if !ok {
t.Fatalf("Couldn't get vSphere instance: %s", cfg.Global.VCenterIP) t.Fatalf("Couldn't get vSphere instance: %s", cfg.Global.VCenterIP)
} }