From 1c427f3c1b4dbac1098f74139cc09d4007b840ef Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Fri, 14 Sep 2018 11:18:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3rebuildroot=E5=90=8EAPI?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9A=84=E7=A3=81=E7=9B=98=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=8D=E5=AE=8C=E6=95=B4=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/compute/guestdrivers/aliyun.go | 33 ++++++++++++++++++++++++++++-- pkg/util/aliyun/instance.go | 25 +++++++--------------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/pkg/compute/guestdrivers/aliyun.go b/pkg/compute/guestdrivers/aliyun.go index 65dadac6ea..908bad6ff4 100644 --- a/pkg/compute/guestdrivers/aliyun.go +++ b/pkg/compute/guestdrivers/aliyun.go @@ -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 diff --git a/pkg/util/aliyun/instance.go b/pkg/util/aliyun/instance.go index 8ff283bac8..64afa92839 100644 --- a/pkg/util/aliyun/instance.go +++ b/pkg/util/aliyun/instance.go @@ -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 }