fix: fail to delete orphane VM in esxi https://kb.vmware.com/s/article/1003742

This commit is contained in:
Qiu Jian
2019-09-10 02:43:53 +08:00
parent 09c4ed6022
commit bcaf316c60
3 changed files with 68 additions and 1 deletions
@@ -135,4 +135,20 @@ func init() {
return nil
})
shellutils.R(&VirtualMachineShowOptions{}, "vm-file-status", "Show vm files details", func(cli *esxi.SESXiClient, args *VirtualMachineShowOptions) error {
host, err := cli.FindHostByIp(args.HOSTIP)
if err != nil {
return err
}
vm, err := host.GetIVMById(args.VMID)
if err != nil {
return err
}
err = vm.(*esxi.SVirtualMachine).CheckFileInfo(context.Background())
if err != nil {
return err
}
return nil
})
}
+9
View File
@@ -356,6 +356,15 @@ func (self *SDatastore) GetMountPoint() string {
return self.GetUrl()
}
func (self *SDatastore) HasFile(remotePath string) bool {
dsName := fmt.Sprintf("[%s]", self.SManagedObject.GetName())
if strings.HasPrefix(remotePath, dsName) {
return true
} else {
return false
}
}
func (self *SDatastore) cleanPath(remotePath string) string {
dsName := fmt.Sprintf("[%s]", self.SManagedObject.GetName())
dsUrl := self.GetUrl()
+43 -1
View File
@@ -40,7 +40,7 @@ import (
"yunion.io/x/onecloud/pkg/util/billing"
)
var VIRTUAL_MACHINE_PROPS = []string{"name", "parent", "runtime", "summary", "config", "guest", "resourcePool"}
var VIRTUAL_MACHINE_PROPS = []string{"name", "parent", "runtime", "summary", "config", "guest", "resourcePool", "layoutEx"}
type SVirtualMachine struct {
SManagedObject
@@ -106,6 +106,10 @@ func (self *SVirtualMachine) GetGlobalId() string {
}
func (self *SVirtualMachine) GetStatus() string {
err := self.CheckFileInfo(context.Background())
if err != nil {
return api.VM_UNKNOWN
}
vm := object.NewVirtualMachine(self.manager.client.Client, self.getVirtualMachine().Self)
state, err := vm.PowerState(self.manager.context)
if err != nil {
@@ -464,7 +468,22 @@ func (self *SVirtualMachine) doDelete(ctx context.Context) error {
return task.Wait(ctx)
}
func (self *SVirtualMachine) doUnregister(ctx context.Context) error {
vm := self.getVmObj()
err := vm.Unregister(ctx)
if err != nil {
log.Errorf("vm.Unregister(ctx) fail %s", err)
return err
}
return nil
}
func (self *SVirtualMachine) DeleteVM(ctx context.Context) error {
err := self.CheckFileInfo(ctx)
if err != nil {
return self.doUnregister(ctx)
}
for i := 0; i < len(self.vdisks); i += 1 {
err := self.doDetachAndDeleteDisk(ctx, &self.vdisks[i])
if err != nil {
@@ -838,3 +857,26 @@ func (self *SVirtualMachine) getResourcePool() (*SResourcePool, error) {
rp := NewResourcePool(self.manager, &morp, self.datacenter)
return rp, nil
}
func (self *SVirtualMachine) CheckFileInfo(ctx context.Context) error {
vm := self.getVirtualMachine()
if vm.LayoutEx != nil && len(vm.LayoutEx.File) > 0 {
file := vm.LayoutEx.File[0]
host := self.GetIHost()
storages, err := host.GetIStorages()
if err != nil {
return errors.Wrap(err, "host.GetIStorages")
}
for i := range storages {
ds := storages[i].(*SDatastore)
if ds.HasFile(file.Name) {
_, err := ds.CheckFile(ctx, file.Name)
if err != nil {
return errors.Wrap(err, "ds.CheckFile")
}
break
}
}
}
return nil
}