diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 1d643930fa..3cd924e1cd 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -21,6 +21,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" @@ -29,6 +30,7 @@ import ( "yunion.io/x/onecloud/pkg/compute/options" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/mcclient" + "yunion.io/x/onecloud/pkg/multicloud/esxi" "yunion.io/x/onecloud/pkg/util/billing" "yunion.io/x/onecloud/pkg/util/httputils" ) @@ -186,6 +188,30 @@ func (self *SESXiGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gues return err } +func (self *SESXiGuestDriver) RqeuestSuspendOnHost(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + host := guest.GetHost() + if host == nil { + return nil, errors.Error("fail to get host of guest") + } + ihost, err := host.GetIHost() + if err != nil { + return nil, err + } + ivm, err := ihost.GetIVMById(guest.GetExternalId()) + if err != nil { + return nil, err + } + vm := ivm.(*esxi.SVirtualMachine) + err = vm.SuspendVM(ctx) + if err != nil { + return nil, errors.Wrap(err, "VM.SuspendVM for vmware") + } + return nil, nil + }) + return nil +} + func (self *SESXiGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Context, guest *models.SGuest, task taskman.ITask, data jsonutils.JSONObject) error { if data.Contains("host_ip") { diff --git a/pkg/multicloud/esxi/virtualmachine.go b/pkg/multicloud/esxi/virtualmachine.go index 2165bab0cf..ba63bd4cdd 100644 --- a/pkg/multicloud/esxi/virtualmachine.go +++ b/pkg/multicloud/esxi/virtualmachine.go @@ -430,6 +430,15 @@ func (self *SVirtualMachine) StopVM(ctx context.Context, isForce bool) error { } } +func (self *SVirtualMachine) SuspendVM(ctx context.Context) error { + vm := self.getVmObj() + task, err := vm.Suspend(ctx) + if err != nil { + return err + } + return task.Wait(ctx) +} + func (self *SVirtualMachine) poweroffVM(ctx context.Context) error { vm := self.getVmObj()