fix aliyun fail to attach disk after create disk

This commit is contained in:
Qiu Jian
2018-11-26 23:21:11 +08:00
parent 341e4204a0
commit aaaba6002f
4 changed files with 39 additions and 56 deletions
+7 -11
View File
@@ -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
}
}
+1 -1
View File
@@ -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")
}
+15 -35
View File
@@ -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)
}
+16 -9
View File
@@ -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