mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
fix aliyun fail to attach disk after create disk
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user