From 7c4caed98457eb89d64a6e819d42e5674ab67b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 18 Oct 2018 12:03:09 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=8D=B8=E8=BD=BD?= =?UTF-8?q?=E7=A3=81=E7=9B=98=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=83=85=E5=86=B5?= =?UTF-8?q?:=20=E9=87=8D=E6=96=B0=E6=8C=82=E8=BD=BD=E5=8E=9F=E6=9C=89?= =?UTF-8?q?=E7=A3=81=E7=9B=98=E5=88=B0=E8=99=9A=E6=8B=9F=E6=9C=BA=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/models/guests.go | 4 +++ pkg/compute/tasks/guest_detach_disk_task.go | 37 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) 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) { From 15a5c91cf17537ad51a7e2b81bb18577913715ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Thu, 18 Oct 2018 12:11:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=8D=B8=E8=BD=BD=E7=A3=81=E7=9B=98?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=A3=81=E7=9B=98=E7=8A=B6=E6=80=81=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/tasks/guest_detach_disk_task.go | 37 +++++++++++---------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/pkg/compute/tasks/guest_detach_disk_task.go b/pkg/compute/tasks/guest_detach_disk_task.go index 10deaa7799..abbe01ea0e 100644 --- a/pkg/compute/tasks/guest_detach_disk_task.go +++ b/pkg/compute/tasks/guest_detach_disk_task.go @@ -26,12 +26,12 @@ func (self *GuestDetachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM diskId, _ := self.Params.GetString("disk_id") objDisk, err := models.DiskManager.FetchById(diskId) if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, nil, err) return } disk := objDisk.(*models.SDisk) if disk == nil { - self.OnTaskFail(ctx, guest, fmt.Errorf("Connot find disk %s", diskId)) + self.OnTaskFail(ctx, guest, nil, fmt.Errorf("Connot find disk %s", diskId)) return } @@ -48,6 +48,8 @@ func (self *GuestDetachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM self.OnSyncConfigComplete(ctx, guest, nil) return } + disk.SetStatus(self.UserCred, models.DISK_DETACHING, "Disk detach") + host := guest.GetHost() purge := false if host != nil && host.Status == models.HOST_DISABLED && jsonutils.QueryBoolean(self.Params, "purge", false) { @@ -55,13 +57,12 @@ func (self *GuestDetachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM } detachStatus, err := guest.GetDriver().GetDetachDiskStatus() if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, disk, err) return } if utils.IsInStringArray(guest.Status, detachStatus) && !purge { self.SetStage("on_sync_config_complete", nil) guest.GetDriver().RequestDetachDisk(ctx, guest, self) - disk.SetStatus(self.UserCred, models.DISK_READY, "Disk detach") } else { self.OnSyncConfigComplete(ctx, guest, nil) } @@ -71,14 +72,15 @@ func (self *GuestDetachDiskTask) OnSyncConfigComplete(ctx context.Context, guest diskId, _ := self.Params.GetString("disk_id") objDisk, err := models.DiskManager.FetchById(diskId) if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, nil, err) return } disk := objDisk.(*models.SDisk) if disk == nil { - self.OnTaskFail(ctx, guest, fmt.Errorf("Connot find disk %s", diskId)) + self.OnTaskFail(ctx, guest, nil, fmt.Errorf("Connot find disk %s", diskId)) return } + disk.SetDiskReady(ctx, self.UserCred, "") keepDisk := jsonutils.QueryBoolean(self.Params, "keep_disk", true) host := guest.GetHost() purge := false @@ -89,12 +91,14 @@ func (self *GuestDetachDiskTask) OnSyncConfigComplete(ctx context.Context, guest db.OpsLog.LogEvent(disk, db.ACT_DELETE, "", self.UserCred) disk.RealDelete(ctx, self.UserCred) self.SetStageComplete(ctx, nil) - } else if (disk.Status == models.DISK_READY || !keepDisk) && disk.GetGuestDiskCount() == 0 && disk.AutoDelete { + return + } + if !keepDisk && disk.GetGuestDiskCount() == 0 && disk.AutoDelete { self.SetStage("on_disk_delete_complete", nil) db.OpsLog.LogEvent(disk, db.ACT_DELETE, "", self.UserCred) err := guest.GetDriver().RequestDeleteDetachedDisk(ctx, disk, self, purge) if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, disk, err) return } } else { @@ -110,28 +114,25 @@ func (self *GuestDetachDiskTask) OnSyncConfigCompleteFailed(ctx context.Context, diskId, _ := self.Params.GetString("disk_id") objDisk, err := models.DiskManager.FetchById(diskId) if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, nil, err) return } disk := objDisk.(*models.SDisk) db.OpsLog.LogEvent(disk, db.ACT_DETACH, resion.String(), self.UserCred) + disk.SetDiskReady(ctx, self.UserCred, "") err = guest.AttachDisk(disk, self.UserCred, driver, cache, mountpoint) if err != nil { - self.OnTaskFail(ctx, guest, err) + self.OnTaskFail(ctx, guest, disk, 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 +func (self *GuestDetachDiskTask) OnTaskFail(ctx context.Context, guest *models.SGuest, disk *models.SDisk, err error) { + if disk != nil { + disk.SetDiskReady(ctx, self.UserCred, "") } - disk := objDisk.(*models.SDisk) - disk.SetStatus(self.UserCred, models.DISK_READY, err.Error()) self.SetStageFailed(ctx, err.Error()) - log.Errorf("Guest %s disk %s GuestDetachDiskTask failed %s ", guest.Id, disk.Name, err.Error()) + log.Errorf("Guest %s GuestDetachDiskTask failed %s", guest.Id, err.Error()) } func (self *GuestDetachDiskTask) OnDiskDeleteComplete(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) {