diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 90b5c9f4b6..888e06861c 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -21,7 +21,6 @@ import ( "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/httperrors" @@ -101,10 +100,6 @@ func (self *SAliyunGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *m return nil } -func (self *SAliyunGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SAliyunGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerCreateInput) (*api.ServerCreateInput, error) { input, err := self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, input) if err != nil { diff --git a/pkg/compute/guestdrivers/aws.go b/pkg/compute/guestdrivers/aws.go index bb1399eee7..f57726f26d 100644 --- a/pkg/compute/guestdrivers/aws.go +++ b/pkg/compute/guestdrivers/aws.go @@ -22,7 +22,6 @@ import ( "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/mcclient" @@ -126,10 +125,6 @@ func (self *SAwsGuestDriver) GetDeployStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SAwsGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SAwsGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerCreateInput) (*api.ServerCreateInput, error) { return self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, input) } diff --git a/pkg/compute/guestdrivers/azure.go b/pkg/compute/guestdrivers/azure.go index 8eebb8180f..36f6065cb6 100644 --- a/pkg/compute/guestdrivers/azure.go +++ b/pkg/compute/guestdrivers/azure.go @@ -24,7 +24,6 @@ import ( api "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/cloudcommon/cmdline" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/httperrors" @@ -106,10 +105,6 @@ func (self *SAzureGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *mo return nil } -func (self *SAzureGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SAzureGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerCreateInput) (*api.ServerCreateInput, error) { input, err := self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, input) if err != nil { diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 486096de7d..7349311210 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -87,7 +87,7 @@ func (self *SBaseGuestDriver) OnDeleteGuestFinalCleanup(ctx context.Context, gue return guest.DeleteAllDisksInDB(ctx, userCred) } -func (self *SBaseGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { +func (self *SBaseGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, disk *models.SDisk, task taskman.ITask) error { task.ScheduleRun(nil) return nil } diff --git a/pkg/compute/guestdrivers/container.go b/pkg/compute/guestdrivers/container.go index dd05c4b36f..8d5424fe3e 100644 --- a/pkg/compute/guestdrivers/container.go +++ b/pkg/compute/guestdrivers/container.go @@ -91,7 +91,7 @@ func (self *SContainerDriver) RequestSoftReset(ctx context.Context, guest *model return containerUseKubectlError } -func (self *SContainerDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { +func (self *SContainerDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, disk *models.SDisk, task taskman.ITask) error { return containerUseKubectlError } diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 469c2864b9..c7a1206759 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -122,10 +122,6 @@ func (self *SESXiGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *mod return nil } -func (self *SESXiGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SESXiGuestDriver) GetJsonDescAtHost(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, host *models.SHost) jsonutils.JSONObject { return guest.GetJsonDescAtHypervisor(ctx, host) } diff --git a/pkg/compute/guestdrivers/huawei.go b/pkg/compute/guestdrivers/huawei.go index fe91d49e59..9a27d4104b 100644 --- a/pkg/compute/guestdrivers/huawei.go +++ b/pkg/compute/guestdrivers/huawei.go @@ -15,13 +15,11 @@ package guestdrivers import ( - "context" "fmt" "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/util/billing" @@ -80,10 +78,6 @@ func (self *SHuaweiGuestDriver) GetDeployStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } -func (self *SHuaweiGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SHuaweiGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *models.SDisk, storage *models.SStorage) error { if !utils.IsInStringArray(guest.Status, []string{api.VM_RUNNING, api.VM_READY}) { return fmt.Errorf("Cannot resize disk when guest in status %s", guest.Status) diff --git a/pkg/compute/guestdrivers/kvm.go b/pkg/compute/guestdrivers/kvm.go index f2ec5938a4..c224918199 100644 --- a/pkg/compute/guestdrivers/kvm.go +++ b/pkg/compute/guestdrivers/kvm.go @@ -309,7 +309,7 @@ func (self *SKVMGuestDriver) RequestSoftReset(ctx context.Context, guest *models return err } -func (self *SKVMGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { +func (self *SKVMGuestDriver) RequestDetachDisk(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 900b3a5112..023a51232d 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -173,8 +173,22 @@ func (self *SManagedVirtualizedGuestDriver) ValidateCreateEip(ctx context.Contex return nil } -func (self *SManagedVirtualizedGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) +func (self *SManagedVirtualizedGuestDriver) RequestDetachDisk(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, nil + } + err = iVM.DetachDisk(ctx, disk.ExternalId) + if err != nil { + return nil, errors.Wrapf(err, "iVM.DetachDisk") + } + return nil, nil + }) + return nil } func (self *SManagedVirtualizedGuestDriver) RequestAttachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { diff --git a/pkg/compute/guestdrivers/qcloud.go b/pkg/compute/guestdrivers/qcloud.go index 0109314b58..6a9de42741 100644 --- a/pkg/compute/guestdrivers/qcloud.go +++ b/pkg/compute/guestdrivers/qcloud.go @@ -21,7 +21,6 @@ import ( "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/httperrors" @@ -102,10 +101,6 @@ func (self *SQcloudGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *m return nil } -func (self *SQcloudGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SQcloudGuestDriver) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, input *api.ServerCreateInput) (*api.ServerCreateInput, error) { input, err := self.SManagedVirtualizedGuestDriver.ValidateCreateData(ctx, userCred, input) if err != nil { diff --git a/pkg/compute/guestdrivers/zstack.go b/pkg/compute/guestdrivers/zstack.go index a6611152d1..cb56974970 100644 --- a/pkg/compute/guestdrivers/zstack.go +++ b/pkg/compute/guestdrivers/zstack.go @@ -22,7 +22,6 @@ import ( "yunion.io/x/pkg/utils" api "yunion.io/x/onecloud/pkg/apis/compute" - "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/cloudprovider" "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/onecloud/pkg/httperrors" @@ -101,10 +100,6 @@ func (self *SZStackGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk *m return nil } -func (self *SZStackGuestDriver) RequestDetachDisk(ctx context.Context, guest *models.SGuest, task taskman.ITask) error { - return guest.StartSyncTask(ctx, task.GetUserCred(), false, task.GetTaskId()) -} - func (self *SZStackGuestDriver) ValidateCreateEip(ctx context.Context, userCred mcclient.TokenCredential, data jsonutils.JSONObject) error { return httperrors.NewInputParameterError("%s not support create eip, it only support bind eip", self.GetHypervisor()) } diff --git a/pkg/compute/hostdrivers/managedvirtual.go b/pkg/compute/hostdrivers/managedvirtual.go index d8701f6509..4c8e3c5d2f 100644 --- a/pkg/compute/hostdrivers/managedvirtual.go +++ b/pkg/compute/hostdrivers/managedvirtual.go @@ -18,7 +18,9 @@ import ( "context" "fmt" "os" + "time" + "github.com/pkg/errors" "yunion.io/x/pkg/utils" "yunion.io/x/jsonutils" @@ -249,10 +251,11 @@ func (self *SManagedVirtualizationHostDriver) RequestAllocateDiskOnStorage(ctx c } err = db.SetExternalId(disk, task.GetUserCred(), iDisk.GetGlobalId()) if err != nil { - log.Errorf("Update disk externalId err: %v", err) - return nil, err + return nil, errors.Wrapf(err, "db.SetExternalId") } + cloudprovider.WaitStatus(iDisk, api.DISK_READY, time.Second*5, time.Minute*5) + models.SyncMetadata(ctx, task.GetUserCred(), disk, iDisk) data := jsonutils.NewDict() diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 2a6f95ac6b..5d4e564f17 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -119,7 +119,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 - RequestDetachDisk(ctx context.Context, guest *SGuest, task taskman.ITask) error + RequestDetachDisk(ctx context.Context, guest *SGuest, disk *SDisk, task taskman.ITask) error GetDetachDiskStatus() ([]string, error) GetAttachDiskStatus() ([]string, error) GetRebuildRootStatus() ([]string, error) diff --git a/pkg/compute/tasks/guest_detach_disk_task.go b/pkg/compute/tasks/guest_detach_disk_task.go index 1df5710cac..58ca6902ed 100644 --- a/pkg/compute/tasks/guest_detach_disk_task.go +++ b/pkg/compute/tasks/guest_detach_disk_task.go @@ -72,7 +72,7 @@ func (self *GuestDetachDiskTask) OnInit(ctx context.Context, obj db.IStandaloneM } if utils.IsInStringArray(guest.Status, detachStatus) && !purge { self.SetStage("on_sync_config_complete", nil) - guest.GetDriver().RequestDetachDisk(ctx, guest, self) + guest.GetDriver().RequestDetachDisk(ctx, guest, disk, self) } else { self.OnSyncConfigComplete(ctx, guest, nil) }