From 4fd02f54ef1f13c48a5124fecca8c1006433db0c Mon Sep 17 00:00:00 2001 From: dagnello Date: Fri, 22 Apr 2016 19:12:01 -0700 Subject: [PATCH] Retreive VM Name from Running Instance When vSphere cloud provider object is instantiated, the VM name of the Node where this object is being create in needs to be set. This patch also includes vSphere as part of the cloud provider package. --- pkg/cloudprovider/providers/providers.go | 1 + .../providers/vsphere/vsphere.go | 58 ++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/pkg/cloudprovider/providers/providers.go b/pkg/cloudprovider/providers/providers.go index 6664e8903be..765beb636bf 100644 --- a/pkg/cloudprovider/providers/providers.go +++ b/pkg/cloudprovider/providers/providers.go @@ -24,4 +24,5 @@ import ( _ "k8s.io/kubernetes/pkg/cloudprovider/providers/openstack" _ "k8s.io/kubernetes/pkg/cloudprovider/providers/ovirt" _ "k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace" + _ "k8s.io/kubernetes/pkg/cloudprovider/providers/vsphere" ) diff --git a/pkg/cloudprovider/providers/vsphere/vsphere.go b/pkg/cloudprovider/providers/vsphere/vsphere.go index 0b12c05d5f8..fdd4ec686f4 100644 --- a/pkg/cloudprovider/providers/vsphere/vsphere.go +++ b/pkg/cloudprovider/providers/vsphere/vsphere.go @@ -17,10 +17,13 @@ limitations under the License. package vsphere import ( + "bytes" "errors" "fmt" "io" + "os/exec" "net/url" + "strings" "github.com/vmware/govmomi" "github.com/vmware/govmomi/find" @@ -42,6 +45,8 @@ const ActivePowerState = "poweredOn" // VSphere is an implementation of cloud provider Interface for VSphere. type VSphere struct { cfg *VSphereConfig + // InstanceID of the server where this VSphere object is instantiated. + localInstanceID string } type VSphereConfig struct { @@ -52,6 +57,7 @@ type VSphereConfig struct { VCenterPort string `gcfg:"port"` InsecureFlag bool `gcfg:"insecure-flag"` Datacenter string `gcfg:"datacenter"` + Datastore string `gcfg:"datastore"` } Network struct { @@ -80,9 +86,56 @@ func init() { }) } +func readInstanceID(cfg *VSphereConfig) (string, error) { + cmd := exec.Command("bash", "-c", `dmidecode -t 1 | grep UUID | tr -d ' ' | cut -f 2 -d ':'`) + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return "", err + } + + // Create context + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Create vSphere client + c, err := vsphereLogin(cfg, ctx) + if err != nil { + return "", err + } + defer c.Logout(ctx) + + // Create a new finder + f := find.NewFinder(c.Client, true) + + // Fetch and set data center + dc, err := f.Datacenter(ctx, cfg.Global.Datacenter) + if err != nil { + return "", err + } + f.SetDatacenter(dc) + + s := object.NewSearchIndex(c.Client) + + svm, err := s.FindByUuid(ctx, dc, strings.ToLower(strings.TrimSpace(out.String())), true, nil) + var vm mo.VirtualMachine + err = s.Properties(ctx, svm.Reference(), []string{"name"}, &vm) + if err != nil { + return "", err + } + return vm.Name, nil +} + func newVSphere(cfg VSphereConfig) (*VSphere, error) { + id, err := readInstanceID(&cfg) + if err != nil { + return nil, err + } + vs := VSphere{ cfg: &cfg, + localInstanceID: id, } return &vs, nil } @@ -179,11 +232,12 @@ func getInstances(cfg *VSphereConfig, ctx context.Context, c *govmomi.Client, fi type Instances struct { cfg *VSphereConfig + localInstanceID string } // Instances returns an implementation of Instances for vSphere. func (vs *VSphere) Instances() (cloudprovider.Instances, bool) { - return &Instances{vs.cfg}, true + return &Instances{vs.cfg, vs.localInstanceID}, true } // List is an implementation of Instances.List. @@ -258,7 +312,7 @@ func (i *Instances) AddSSHKeyToAllInstances(user string, keyData []byte) error { } func (i *Instances) CurrentNodeName(hostname string) (string, error) { - return hostname, nil + return i.localInstanceID, nil } // ExternalID returns the cloud provider ID of the specified instance (deprecated).