diff --git a/pkg/apis/compute/disk.go b/pkg/apis/compute/disk.go index 03c0ba2ebc..985f292212 100644 --- a/pkg/apis/compute/disk.go +++ b/pkg/apis/compute/disk.go @@ -317,5 +317,6 @@ type DiskAllocateFromBackupInput struct { } type DiskDeleteInput struct { - SkipRecycle *bool + SkipRecycle *bool + EsxiFlatFilePath string } diff --git a/pkg/compute/hostdrivers/kvm.go b/pkg/compute/hostdrivers/kvm.go index f37daf51d5..8d3244eb57 100644 --- a/pkg/compute/hostdrivers/kvm.go +++ b/pkg/compute/hostdrivers/kvm.go @@ -294,6 +294,9 @@ func (self *SKVMHostDriver) RequestDeallocateDiskOnHost(ctx context.Context, hos url := fmt.Sprintf("/disks/%s/delete/%s", storage.Id, disk.Id) body := jsonutils.NewDict() + if flatPath := disk.GetMetadata(ctx, api.DISK_META_ESXI_FLAT_FILE_PATH, nil); flatPath != "" { + body.Set("esxi_flat_file_path", jsonutils.NewString(flatPath)) + } _, err := host.Request(ctx, task.GetUserCred(), "POST", url, header, body) if err != nil { if errors.Cause(err) == cloudprovider.ErrNotFound { diff --git a/pkg/hostman/guestman/qemu-kvm.go b/pkg/hostman/guestman/qemu-kvm.go index 73677d27ad..8ec941a572 100644 --- a/pkg/hostman/guestman/qemu-kvm.go +++ b/pkg/hostman/guestman/qemu-kvm.go @@ -1505,9 +1505,6 @@ func (s *SKVMGuestInstance) Delete(ctx context.Context, migrated bool) error { if err := s.delTmpDisks(ctx, migrated); err != nil { return errors.Wrap(err, "delTmpDisks") } - if err := s.delFlatFiles(ctx); err != nil { - return errors.Wrap(err, "delFlatFiles") - } output, err := procutils.NewCommand("rm", "-rf", s.HomeDir()).Output() if err != nil { return errors.Wrapf(err, "rm %s failed: %s", s.HomeDir(), output) diff --git a/pkg/hostman/storageman/disk_local.go b/pkg/hostman/storageman/disk_local.go index 465358b3a3..027d3a9c0a 100644 --- a/pkg/hostman/storageman/disk_local.go +++ b/pkg/hostman/storageman/disk_local.go @@ -33,6 +33,7 @@ import ( "yunion.io/x/onecloud/pkg/appctx" "yunion.io/x/onecloud/pkg/cloudcommon/consts" deployapi "yunion.io/x/onecloud/pkg/hostman/hostdeployer/apis" + "yunion.io/x/onecloud/pkg/hostman/hostdeployer/deployclient" "yunion.io/x/onecloud/pkg/hostman/hostutils" "yunion.io/x/onecloud/pkg/hostman/options" "yunion.io/x/onecloud/pkg/hostman/storageman/remotefile" @@ -134,16 +135,14 @@ func (d *SLocalDisk) Delete(ctx context.Context, params interface{}) (jsonutils. return nil, err } d.UmountFuseImage() - - /* ???????????????? - files = os.listdir(self.storage.path) - for f in files: - if f.startswith(self.id): - if not re.match(r'[a-z0-9\-]*\.\d{14}', f): - path = os.path.join(self.storage.path, f) - print 'delete backing-file:', path - self.storage.delete_diskfile(path) - */ + if p.EsxiFlatFilePath != "" { + connections := &deployapi.EsxiDisksConnectionInfo{Disks: []*deployapi.EsxiDiskInfo{{DiskPath: p.EsxiFlatFilePath}}} + _, err := deployclient.GetDeployClient().DisconnectEsxiDisks(ctx, connections) + if err != nil { + log.Errorf("Disconnect %s esxi disks failed %s", p.EsxiFlatFilePath, err) + return nil, err + } + } d.Storage.RemoveDisk(d) return nil, nil diff --git a/pkg/hostman/storageman/diskhandlers/diskhandler.go b/pkg/hostman/storageman/diskhandlers/diskhandler.go index 8d194ec1dc..bc1a0533e8 100644 --- a/pkg/hostman/storageman/diskhandlers/diskhandler.go +++ b/pkg/hostman/storageman/diskhandlers/diskhandler.go @@ -280,8 +280,9 @@ func diskCreate(ctx context.Context, userCred mcclient.TokenCredential, storage } func diskDelete(ctx context.Context, userCred mcclient.TokenCredential, storage storageman.IStorage, diskId string, disk storageman.IDisk, body jsonutils.JSONObject) (interface{}, error) { + flatPath, _ := body.GetString("esxi_flat_file_path") if disk != nil { - hostutils.DelayTask(ctx, disk.Delete, compute.DiskDeleteInput{}) + hostutils.DelayTask(ctx, disk.Delete, compute.DiskDeleteInput{EsxiFlatFilePath: flatPath}) } else { hostutils.DelayTask(ctx, nil, nil) }