From c3dc2639b3f5a4ca0b29f5ff69eb6728021e1e50 Mon Sep 17 00:00:00 2001 From: TangBin Date: Wed, 15 May 2019 20:11:47 +0800 Subject: [PATCH] ucloud bugfix --- pkg/compute/guestdrivers/ucloud.go | 12 +++++++ pkg/util/ucloud/client.go | 2 +- pkg/util/ucloud/disk.go | 26 +++++++++++++++ pkg/util/ucloud/instance.go | 53 +++++++++++++++++++++++++----- pkg/util/ucloud/storagecache.go | 12 +++---- 5 files changed, 87 insertions(+), 18 deletions(-) diff --git a/pkg/compute/guestdrivers/ucloud.go b/pkg/compute/guestdrivers/ucloud.go index 4b3e09fbcc..01c54df043 100644 --- a/pkg/compute/guestdrivers/ucloud.go +++ b/pkg/compute/guestdrivers/ucloud.go @@ -55,6 +55,18 @@ func (self *SUCloudGuestDriver) GetAttachDiskStatus() ([]string, error) { return []string{api.VM_READY, api.VM_RUNNING}, nil } +func (self *SUCloudGuestDriver) GetChangeConfigStatus() ([]string, error) { + return []string{api.VM_READY}, nil +} + +func (self *SUCloudGuestDriver) GetRebuildRootStatus() ([]string, error) { + return []string{api.VM_READY, api.VM_RUNNING}, nil +} + +func (self *SUCloudGuestDriver) GetGuestInitialStateAfterRebuild() string { + return api.VM_RUNNING +} + func init() { driver := SUCloudGuestDriver{} models.RegisterGuestDriver(&driver) diff --git a/pkg/util/ucloud/client.go b/pkg/util/ucloud/client.go index a481e2d571..e8e74f0c6a 100644 --- a/pkg/util/ucloud/client.go +++ b/pkg/util/ucloud/client.go @@ -178,7 +178,7 @@ func jsonRequest(client *SUcloudClient, params SParams) (jsonutils.JSONObject, e switch e := err.(type) { case *httputils.JSONClientError: - if e.Code >= 500 { + if e.Code >= 499 { time.Sleep(3 * time.Second) retry += 1 continue diff --git a/pkg/util/ucloud/disk.go b/pkg/util/ucloud/disk.go index 88d14ca719..72abbc7b71 100644 --- a/pkg/util/ucloud/disk.go +++ b/pkg/util/ucloud/disk.go @@ -178,6 +178,18 @@ func (self *SDisk) GetDiskType() string { return api.DISK_TYPE_DATA } +func (self *SDisk) GetStorageType() string { + if self.storage == nil { + if strings.Contains(self.DiskType, "SSD") { + return api.STORAGE_UCLOUD_CLOUD_SSD + } else { + return api.STORAGE_UCLOUD_CLOUD_NORMAL + } + } + + return self.storage.storageType +} + func (self *SDisk) GetFsFormat() string { return "" } @@ -246,6 +258,20 @@ func (self *SDisk) Resize(ctx context.Context, newSizeMB int64) error { } else { sizeGB = newSizeMB / 1024 } + + if self.Status == "InUse" { + err := self.storage.zone.region.DetachDisk(self.Zone, self.UHostID, self.UDiskID) + if err != nil { + return err + } + + defer self.storage.zone.region.AttachDisk(self.Zone, self.UHostID, self.UDiskID) + err = cloudprovider.WaitStatusWithDelay(self, api.DISK_READY, 10*time.Second, 5*time.Second, 60*time.Second) + if err != nil { + return err + } + + } return self.storage.zone.region.resizeDisk(self.Zone, self.GetId(), sizeGB) } diff --git a/pkg/util/ucloud/instance.go b/pkg/util/ucloud/instance.go index 8403430e36..d6432f89f4 100644 --- a/pkg/util/ucloud/instance.go +++ b/pkg/util/ucloud/instance.go @@ -349,7 +349,7 @@ func (self *SInstance) StartVM(ctx context.Context) error { if err != nil { return err } - return cloudprovider.WaitStatus(self, api.VM_RUNNING, 5*time.Second, 180*time.Second) + return cloudprovider.WaitStatusWithDelay(self, api.VM_RUNNING, 10*time.Second, 10*time.Second, 600*time.Second) } func (self *SInstance) StopVM(ctx context.Context, isForce bool) error { @@ -357,7 +357,7 @@ func (self *SInstance) StopVM(ctx context.Context, isForce bool) error { if err != nil { return err } - return cloudprovider.WaitStatus(self, api.VM_READY, 5*time.Second, 180*time.Second) + return cloudprovider.WaitStatusWithDelay(self, api.VM_READY, 10*time.Second, 10*time.Second, 600*time.Second) } func (self *SInstance) DeleteVM(ctx context.Context) error { @@ -400,7 +400,23 @@ func (self *SInstance) RebuildRoot(ctx context.Context, imageId string, passwd s } } - return self.GetId(), self.host.zone.region.RebuildRoot(self.GetId(), imageId, passwd) + + err := self.host.zone.region.RebuildRoot(self.GetId(), imageId, passwd) + if err != nil { + return "", err + } + + err = cloudprovider.WaitStatusWithDelay(self, api.VM_RUNNING, 10*time.Second, 15*time.Second, 300*time.Second) + if err != nil { + return "", err + } + + disks, err := self.GetIDisks() + if len(disks) > 0 { + return disks[0].GetId(), nil + } else { + return "", fmt.Errorf("RebuildRoot %s", err) + } } func (self *SInstance) DeployVM(ctx context.Context, name string, password string, publicKey string, deleteKeypair bool, description string) error { @@ -416,12 +432,14 @@ func (self *SInstance) DeployVM(ctx context.Context, name string, password strin return fmt.Errorf("DeployVM instance status %s , expected %s.", self.GetStatus(), api.VM_READY) } - err := self.host.zone.region.ResetVMPasswd(self.GetId(), password) - if err != nil { - return err + if len(password) > 0 { + err := self.host.zone.region.ResetVMPasswd(self.GetId(), password) + if err != nil { + return err + } } - return cloudprovider.WaitStatus(self, api.VM_READY, 10*time.Second, 120*time.Second) + return cloudprovider.WaitStatus(self, api.VM_READY, 10*time.Second, 300*time.Second) } func (self *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) error { @@ -429,7 +447,12 @@ func (self *SInstance) ChangeConfig(ctx context.Context, ncpu int, vmem int) err } func (self *SInstance) ChangeConfig2(ctx context.Context, instanceType string) error { - return cloudprovider.ErrNotSupported + i, err := ParseInstanceType(instanceType) + if err != nil { + return err + } + + return self.host.zone.region.ResizeVM(self.GetId(), i.CPU, i.MemoryMB) } func (self *SInstance) GetVNCInfo() (jsonutils.JSONObject, error) { @@ -441,7 +464,18 @@ func (self *SInstance) AttachDisk(ctx context.Context, diskId string) error { } func (self *SInstance) DetachDisk(ctx context.Context, diskId string) error { - return self.host.zone.region.DetachDisk(self.host.zone.GetId(), self.GetId(), diskId) + err := self.host.zone.region.DetachDisk(self.host.zone.GetId(), self.GetId(), diskId) + if err != nil { + return err + } + + disk, err := self.host.zone.region.GetDisk(diskId) + if err != nil { + return err + } + + disk.storage = &SStorage{zone: self.host.zone, storageType: disk.GetStorageType()} + return cloudprovider.WaitStatusWithDelay(disk, api.DISK_READY, 10*time.Second, 10*time.Second, 60*time.Second) } func (self *SInstance) CreateDisk(ctx context.Context, sizeMb int, uuid string, driver string) error { @@ -564,6 +598,7 @@ func (self *SRegion) RebuildRoot(instanceId, imageId, password string) error { // https://docs.ucloud.cn/api/uhost-api/resize_uhost_instance func (self *SRegion) ResizeVM(instanceId string, cpu, memoryMB int) error { params := NewUcloudParams() + params.Set("UHostId", instanceId) params.Set("CPU", cpu) params.Set("Memory", memoryMB) diff --git a/pkg/util/ucloud/storagecache.go b/pkg/util/ucloud/storagecache.go index c63de532fc..25bb9e572d 100644 --- a/pkg/util/ucloud/storagecache.go +++ b/pkg/util/ucloud/storagecache.go @@ -162,11 +162,7 @@ func (self *SStoragecache) uploadImage(ctx context.Context, userCred mcclient.To return "", err } log.Debugf("Images meta data %s", meta) - _image, err := modules.Images.Get(s, imageId, nil) - if err != nil { - return "", err - } - minDiskMB, _ := _image.Int("min_disk") + minDiskMB, _ := meta.Int("min_disk") minDiskGB := int64(math.Ceil(float64(minDiskMB) / 1024)) // 在使用OBS桶的外部镜像文件制作镜像时生效且为必选字段。取值为40~1024GB。 if minDiskGB < 40 { @@ -174,9 +170,9 @@ func (self *SStoragecache) uploadImage(ctx context.Context, userCred mcclient.To } else if minDiskGB > 1024 { minDiskGB = 1024 } - size, _ := _image.Int("size") - md5, _ := _image.GetString("checksum") - diskFormat, _ := _image.GetString("disk_format") + size, _ := meta.Int("size") + md5, _ := meta.GetString("checksum") + diskFormat, _ := meta.GetString("disk_format") // upload to ucloud file := SFile{ region: self.region,