diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index f90d4ef0e4..089c193f7d 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -81,7 +81,7 @@ type SDiskInfo struct { Metadata map[string]string } -func fetchIVMinfo(desc SManagedVMCreateConfig, iVM cloudprovider.ICloudVM, guestId string, account, passwd string) *jsonutils.JSONDict { +func fetchIVMinfo(desc SManagedVMCreateConfig, iVM cloudprovider.ICloudVM, guestId string, account, passwd string, action string) *jsonutils.JSONDict { data := jsonutils.NewDict() data.Add(jsonutils.NewString(iVM.GetOSType()), "os") @@ -116,6 +116,9 @@ func fetchIVMinfo(desc SManagedVMCreateConfig, iVM cloudprovider.ICloudVM, guest dinfo.BillingType = idisks[i].GetBillingType() dinfo.DiskFormat = idisks[i].GetDiskFormat() dinfo.AutoDelete = idisks[i].GetIsAutoDelete() + if action == "create" { + dinfo.AutoDelete = true + } dinfo.TemplateId = idisks[i].GetTemplateId() dinfo.FsFromat = idisks[i].GetFsFormat() dinfo.ExpiredAt = idisks[i].GetExpiredAt() @@ -219,7 +222,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu } }*/ - data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd, action) /* data.Add(jsonutils.NewString(iVM.GetOSType()), "os") @@ -299,7 +302,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd, action) /* data := jsonutils.NewDict() @@ -366,7 +369,7 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu } } - data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, "root", passwd, action) return data, nil }) @@ -402,7 +405,9 @@ func (self *SAliyunGuestDriver) OnGuestDeployTaskDataReceived(ctx context.Contex disk.Status = models.DISK_READY disk.BillingType = diskInfo[i].BillingType disk.FsFormat = diskInfo[i].FsFromat - disk.AutoDelete = diskInfo[i].AutoDelete + if diskInfo[i].AutoDelete { + disk.AutoDelete = true + } disk.TemplateId = diskInfo[i].TemplateId disk.DiskFormat = diskInfo[i].DiskFormat disk.ExpiredAt = diskInfo[i].ExpiredAt diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index 8a9a91c03d..192d3c951c 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -113,7 +113,7 @@ func (self *SAzureGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gue return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd, action) return data, nil } }) @@ -136,7 +136,7 @@ func (self *SAzureGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gue if err != nil { return nil, err } - data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd, action) return data, nil }) } else if action == "rebuild" { @@ -153,7 +153,7 @@ func (self *SAzureGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gue } log.Debugf("VMrebuildRoot %s, and status is ready", iVM.GetGlobalId()) - data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd) + data := fetchIVMinfo(desc, iVM, guest.Id, DEFAULT_USER, passwd, action) return data, nil }) diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 987de82141..9e81ca9adc 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -156,6 +156,23 @@ func (self *SManagedVirtualizedGuestDriver) RequestUndeployGuestOnHost(ctx conte if err != nil { return nil, err } + + for _, guestdisk := range guest.GetDisks() { + if disk := guestdisk.GetDisk(); disk != nil && disk.AutoDelete { + idisk, err := disk.GetIDisk() + if err != nil { + if err == cloudprovider.ErrNotFound { + continue + } else { + return nil, err + } + } + err = idisk.Delete() + if err != nil { + return nil, err + } + } + } return nil, nil }) return nil diff --git a/pkg/compute/models/disks.go b/pkg/compute/models/disks.go index 700869341a..ac5a960469 100644 --- a/pkg/compute/models/disks.go +++ b/pkg/compute/models/disks.go @@ -739,7 +739,9 @@ func (self *SDisk) syncWithCloudDisk(ctx context.Context, userCred mcclient.Toke self.Status = extDisk.GetStatus() self.DiskFormat = extDisk.GetDiskFormat() self.DiskSize = extDisk.GetDiskSizeMB() - self.AutoDelete = extDisk.GetIsAutoDelete() + if extDisk.GetIsAutoDelete() { + self.AutoDelete = true + } // self.TemplateId = extDisk.GetTemplateId() no sync template ID self.DiskType = extDisk.GetDiskType() if index == 0 { diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 563da4848b..d44506c8d8 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -130,6 +130,8 @@ var VM_CREATING_STATUS = []string{VM_CREATE_NETWORK, VM_CREATE_DISK, VM_START_DE var HYPERVISORS = []string{HYPERVISOR_KVM, HYPERVISOR_BAREMETAL, HYPERVISOR_ESXI, HYPERVISOR_CONTAINER, HYPERVISOR_ALIYUN, HYPERVISOR_AZURE} +var PUBLIC_CLOUD_HYPERVISORS = []string{HYPERVISOR_ALIYUN, HYPERVISOR_AZURE} + // var HYPERVISORS = []string{HYPERVISOR_ALIYUN} var HYPERVISOR_HOSTTYPE = map[string]string{ @@ -3243,7 +3245,7 @@ func (self *SGuest) DoPendingDelete(ctx context.Context, userCred mcclient.Token for _, guestdisk := range self.GetDisks() { disk := guestdisk.GetDisk() storage := disk.GetStorage() - if utils.IsInStringArray(storage.StorageType, sysutils.LOCAL_STORAGE_TYPES) || disk.DiskType == DISK_TYPE_SYS || disk.DiskType == DISK_TYPE_SWAP || self.Hypervisor == HYPERVISOR_ALIYUN { + if utils.IsInStringArray(storage.StorageType, sysutils.LOCAL_STORAGE_TYPES) || utils.IsInStringArray(disk.DiskType, []string{DISK_TYPE_SYS, DISK_TYPE_SWAP}) || (utils.IsInStringArray(self.Hypervisor, PUBLIC_CLOUD_HYPERVISORS) && disk.AutoDelete) { disk.DoPendingDelete(ctx, userCred) } else { self.DetachDisk(ctx, disk, userCred) diff --git a/pkg/compute/tasks/guest_delete_task.go b/pkg/compute/tasks/guest_delete_task.go index be53871e02..85df085ec3 100644 --- a/pkg/compute/tasks/guest_delete_task.go +++ b/pkg/compute/tasks/guest_delete_task.go @@ -93,9 +93,19 @@ func (self *GuestDeleteTask) OnPendingDeleteComplete(ctx context.Context, obj db if !guest.IsSystem { self.NotifyServerDeleted(ctx, guest) } + self.SetStage("on_sync_guest_conf_complete", nil) + guest.StartSyncTask(ctx, self.UserCred, false, self.GetTaskId()) +} + +func (self *GuestDeleteTask) OnSyncGuestConfComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { self.SetStageComplete(ctx, nil) } +func (self *GuestDeleteTask) OnSyncGuestConfCompleteFailed(ctx context.Context, obj db.IStandaloneModel, err jsonutils.JSONObject) { + guest := obj.(*models.SGuest) + self.OnFailed(ctx, guest, err) +} + func (self *GuestDeleteTask) StartDeleteGuest(ctx context.Context, guest *models.SGuest) { // No snapshot self.SetStage("on_guest_detach_disks_complete", nil) diff --git a/pkg/util/azure/instance.go b/pkg/util/azure/instance.go index ff07e45fc7..1515910793 100644 --- a/pkg/util/azure/instance.go +++ b/pkg/util/azure/instance.go @@ -492,6 +492,7 @@ func (region *SRegion) AttachDisk(instanceId, diskId string) error { for i := 0; i < len(instance.Properties.StorageProfile.DataDisks); i++ { instance.Properties.StorageProfile.DataDisks[i].Lun = lun dataDisks = append(dataDisks, instance.Properties.StorageProfile.DataDisks[i]) + lun++ } dataDisks = append(dataDisks, DataDisk{ Lun: lun, @@ -771,17 +772,29 @@ func (self *SRegion) DeleteVM(instanceId string) error { } func (self *SInstance) DeleteVM() error { - if err := self.host.zone.region.DeleteVM(self.ID); err != nil { + sysDiskId := "" + if self.Properties.StorageProfile.OsDisk.ManagedDisk != nil { + sysDiskId = self.Properties.StorageProfile.OsDisk.ManagedDisk.ID + } + err := self.host.zone.region.DeleteVM(self.ID) + if err != nil { return err } - if nics, err := self.getNics(); err != nil { + if len(sysDiskId) > 0 { + err := self.host.zone.region.deleteDisk(sysDiskId) + if err != nil { + return err + } + } + + nics, err := self.getNics() + if err != nil { return err - } else { - for _, nic := range nics { - if err := nic.Delete(); err != nil { - if err != cloudprovider.ErrNotFound { - return err - } + } + for _, nic := range nics { + if err := nic.Delete(); err != nil { + if err != cloudprovider.ErrNotFound { + return err } } }