Merge pull request #841 from tb365/bugfix/tb-ucloud-fix-0514

ucloud bugfix
This commit is contained in:
yunion-ci-robot
2019-05-17 21:05:16 +08:00
committed by GitHub
5 changed files with 87 additions and 18 deletions
+12
View File
@@ -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)
+1 -1
View File
@@ -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
+26
View File
@@ -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)
}
+44 -9
View File
@@ -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)
+4 -8
View File
@@ -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,