165 lines
5.9 KiB
Go
165 lines
5.9 KiB
Go
/*
|
|
Copyright 2016 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package vclib
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/golang/glog"
|
|
"github.com/vmware/govmomi/find"
|
|
"github.com/vmware/govmomi/object"
|
|
"github.com/vmware/govmomi/property"
|
|
"github.com/vmware/govmomi/vim25/mo"
|
|
"github.com/vmware/govmomi/vim25/types"
|
|
"golang.org/x/net/context"
|
|
)
|
|
|
|
// Datacenter extends the govmomi Datacenter object
|
|
type Datacenter struct {
|
|
*object.Datacenter
|
|
}
|
|
|
|
// GetDatacenter returns the DataCenter Object for the given datacenterPath
|
|
// If datacenter is located in a folder, include full path to datacenter else just provide the datacenter name
|
|
func GetDatacenter(ctx context.Context, connection *VSphereConnection, datacenterPath string) (*Datacenter, error) {
|
|
finder := find.NewFinder(connection.GoVmomiClient.Client, true)
|
|
datacenter, err := finder.Datacenter(ctx, datacenterPath)
|
|
if err != nil {
|
|
glog.Errorf("Failed to find the datacenter: %s. err: %+v", datacenterPath, err)
|
|
return nil, err
|
|
}
|
|
dc := Datacenter{datacenter}
|
|
return &dc, nil
|
|
}
|
|
|
|
// GetVMByUUID gets the VM object from the given vmUUID
|
|
func (dc *Datacenter) GetVMByUUID(ctx context.Context, vmUUID string) (*VirtualMachine, error) {
|
|
s := object.NewSearchIndex(dc.Client())
|
|
vmUUID = strings.ToLower(strings.TrimSpace(vmUUID))
|
|
svm, err := s.FindByUuid(ctx, dc.Datacenter, vmUUID, true, nil)
|
|
if err != nil {
|
|
glog.Errorf("Failed to find VM by UUID. VM UUID: %s, err: %+v", vmUUID, err)
|
|
return nil, err
|
|
}
|
|
if svm == nil {
|
|
glog.Errorf("Unable to find VM by UUID. VM UUID: %s", vmUUID)
|
|
return nil, fmt.Errorf("Failed to find VM by UUID: %s", vmUUID)
|
|
}
|
|
virtualMachine := VirtualMachine{object.NewVirtualMachine(dc.Client(), svm.Reference()), dc}
|
|
return &virtualMachine, nil
|
|
}
|
|
|
|
// GetVMByPath gets the VM object from the given vmPath
|
|
// vmPath should be the full path to VM and not just the name
|
|
func (dc *Datacenter) GetVMByPath(ctx context.Context, vmPath string) (*VirtualMachine, error) {
|
|
finder := getFinder(dc)
|
|
vm, err := finder.VirtualMachine(ctx, vmPath)
|
|
if err != nil {
|
|
glog.Errorf("Failed to find VM by Path. VM Path: %s, err: %+v", vmPath, err)
|
|
return nil, err
|
|
}
|
|
virtualMachine := VirtualMachine{vm, dc}
|
|
return &virtualMachine, nil
|
|
}
|
|
|
|
// GetDatastoreByPath gets the Datastore object from the given vmDiskPath
|
|
func (dc *Datacenter) GetDatastoreByPath(ctx context.Context, vmDiskPath string) (*Datastore, error) {
|
|
datastorePathObj := new(object.DatastorePath)
|
|
isSuccess := datastorePathObj.FromString(vmDiskPath)
|
|
if !isSuccess {
|
|
glog.Errorf("Failed to parse vmDiskPath: %s", vmDiskPath)
|
|
return nil, errors.New("Failed to parse vmDiskPath")
|
|
}
|
|
finder := getFinder(dc)
|
|
ds, err := finder.Datastore(ctx, datastorePathObj.Datastore)
|
|
if err != nil {
|
|
glog.Errorf("Failed while searching for datastore: %s. err: %+v", datastorePathObj.Datastore, err)
|
|
return nil, err
|
|
}
|
|
datastore := Datastore{ds, dc}
|
|
return &datastore, nil
|
|
}
|
|
|
|
// GetDatastoreByName gets the Datastore object for the given datastore name
|
|
func (dc *Datacenter) GetDatastoreByName(ctx context.Context, name string) (*Datastore, error) {
|
|
finder := getFinder(dc)
|
|
ds, err := finder.Datastore(ctx, name)
|
|
if err != nil {
|
|
glog.Errorf("Failed while searching for datastore: %s. err: %+v", name, err)
|
|
return nil, err
|
|
}
|
|
datastore := Datastore{ds, dc}
|
|
return &datastore, nil
|
|
}
|
|
|
|
// GetFolderByPath gets the Folder Object from the given folder path
|
|
// folderPath should be the full path to folder
|
|
func (dc *Datacenter) GetFolderByPath(ctx context.Context, folderPath string) (*Folder, error) {
|
|
finder := getFinder(dc)
|
|
vmFolder, err := finder.Folder(ctx, folderPath)
|
|
if err != nil {
|
|
glog.Errorf("Failed to get the folder reference for %s. err: %+v", folderPath, err)
|
|
return nil, err
|
|
}
|
|
folder := Folder{vmFolder, dc}
|
|
return &folder, nil
|
|
}
|
|
|
|
// GetVMMoList gets the VM Managed Objects with the given properties from the VM object
|
|
func (dc *Datacenter) GetVMMoList(ctx context.Context, vmObjList []*VirtualMachine, properties []string) ([]mo.VirtualMachine, error) {
|
|
var vmMoList []mo.VirtualMachine
|
|
var vmRefs []types.ManagedObjectReference
|
|
if len(vmObjList) < 1 {
|
|
glog.Errorf("VirtualMachine Object list is empty")
|
|
return nil, fmt.Errorf("VirtualMachine Object list is empty")
|
|
}
|
|
|
|
for _, vmObj := range vmObjList {
|
|
vmRefs = append(vmRefs, vmObj.Reference())
|
|
}
|
|
pc := property.DefaultCollector(dc.Client())
|
|
err := pc.Retrieve(ctx, vmRefs, properties, &vmMoList)
|
|
if err != nil {
|
|
glog.Errorf("Failed to get VM managed objects from VM objects. vmObjList: %+v, properties: %+v, err: %v", vmObjList, properties, err)
|
|
return nil, err
|
|
}
|
|
return vmMoList, nil
|
|
}
|
|
|
|
// GetDatastoreMoList gets the Datastore Managed Objects with the given properties from the datastore objects
|
|
func (dc *Datacenter) GetDatastoreMoList(ctx context.Context, dsObjList []*Datastore, properties []string) ([]mo.Datastore, error) {
|
|
var dsMoList []mo.Datastore
|
|
var dsRefs []types.ManagedObjectReference
|
|
if len(dsObjList) < 1 {
|
|
glog.Errorf("Datastore Object list is empty")
|
|
return nil, fmt.Errorf("Datastore Object list is empty")
|
|
}
|
|
|
|
for _, dsObj := range dsObjList {
|
|
dsRefs = append(dsRefs, dsObj.Reference())
|
|
}
|
|
pc := property.DefaultCollector(dc.Client())
|
|
err := pc.Retrieve(ctx, dsRefs, properties, &dsMoList)
|
|
if err != nil {
|
|
glog.Errorf("Failed to get Datastore managed objects from datastore objects. dsObjList: %+v, properties: %+v, err: %v", dsObjList, properties, err)
|
|
return nil, err
|
|
}
|
|
return dsMoList, nil
|
|
}
|