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:
邱剑
2018-11-09 20:40:19 +08:00
7 changed files with 67 additions and 18 deletions
+10 -5
View File
@@ -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
+3 -3
View File
@@ -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
+3 -1
View File
@@ -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 {
+3 -1
View File
@@ -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)
+10
View File
@@ -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)
+21 -8
View File
@@ -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
}
}
}