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] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=8D=B8=E8=BD=BD=E7=A3=81?= =?UTF-8?q?=E7=9B=98=E5=A4=B1=E8=B4=A5=E5=90=8E=E6=83=85=E5=86=B5:=20?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E6=8C=82=E8=BD=BD=E5=8E=9F=E6=9C=89=E7=A3=81?= =?UTF-8?q?=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) {