diff --git a/pkg/multicloud/zstack/disk.go b/pkg/multicloud/zstack/disk.go index 1f57ec51ae..d1dea8badc 100644 --- a/pkg/multicloud/zstack/disk.go +++ b/pkg/multicloud/zstack/disk.go @@ -234,7 +234,7 @@ func (disk *SDisk) GetDiskSizeMB() int { } func (disk *SDisk) GetIsAutoDelete() bool { - return false + return disk.GetDiskType() == api.DISK_TYPE_SYS || disk.localStorage != nil } func (disk *SDisk) GetTemplateId() string { diff --git a/pkg/multicloud/zstack/instance.go b/pkg/multicloud/zstack/instance.go index b9c6bf9e5d..c113c8cd5c 100644 --- a/pkg/multicloud/zstack/instance.go +++ b/pkg/multicloud/zstack/instance.go @@ -23,6 +23,7 @@ import ( "yunion.io/x/jsonutils" "yunion.io/x/log" + "yunion.io/x/pkg/errors" "yunion.io/x/pkg/util/osprofile" "yunion.io/x/pkg/utils" @@ -470,7 +471,23 @@ func (region *SRegion) DetachDisk(instanceId, diskId string) error { } func (instance *SInstance) DeleteVM(ctx context.Context) error { - return instance.host.zone.region.DeleteVM(instance.UUID) + disks, err := instance.GetIDisks() + if err != nil { + return errors.Wrapf(err, "GetIDisks") + } + err = instance.host.zone.region.DeleteVM(instance.UUID) + if err != nil { + return errors.Wrapf(err, "DeleteVM") + } + for i := range disks { + if disks[i].GetDiskType() != api.DISK_TYPE_SYS && disks[i].GetIsAutoDelete() { + err = disks[i].Delete(ctx) + if err != nil { + log.Warningf("delete disk %s failed %s", disks[i].GetId(), err) + } + } + } + return nil } func (region *SRegion) DeleteVM(instanceId string) error { @@ -482,7 +499,10 @@ func (region *SRegion) DeleteVM(instanceId string) error { "expungeVmInstance": jsonutils.NewDict(), } _, err = region.client.put("vm-instances", instanceId, jsonutils.Marshal(params)) - return err + if err != nil { + return errors.Wrapf(err, "expungeVmInstance") + } + return nil } func (instance *SInstance) GetIEIP() (cloudprovider.ICloudEIP, error) {