Adding vSphere Instances Scaffolding

pull/6/head
dagnello 2016-04-06 18:10:12 -07:00
parent d3d29bbd24
commit 051aa190e9
2 changed files with 90 additions and 27 deletions

View File

@ -17,6 +17,7 @@ limitations under the License.
package vsphere
import (
"errors"
"fmt"
"io"
"net/url"
@ -26,24 +27,22 @@ import (
"gopkg.in/gcfg.v1"
"k8s.io/kubernetes/pkg/cloudprovider"
"k8s.io/kubernetes/pkg/api"
)
const ProviderName = "vsphere"
// VSphere is an implementation of Interface, LoadBalancer and Instances for vSphere.
type VSphere struct {
provider *govmomi.Client
region string
datacenter string
// cfg *VSphereConfig
// Add vSphere instance
cfg *VSphereConfig
}
type VSphereConfig struct {
Global struct {
User string `gcfg:"user"`
Password string `gcfg:"password"`
VSphereServer string `gcfg:"server"`
VCenterIp string `gcfg:"server"`
VCenterPort string `gcfg:"port"`
InsecureFlag bool `gcfg:"insecure-flag"`
Datacenter string `gcfg:"datacenter"`
}
@ -71,39 +70,68 @@ func init() {
}
func newVSphere(cfg VSphereConfig) (*VSphere, error) {
u, err := url.Parse("https://" + cfg.Global.VSphereServer + "/sdk")
if err != nil {
return nil, fmt.Errorf("Error parse url: %s", err)
}
u.User = url.UserPassword(cfg.Global.User, cfg.Global.Password)
provider, err := govmomi.NewClient(context.TODO(), u, cfg.Global.InsecureFlag)
if err != nil {
return nil, err
}
vs := VSphere{
provider: provider,
datacenter: cfg.Global.Datacenter,
// cfg *VSphereConfig,
cfg: &cfg,
}
return &vs, nil
}
func vsphereLogin(cfg *VSphereConfig, ctx context.Context) (*govmomi.Client, error) {
// Parse URL from string
u, err := url.Parse(fmt.Sprintf("https://%s:%s/sdk", cfg.Global.VCenterIp, cfg.Global.VCenterPort))
if err != nil {
return nil, err
}
// set username and password for the URL
u.User = url.UserPassword(cfg.Global.User, cfg.Global.Password)
// Connect and log in to ESX or vCenter
c, err := govmomi.NewClient(ctx, u, cfg.Global.InsecureFlag)
if err != nil {
return nil, err
}
return c, nil
}
type Instances struct {
cfg *VSphereConfig
}
// Instances returns an implementation of Instances for vSphere.
func (vs *VSphere) Instances() (cloudprovider.Instances, bool) {
return nil, true
return &Instances{vs.cfg}, true
}
func (i *Instances) List(nameFilter string) ([]string, error) {
return nil, nil
}
func (i *Instances) NodeAddresses(name string) ([]api.NodeAddress, error) {
return nil, nil
}
func (i *Instances) AddSSHKeyToAllInstances(user string, keyData []byte) error {
return errors.New("unimplemented")
}
func (i *Instances) CurrentNodeName(hostname string) (string, error) {
return hostname, nil
}
func (i *Instances) ExternalID(name string) (string, error) {
return "", nil
}
func (i *Instances) InstanceType(name string) (string, error) {
return "", nil
}
func (i *Instances) InstanceID(name string) (string, error) {
return "/" + " ", nil
}
func (vs *VSphere) Clusters() (cloudprovider.Clusters, bool) {
return nil, true
}

View File

@ -23,11 +23,14 @@ import (
"strconv"
"strings"
"testing"
"golang.org/x/net/context"
)
func configFromEnv() (cfg VSphereConfig, ok bool) {
fmt.Print("inside test")
cfg.Global.VSphereServer = os.Getenv("VSPHERE_SERVER")
cfg.Global.VCenterIp = os.Getenv("VSPHERE_VCENTER")
cfg.Global.VCenterPort = os.Getenv("VSPHERE_VCENTER_PORT")
cfg.Global.User = os.Getenv("VSPHERE_USER")
cfg.Global.Password = os.Getenv("VSPHERE_PASSWORD")
cfg.Global.Datacenter = os.Getenv("VSPHERE_DATACENTER")
@ -39,7 +42,9 @@ func configFromEnv() (cfg VSphereConfig, ok bool) {
cfg.Global.InsecureFlag = InsecureFlag
ok = (cfg.Global.VSphereServer != "" &&
ok = (cfg.Global.VCenterIp != "" &&
cfg.Global.User != "")
return
@ -54,6 +59,7 @@ func TestReadConfig(t *testing.T) {
cfg, err := readConfig(strings.NewReader(`
[Global]
server = 0.0.0.0
port = 80
user = user
password = password
insecure-flag = true
@ -62,8 +68,13 @@ datacenter = us-west
if err != nil {
t.Fatalf("Should succeed when a valid config is provided: %s", err)
}
if cfg.Global.VSphereServer != "0.0.0.0" {
t.Errorf("incorrect server: %s", cfg.Global.VSphereServer)
if cfg.Global.VCenterIp != "0.0.0.0" {
t.Errorf("incorrect vcenter ip: %s", cfg.Global.VCenterIp)
}
if cfg.Global.VCenterPort != "80" {
t.Errorf("incorrect vcenter port: %s", cfg.Global.VCenterPort)
}
if cfg.Global.Datacenter != "us-west" {
@ -82,3 +93,27 @@ func TestNewVSphere(t *testing.T) {
t.Fatalf("Failed to construct/authenticate vSphere: %s", err)
}
}
func TestVSphereLogin(t *testing.T) {
cfg, ok := configFromEnv()
if !ok {
t.Skipf("No config found in environment")
}
// Create vSphere configuration object
vs, err := newVSphere(cfg)
if err != nil {
t.Fatalf("Failed to construct/authenticate vSphere: %s", err)
}
// Create context
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Create vSphere client
c, err := vsphereLogin(vs.cfg, ctx)
if err != nil {
t.Errorf("Failed to create vSpere client: %s", err)
}
defer c.Logout(ctx)
}