vmware 虚拟机的操作(go)

464 阅读1分钟

1、vmware虚拟机操作

package vmware

import (
	"context"
	"errors"
	"fmt"
	"github.com/vmware/govmomi"
	"github.com/vmware/govmomi/object"
	"github.com/vmware/govmomi/view"
	"github.com/vmware/govmomi/vim25"
	"github.com/vmware/govmomi/vim25/mo"
	"net/url"
)

var ctx = context.Background()

// 链接vmware
func NewClient(ip,user,pwd string) *vim25.Client{

	u := &url.URL{
		Scheme: "https",
		Host:   ip,
		Path:   "/sdk",
	}
	//ctx := context.Background()
	u.User = url.UserPassword(user, pwd)
	client, err := govmomi.NewClient(ctx, u, true)
	if err != nil {
		panic(err)
	}
	return client.Client

}
//查找虚拟机by name
func FindVMByName(c *vim25.Client, vmName string) (*object.VirtualMachine,error){
	m := view.NewManager(c)

	v, err := m.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"VirtualMachine"}, true)
	if err != nil {
		panic(err)
	}

	defer v.Destroy(ctx)

	var vms []mo.VirtualMachine
	err = v.Retrieve(ctx, []string{"VirtualMachine"}, []string{"summary"}, &vms)
	if err != nil {
		panic(err)
	}

	var vmware *object.VirtualMachine
	for _, vm := range vms {
		// 虚拟机名称是否相同,相同的话,vm 就是查找到主机
		if vm.Summary.Config.Name == vmName {
			fmt.Printf("%s: %s\n", vm.Summary.Config.Name, vm.Summary.Config.GuestFullName)
			vmw := object.NewVirtualMachine(c, vm.Reference())
			return vmw,nil
		}
	}
	return vmware,errors.New("虚拟机不存在!")
}

//关机
func PowerOff(vm *object.VirtualMachine){
	task,err:=vm.PowerOff(ctx)
	if err!=nil{
		panic("关机失败:err="+err.Error())
	}
	if e := task.Wait(ctx);e!=nil{
		panic(e)
	}
}
// 开机
func PowerOn(vm *object.VirtualMachine){
	task,err:=vm.PowerOn(ctx)
	if err!=nil{
		panic("开机失败:err="+err.Error())
	}
	if e := task.Wait(ctx);e!=nil{
		panic(e)
	}
}
//创建快照
func CreateSnapShot(vm *object.VirtualMachine,name,desc string) error{
	task, err := vm.CreateSnapshot(ctx, name, desc, false, false)
	if err != nil {
		return err
	}
	if err = task.Wait(ctx); err != nil {
		return err
	}
	return nil
}
//恢复快照
func RecoverToSnapshot(vm *object.VirtualMachine,name string, suppressPowerOn bool) error{
	task,err:=vm.RevertToSnapshot(ctx,name,suppressPowerOn)
	if err != nil {
		return err
	}
	if err = task.Wait(ctx); err != nil {
		return err
	}
	return nil
}

\