diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index 2c8f06fe80..c52d7beaff 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1669,6 +1669,10 @@ func (self *SGuest) getMaxDiskIndex() int8 { return int8(len(guestdisks)) } +func (self *SGuest) AttachDisk(disk *SDisk, userCred mcclient.TokenCredential, driver string, cache string, mountpoint string) error { + return self.attach2Disk(disk, userCred, driver, cache, mountpoint) +} + func (self *SGuest) attach2Disk(disk *SDisk, userCred mcclient.TokenCredential, driver string, cache string, mountpoint string) error { if self.isAttach2Disk(disk) { return fmt.Errorf("Guest has been attached to disk") diff --git a/pkg/compute/tasks/guest_detach_disk_task.go b/pkg/compute/tasks/guest_detach_disk_task.go index 0a6653750f..10deaa7799 100644 --- a/pkg/compute/tasks/guest_detach_disk_task.go +++ b/pkg/compute/tasks/guest_detach_disk_task.go @@ -35,6 +35,14 @@ func (self *GuestDetachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM return } + guestdisks := disk.GetGuestdisks() + if len(guestdisks) > 0 { + guestdisk := guestdisks[0] + self.Params.Add(jsonutils.NewString(guestdisk.Driver), "driver") + self.Params.Add(jsonutils.NewString(guestdisk.CacheMode), "cache") + self.Params.Add(jsonutils.NewString(guestdisk.Mountpoint), "mountpoint") + } + guest.DetachDisk(ctx, disk, self.UserCred) if disk.Status == models.DISK_INIT { self.OnSyncConfigComplete(ctx, guest, nil) @@ -94,9 +102,36 @@ func (self *GuestDetachDiskTask) OnSyncConfigComplete(ctx context.Context, guest } } +func (self *GuestDetachDiskTask) OnSyncConfigCompleteFailed(ctx context.Context, obj db.IStandaloneModel, resion jsonutils.JSONObject) { + guest := obj.(*models.SGuest) + driver, _ := self.Params.GetString("driver") + cache, _ := self.Params.GetString("cache") + mountpoint, _ := self.Params.GetString("mountpoint") + diskId, _ := self.Params.GetString("disk_id") + objDisk, err := models.DiskManager.FetchById(diskId) + if err != nil { + self.OnTaskFail(ctx, guest, err) + return + } + disk := objDisk.(*models.SDisk) + db.OpsLog.LogEvent(disk, db.ACT_DETACH, resion.String(), self.UserCred) + err = guest.AttachDisk(disk, self.UserCred, driver, cache, mountpoint) + if err != nil { + self.OnTaskFail(ctx, guest, err) + return + } +} + func (self *GuestDetachDiskTask) OnTaskFail(ctx context.Context, guest *models.SGuest, err error) { + diskId, _ := self.Params.GetString("disk_id") + objDisk, err := models.DiskManager.FetchById(diskId) + if err != nil { + return + } + disk := objDisk.(*models.SDisk) + disk.SetStatus(self.UserCred, models.DISK_READY, err.Error()) self.SetStageFailed(ctx, err.Error()) - log.Errorf("Guest %s GuestDetachDiskTask failed %s", guest.Id, err.Error()) + log.Errorf("Guest %s disk %s GuestDetachDiskTask failed %s ", guest.Id, disk.Name, err.Error()) } func (self *GuestDetachDiskTask) OnDiskDeleteComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {