// Returns the name of the VM on which this code is running. // This is done by searching for the name of virtual machine by current IP. // Prerequisite: this code assumes VMWare vmtools or open-vm-tools to be installed in the VM. func readInstanceID(cfg *VSphereConfig) (string, error) { addrs, err := net.InterfaceAddrs() if err != nil { return "", err } if len(addrs) == 0 { return "", fmt.Errorf("unable to retrieve Instance ID") } // 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) var svm object.Reference for _, v := range addrs { ip, _, err := net.ParseCIDR(v.String()) if err != nil { return "", fmt.Errorf("unable to parse cidr from ip") } // Finds a virtual machine or host by IP address. svm, err = s.FindByIp(ctx, dc, ip.String(), true) if err == nil && svm != nil { break } } if svm == nil { return "", fmt.Errorf("unable to retrieve vm reference from vSphere") } var vm mo.VirtualMachine err = s.Properties(ctx, svm.Reference(), []string{"name"}, &vm) if err != nil { return "", err } return vm.Name, nil }
func (flag *SearchFlag) search() (object.Reference, error) { ctx := context.TODO() var ref object.Reference var err error c, err := flag.Client() if err != nil { return nil, err } dc, err := flag.Datacenter() if err != nil { return nil, err } switch { case flag.byDatastorePath != "": ref, err = flag.searchByDatastorePath(c, dc) case flag.byDNSName != "": ref, err = flag.searchByDNSName(c, dc) case flag.byInventoryPath != "": ref, err = flag.searchByInventoryPath(c, dc) case flag.byIP != "": ref, err = flag.searchByIP(c, dc) case flag.byUUID != "": ref, err = flag.searchByUUID(c, dc) default: err = errors.New("no search flag specified") } if err != nil { return nil, err } if ref == nil { return nil, fmt.Errorf("no such %s", flag.entity) } // set the InventoryPath field finder, err := flag.Finder() if err != nil { return nil, err } ref, err = finder.ObjectReference(ctx, ref.Reference()) if err != nil { return nil, err } return ref, nil }
// Returns the name of the VM and its Cluster on which this code is running. // This is done by searching for the name of virtual machine by current IP. // Prerequisite: this code assumes VMWare vmtools or open-vm-tools to be installed in the VM. func readInstance(cfg *VSphereConfig) (string, string, error) { addrs, err := net.InterfaceAddrs() if err != nil { return "", "", err } if len(addrs) == 0 { return "", "", fmt.Errorf("unable to retrieve Instance ID") } // 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) var svm object.Reference for _, v := range addrs { ip, _, err := net.ParseCIDR(v.String()) if err != nil { return "", "", fmt.Errorf("unable to parse cidr from ip") } // Finds a virtual machine or host by IP address. svm, err = s.FindByIp(ctx, dc, ip.String(), true) if err == nil && svm != nil { break } } if svm == nil { return "", "", fmt.Errorf("unable to retrieve vm reference from vSphere") } var vm mo.VirtualMachine err = s.Properties(ctx, svm.Reference(), []string{"name", "resourcePool"}, &vm) if err != nil { return "", "", err } var cluster string if vm.ResourcePool != nil { // Extract the Cluster Name if VM belongs to a ResourcePool var rp mo.ResourcePool err = s.Properties(ctx, *vm.ResourcePool, []string{"parent"}, &rp) if err == nil { var ccr mo.ClusterComputeResource err = s.Properties(ctx, *rp.Parent, []string{"name"}, &ccr) if err == nil { cluster = ccr.Name } else { glog.Warningf("VM %s, does not belong to a vSphere Cluster, will not have FailureDomain label", vm.Name) } } else { glog.Warningf("VM %s, does not belong to a vSphere Cluster, will not have FailureDomain label", vm.Name) } } return vm.Name, cluster, nil }