修正rebuildroot后API获取的磁盘列表不完整的问题

This commit is contained in:
Qiu Jian
2018-09-14 11:18:20 +08:00
parent 314d491e44
commit 1c427f3c1b
2 changed files with 38 additions and 20 deletions
+31 -2
View File
@@ -379,18 +379,47 @@ func (self *SAliyunGuestDriver) RequestDeployGuestOnHost(ctx context.Context, gu
}
taskman.LocalTaskRun(task, func() (jsonutils.JSONObject, error) {
_, err := iVM.RebuildRoot(desc.ExternalImageId, passwd, publicKey, desc.SysDiskSize)
diskId, err := iVM.RebuildRoot(desc.ExternalImageId, passwd, publicKey, desc.SysDiskSize)
if err != nil {
return nil, err
}
log.Debugf("VMrebuildRoot %s, wait status ready ...", iVM.GetGlobalId())
log.Debugf("VMrebuildRoot %s new diskID %s, wait status ready ...", iVM.GetGlobalId(), diskId)
err = cloudprovider.WaitStatus(iVM, models.VM_READY, time.Second*5, time.Second*1800)
if err != nil {
return nil, err
}
log.Debugf("VMrebuildRoot %s, and status is ready", iVM.GetGlobalId())
maxWaitSecs := 300
waited := 0
for {
// hack, wait disk number consistent
idisks, err := iVM.GetIDisks()
if err != nil {
log.Errorf("fail to find VM idisks %s", err)
return nil, err
}
if len(idisks) < len(desc.DataDisks) + 1 {
if waited > maxWaitSecs {
log.Errorf("inconsistent disk number, wait timeout, must be something wrong one remote")
return nil, cloudprovider.ErrTimeout
}
log.Debugf("inconsistent disk number???? %d != %d", len(idisks), len(desc.DataDisks)+1)
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
}
}
data := fetchIVMinfo(desc, iVM, guest.Id, passwd)
return data, nil
+7 -18
View File
@@ -66,7 +66,7 @@ type SVpcAttributes struct {
type SInstance struct {
host *SHost
idisks []cloudprovider.ICloudDisk
// idisks []cloudprovider.ICloudDisk
AutoReleaseTime string
ClusterId string
@@ -187,35 +187,25 @@ func (self *SInstance) getVpc() (*SVpc, error) {
return self.host.zone.region.getVpc(self.VpcAttributes.VpcId)
}
func (self *SInstance) fetchDisks() error {
func (self *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
disks, total, err := self.host.zone.region.GetDisks(self.InstanceId, "", "", nil, 0, 50)
if err != nil {
log.Errorf("fetchDisks fail %s", err)
return err
return nil, err
}
if total > len(disks) {
disks, _, err = self.host.zone.region.GetDisks(self.InstanceId, "", "", nil, 0, total)
}
self.idisks = make([]cloudprovider.ICloudDisk, len(disks))
idisks := make([]cloudprovider.ICloudDisk, len(disks))
for i := 0; i < len(disks); i += 1 {
store, err := self.host.zone.getStorageByCategory(disks[i].Category)
if err != nil {
return err
}
disks[i].storage = store
self.idisks[i] = &disks[i]
}
return nil
}
func (self *SInstance) GetIDisks() ([]cloudprovider.ICloudDisk, error) {
if self.idisks == nil {
err := self.fetchDisks()
if err != nil {
return nil, err
}
disks[i].storage = store
idisks[i] = &disks[i]
}
return self.idisks, nil
return idisks, nil
}
func (self *SInstance) GetINics() ([]cloudprovider.ICloudNic, error) {
@@ -379,7 +369,6 @@ func (self *SInstance) RebuildRoot(imageId string, passwd string, publicKey stri
if err != nil {
return "", err
}
self.idisks = nil
return diskId, nil
}