From 7e3cd5a7c201acf644ec81ab0dab48db9c1a4288 Mon Sep 17 00:00:00 2001 From: ioito Date: Mon, 1 Jul 2019 11:07:39 +0800 Subject: [PATCH] fix attach disk not effect --- pkg/compute/guestdrivers/base.go | 2 +- pkg/compute/guestdrivers/kvm.go | 2 +- pkg/compute/guestdrivers/managedvirtual.go | 18 ++++++++++++++++-- pkg/compute/models/guestdrivers.go | 2 +- pkg/compute/tasks/guest_attach_disk_task.go | 2 +- pkg/compute/tasks/guest_detach_disk_task.go | 9 ++++++--- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index bee24acdde..583c0ca4c7 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -103,7 +103,7 @@ func (self *SBaseGuestDriver) RequestDetachDisk(ctx context.Context, guest *mode return nil } -func (self *SBaseGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { +func (self *SBaseGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, disk *models.SDisk, task taskman.ITask) error { task.ScheduleRun(nil) return nil } diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index 65f57273d2..950753754f 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -321,7 +321,7 @@ func (self *SKVMGuestDriver) RequestDetachDisk(ctx context.Context, guest *model return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) } -func (self *SKVMGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { +func (self *SKVMGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, disk *models.SDisk, task taskman.ITask) error { return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index 78b285a7e4..51330d2fa3 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -166,8 +166,22 @@ func (self *SManagedVirtualizedGuestDriver) RequestDetachDisk(ctx context.Contex return nil } -func (self *SManagedVirtualizedGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) +func (self *SManagedVirtualizedGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, disk *models.SDisk, task taskman.ITask) error { + taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) { + iVM, err := guest.GetIVM() + if err != nil { + return nil, errors.Wrapf(err, "guest.GetIVM") + } + if len(disk.ExternalId) == 0 { + return nil, fmt.Errorf("disk %s(%s) is not a managed resource", disk.Name, disk.Id) + } + err = iVM.AttachDisk(ctx, disk.ExternalId) + if err != nil { + return nil, errors.Wrapf(err, "iVM.AttachDisk") + } + return nil, nil + }) + return nil } func (self *SManagedVirtualizedGuestDriver) RequestStartOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, userCred mcclient.TokenCredential, task taskman.ITask) (jsonutils.JSONObject, error) { diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index f2d1fb5363..de2055fb9c 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -128,7 +128,7 @@ type IGuestDriver interface { GetGuestVncInfo(ctx context.Context, userCred mcclient.TokenCredential, guest *SGuest, host *SHost) (*jsonutils.JSONDict, error) - RequestAttachDisk(ctx context.Context, guest *SGuest, task taskman.ITask) error + RequestAttachDisk(ctx context.Context, guest *SGuest, disk *SDisk, task taskman.ITask) error RequestDetachDisk(ctx context.Context, guest *SGuest, disk *SDisk, task taskman.ITask) error GetDetachDiskStatus() ([]string, error) GetAttachDiskStatus() ([]string, error) diff --git a/pkg/compute/tasks/guest_attach_disk_task.go b/pkg/compute/tasks/guest_attach_disk_task.go index 7aaa68e77e..88a8481a50 100644 --- a/pkg/compute/tasks/guest_attach_disk_task.go +++ b/pkg/compute/tasks/guest_attach_disk_task.go @@ -61,7 +61,7 @@ func (self *GuestAttachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM } disk.SetStatus(self.UserCred, api.DISK_ATTACHING, "Disk attach") self.SetStage("on_sync_config_complete", nil) - guest.GetDriver().RequestAttachDisk(ctx, guest, self) + guest.GetDriver().RequestAttachDisk(ctx, guest, disk, self) } func (self *GuestAttachDiskTask) OnSyncConfigComplete(ctx context.Context, guest *models.SGuest, data jsonutils.JSONObject) { diff --git a/pkg/compute/tasks/guest_detach_disk_task.go b/pkg/compute/tasks/guest_detach_disk_task.go index 58ca6902ed..e4063e039a 100644 --- a/pkg/compute/tasks/guest_detach_disk_task.go +++ b/pkg/compute/tasks/guest_detach_disk_task.go @@ -18,6 +18,8 @@ import ( "context" "fmt" + "github.com/pkg/errors" + "yunion.io/x/jsonutils" "yunion.io/x/log" "yunion.io/x/pkg/utils" @@ -120,7 +122,8 @@ 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, nil, err) + log.Warningf("failed to fetch disk by id %s error: %v", diskId, err) + self.OnTaskFail(ctx, guest, nil, errors.New(reason.String())) return } disk := objDisk.(*models.SDisk) @@ -128,9 +131,9 @@ func (self *GuestDetachDiskTask) OnSyncConfigCompleteFailed(ctx context.Context, disk.SetDiskReady(ctx, self.UserCred, "") err = guest.AttachDisk(ctx, disk, self.UserCred, driver, cache, mountpoint) if err != nil { - self.OnTaskFail(ctx, guest, disk, err) - return + log.Warningf("recover attach disk %s(%s) for guest %s(%s) error: %v", disk.Name, disk.Id, guest.Name, guest.Id, err) } + self.OnTaskFail(ctx, guest, nil, errors.New(reason.String())) } func (self *GuestDetachDiskTask) OnTaskFail(ctx context.Context, guest *models.SGuest, disk *models.SDisk, err error) {