mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
Merge pull request #451 in YUNIONIO/onecloud from ~QUXUAN/onecloud:hotfix/qx-disk-auto-delete to release/2.2.0
* commit 'd73fd872273ea885334ffdfe8496a49cbeb6d936': 跟随主机创建的磁盘,跟随主机删除
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user