Commit e22f9ca4 authored by Doug MacEachern's avatar Doug MacEachern

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.
parent e7f74d83
...@@ -53,7 +53,8 @@ const ( ...@@ -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"
) )
...@@ -54,7 +54,7 @@ func TestDatacenter(t *testing.T) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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)
} }
......
...@@ -47,7 +47,7 @@ func TestDatastore(t *testing.T) { ...@@ -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)
} }
......
...@@ -49,7 +49,7 @@ func TestFolder(t *testing.T) { ...@@ -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)
} }
......
...@@ -48,7 +48,7 @@ func TestUtils(t *testing.T) { ...@@ -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)
} }
......
...@@ -45,7 +45,7 @@ func TestVirtualMachine(t *testing.T) { ...@@ -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)
} }
......
...@@ -360,7 +360,10 @@ func populateVsphereInstanceMap(cfg *VSphereConfig) (map[string]*VSphereInstance ...@@ -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) { ...@@ -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
......
...@@ -18,12 +18,14 @@ package vsphere ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment