From aaaba6002fb2773d7e05f2353abad494addb3c18 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Mon, 26 Nov 2018 23:21:11 +0800 Subject: [PATCH] fix aliyun fail to attach disk after create disk --- pkg/compute/guestdrivers/aliyun.go | 18 +++----- pkg/compute/models/guest_actions.go | 2 +- pkg/compute/tasks/guest_create_disk_task.go | 50 +++++++-------------- pkg/util/aliyun/disk.go | 25 +++++++---- 4 files changed, 39 insertions(+), 56 deletions(-) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index c973c43c75..5d86c3a783 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -98,10 +98,6 @@ func (self *SAliyunGuestDriver) ValidateCreateData(ctx context.Context, userCred func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, guest *models.SGuest, host *models.SHost, task taskman.ITask) error { config := guest.GetDeployConfigOnHost(ctx, host, task.GetParams()) log.Debugf("RequestDeployGuestOnHost: %s", config) - /* onfinish, err := config.GetString("on_finish") - if err != nil { - return err - } */ action, err := config.GetString("action") if err != nil { @@ -263,20 +259,20 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu log.Errorf("fail to find VM idisks %s", err) return nil, err } - if len(idisks) < len(desc.DataDisks)+1 { + if len(idisks) < len(desc.DataDisks)+1 || idisks[0].GetGlobalId() != diskId { if waited > maxWaitSecs { log.Errorf("inconsistent disk number, wait timeout, must be something wrong on remote") return nil, cloudprovider.ErrTimeout } - log.Debugf("inconsistent disk number???? %d != %d", len(idisks), len(desc.DataDisks)+1) + if len(idisks) < len(desc.DataDisks)+1 { + log.Debugf("inconsistent disk number???? %d != %d", len(idisks), len(desc.DataDisks)+1) + } + if idisks[0].GetGlobalId() != diskId { + log.Errorf("system disk id inconsistent %s != %s", idisks[0].GetGlobalId(), diskId) + } time.Sleep(time.Second * 5) waited += 5 } else { - if idisks[0].GetGlobalId() != diskId { - log.Errorf("system disk id inconsistent %s != %s", idisks[0].GetGlobalId(), diskId) - return nil, fmt.Errorf("inconsistent sys disk id after rebuild root") - } - break } } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 39af16e6d8..4de892036f 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -696,7 +696,7 @@ func (self *SGuest) PerformCreatedisk(ctx context.Context, userCred mcclient.Tok logclient.AddActionLog(self, logclient.ACT_CREATE, "No valid storage on current host", userCred, false) return nil, httperrors.NewBadRequestError("No valid storage on current host") } - if storage.GetCapacity() < size { + if storage.GetCapacity() > 0 && storage.GetCapacity() < size { logclient.AddActionLog(self, logclient.ACT_CREATE, "Not eough storage space on current host", userCred, false) return nil, httperrors.NewBadRequestError("Not eough storage space on current host") } diff --git a/pkg/compute/tasks/guest_create_disk_task.go b/pkg/compute/tasks/guest_create_disk_task.go index 23fb020749..702e997a14 100644 --- a/pkg/compute/tasks/guest_create_disk_task.go +++ b/pkg/compute/tasks/guest_create_disk_task.go @@ -10,6 +10,7 @@ import ( "yunion.io/x/onecloud/pkg/cloudcommon/db" "yunion.io/x/onecloud/pkg/cloudcommon/db/taskman" "yunion.io/x/onecloud/pkg/compute/models" + "time" ) type GuestCreateDiskTask struct { @@ -130,58 +131,48 @@ func (self *ManagedGuestCreateDiskTask) OnInit(ctx context.Context, obj db.IStan func (self *ManagedGuestCreateDiskTask) OnManagedDiskPrepared(ctx context.Context, obj db.IStandaloneModel, data jsonutils.JSONObject) { var diskIndex = 0 - var diskReady = true - for { + + for self.Params.Contains(fmt.Sprintf("disk.%d.id", diskIndex)) { diskId, err := self.Params.GetString(fmt.Sprintf("disk.%d.id", diskIndex)) - if !diskReady || err != nil { - break + if err != nil { + self.SetStageFailed(ctx, err.Error()) + return } iDisk, err := models.DiskManager.FetchById(diskId) if err != nil { self.SetStageFailed(ctx, err.Error()) return } - if iDisk == nil { - self.SetStageFailed(ctx, "Disk not found") - return - } disk := iDisk.(*models.SDisk) if disk.Status == models.DISK_INIT { - snapInfo, err := self.Params.GetString(fmt.Sprintf("disk.%d.snapshot", diskIndex)) - if err != nil { - snapInfo = "" - } + snapInfo, _ := self.Params.GetString(fmt.Sprintf("disk.%d.snapshot", diskIndex)) err = disk.StartDiskCreateTask(ctx, self.UserCred, false, snapInfo, self.GetTaskId()) if err != nil { self.SetStageFailed(ctx, err.Error()) return } - diskReady = false - break + return } diskIndex += 1 } + diskIndex = 0 guest := obj.(*models.SGuest) - for { + for self.Params.Contains(fmt.Sprintf("disk.%d.id", diskIndex)) { diskId, err := self.Params.GetString(fmt.Sprintf("disk.%d.id", diskIndex)) - if !diskReady || err != nil { - break + if err != nil { + return } iDisk, err := models.DiskManager.FetchById(diskId) if err != nil { self.SetStageFailed(ctx, err.Error()) return } - if iDisk == nil { - self.SetStageFailed(ctx, "Disk not found") - return - } disk := iDisk.(*models.SDisk) if disk.Status != models.DISK_READY { - diskReady = false - break + self.SetStageFailed(ctx, fmt.Sprintf("disk %s is not ready", disk.Id)) + return } iVM, e := guest.GetIVM() @@ -196,21 +187,10 @@ func (self *ManagedGuestCreateDiskTask) OnManagedDiskPrepared(ctx context.Contex self.SetStageFailed(ctx, "Attach Disk to guest fail") return } + time.Sleep(time.Second*5) diskIndex += 1 } - /*if diskReady { - if guest.Status == models.VM_RUNNING { - self.SetStage("on_config_sync_complete", nil) - err := guest.StartSyncstatus(ctx, self.UserCred, self.GetTaskId()) - if err != nil { - self.SetStageFailed(ctx, err.Error()) - } - } else { - - } - }*/ - self.SetStageComplete(ctx, nil) } diff --git a/pkg/util/aliyun/disk.go b/pkg/util/aliyun/disk.go index 0f1507dd45..4cf6ec9361 100644 --- a/pkg/util/aliyun/disk.go +++ b/pkg/util/aliyun/disk.go @@ -119,7 +119,22 @@ func (self *SDisk) Delete(ctx context.Context) error { log.Errorf("Failed to find disk %s when delete: %s", self.DiskId, err) return err } - return self.storage.zone.region.deleteDisk(self.DiskId) + + for { + err := self.storage.zone.region.DeleteDisk(self.DiskId) + if err != nil { + if isError(err, "IncorrectDiskStatus") { + log.Infof("The disk is initializing, try later ...") + time.Sleep(10 * time.Second) + } else { + log.Errorf("DeleteDisk fail: %s", err) + return err + } + } else { + break + } + } + return cloudprovider.WaitDeleted(self, 10*time.Second, 300*time.Second) // 5minutes } func (self *SDisk) Resize(ctx context.Context, sizeMb int64) error { @@ -246,14 +261,6 @@ func (self *SRegion) getDisk(diskId string) (*SDisk, error) { return &disks[0], nil } -func (self *SRegion) deleteDisk(diskId string) error { - params := make(map[string]string) - params["DiskId"] = diskId - - _, err := self.ecsRequest("DeleteDisk", params) - return err -} - func (self *SRegion) DeleteDisk(diskId string) error { params := make(map[string]string) params["DiskId"] = diskId