diff --git a/pkg/cloudprovider/images.go b/pkg/cloudprovider/images.go index ce139a2962..bc6681afe3 100644 --- a/pkg/cloudprovider/images.go +++ b/pkg/cloudprovider/images.go @@ -44,7 +44,7 @@ func CloudImage2Image(image ICloudImage) SImage { Id: image.GetId(), IsPublic: image.GetImageType() != CachedImageTypeCustomized, MinDiskMB: image.GetMinOsDiskSizeGb() * 1024, - MinRamMB: 0, + MinRamMB: image.GetMinRamSizeMb(), Name: image.GetName(), Properties: map[string]string{ "os_type": image.GetOsType(), diff --git a/pkg/cloudprovider/resources.go b/pkg/cloudprovider/resources.go index 9c2e7fadae..8da284d0db 100644 --- a/pkg/cloudprovider/resources.go +++ b/pkg/cloudprovider/resources.go @@ -105,6 +105,7 @@ type ICloudImage interface { GetOsVersion() string GetOsArch() string GetMinOsDiskSizeGb() int + GetMinRamSizeMb() int GetImageFormat() string GetCreateTime() time.Time } diff --git a/pkg/util/aliyun/host.go b/pkg/util/aliyun/host.go index 488ca19655..bde587838f 100644 --- a/pkg/util/aliyun/host.go +++ b/pkg/util/aliyun/host.go @@ -240,7 +240,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD vmId, err := self.zone.region.CreateInstance(name, imgId, instanceType, secgroupId, self.zone.ZoneId, desc, passwd, disks, vswitchId, ipAddr, keypair, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceType, err) - return "", fmt.Errorf("Failed to create, specification %s not supported", instanceType) + return "", fmt.Errorf("Failed to create specification %s.%s", instanceType, err.Error()) } return vmId, nil } @@ -253,10 +253,11 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD return "", fmt.Errorf("instance type %dC%dMB not avaiable", cpu, memMB) } + var vmId string for _, instType := range instanceTypes { instanceTypeId := instType.InstanceTypeId log.Debugf("Try instancetype : %s", instanceTypeId) - vmId, err := self.zone.region.CreateInstance(name, imgId, instanceTypeId, secgroupId, self.zone.ZoneId, desc, passwd, disks, vswitchId, ipAddr, keypair, userData, bc) + vmId, err = self.zone.region.CreateInstance(name, imgId, instanceTypeId, secgroupId, self.zone.ZoneId, desc, passwd, disks, vswitchId, ipAddr, keypair, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceTypeId, err) } else { @@ -264,7 +265,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD } } - return "", fmt.Errorf("Failed to create, specification not supported") + return "", fmt.Errorf("Failed to create, %s", err.Error()) } func (host *SHost) GetIHostNics() ([]cloudprovider.ICloudHostNetInterface, error) { diff --git a/pkg/util/aliyun/image.go b/pkg/util/aliyun/image.go index 561cf58831..9cf95aebed 100644 --- a/pkg/util/aliyun/image.go +++ b/pkg/util/aliyun/image.go @@ -60,6 +60,10 @@ type SImage struct { Usage string } +func (self *SImage) GetMinRamSizeMb() int { + return 0 +} + func (self *SImage) GetMetadata() *jsonutils.JSONDict { data := jsonutils.NewDict() if len(self.Architecture) > 0 { diff --git a/pkg/util/aws/host.go b/pkg/util/aws/host.go index 0e678087ff..4a64aadcd2 100644 --- a/pkg/util/aws/host.go +++ b/pkg/util/aws/host.go @@ -250,7 +250,7 @@ func (self *SHost) _createVM(name, imgId string, sysDisk cloudprovider.SDiskInfo vmId, err := self.zone.region.CreateInstance(name, imgId, instanceType, networkId, secgroupId, self.zone.ZoneId, desc, disks, ipAddr, keypair, userData) if err != nil { log.Errorf("Failed for %s: %s", instanceType, err) - return "", fmt.Errorf("Failed to create, specification %s not supported", instanceType) + return "", fmt.Errorf("Failed to create specification %s.%s", instanceType, err.Error()) } else { return vmId, nil } @@ -265,10 +265,11 @@ func (self *SHost) _createVM(name, imgId string, sysDisk cloudprovider.SDiskInfo return "", fmt.Errorf("instance type %dC%dMB not avaiable", cpu, memMB) } + var vmId string for _, instType := range instanceTypes { instanceTypeId := instType.InstanceTypeId log.Debugf("Try instancetype : %s", instanceTypeId) - vmId, err := self.zone.region.CreateInstance(name, imgId, instanceTypeId, networkId, secgroupId, self.zone.ZoneId, desc, disks, ipAddr, keypair, userData) + vmId, err = self.zone.region.CreateInstance(name, imgId, instanceTypeId, networkId, secgroupId, self.zone.ZoneId, desc, disks, ipAddr, keypair, userData) if err != nil { log.Errorf("Failed for %s: %s", instanceTypeId, err) } else { @@ -276,7 +277,7 @@ func (self *SHost) _createVM(name, imgId string, sysDisk cloudprovider.SDiskInfo } } - return "", fmt.Errorf("Failed to create, specification not supported") + return "", fmt.Errorf("Failed to create, %s", err.Error()) } func (self *SHost) GetIHostNics() ([]cloudprovider.ICloudHostNetInterface, error) { diff --git a/pkg/util/aws/image.go b/pkg/util/aws/image.go index 516740c2e2..9942a4d214 100644 --- a/pkg/util/aws/image.go +++ b/pkg/util/aws/image.go @@ -82,6 +82,10 @@ type SImage struct { OSBuildId string } +func (self *SImage) GetMinRamSizeMb() int { + return 0 +} + func (self *SImage) GetId() string { return self.ImageId } diff --git a/pkg/util/azure/host.go b/pkg/util/azure/host.go index f012a921d0..011040dce9 100644 --- a/pkg/util/azure/host.go +++ b/pkg/util/azure/host.go @@ -180,7 +180,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD err = self.zone.region.client.Create(jsonutils.Marshal(instance), &instance) if err != nil { log.Errorf("Failed for %s: %s", instanceType, err) - return "", fmt.Errorf("Failed to create, specification %s not supported", instanceType) + return "", fmt.Errorf("Failed to create specification %s.%s", instanceType, err.Error()) } return instance.ID, nil } @@ -188,14 +188,14 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD for _, profile := range self.zone.region.getHardwareProfile(cpu, memMB) { instance.Properties.HardwareProfile.VMSize = profile log.Debugf("Try HardwareProfile : %s", profile) - err := self.zone.region.client.Create(jsonutils.Marshal(instance), &instance) + err = self.zone.region.client.Create(jsonutils.Marshal(instance), &instance) if err != nil { log.Errorf("Failed for %s: %s", profile, err) continue } return instance.ID, nil } - return "", fmt.Errorf("Failed to create, specification not supported") + return "", fmt.Errorf("Failed to create, %s", err.Error()) } func (self *SHost) GetAccessIp() string { diff --git a/pkg/util/azure/image.go b/pkg/util/azure/image.go index c29f57c94d..f16d3cc851 100644 --- a/pkg/util/azure/image.go +++ b/pkg/util/azure/image.go @@ -80,6 +80,10 @@ type SImage struct { ImageType string } +func (self *SImage) GetMinRamSizeMb() int { + return 0 +} + func (self *SImage) GetMetadata() *jsonutils.JSONDict { data := jsonutils.NewDict() osType := string(self.Properties.StorageProfile.OsDisk.OsType) diff --git a/pkg/util/esxi/image.go b/pkg/util/esxi/image.go index d54dbfb9a4..7dcb5da817 100644 --- a/pkg/util/esxi/image.go +++ b/pkg/util/esxi/image.go @@ -21,6 +21,10 @@ type SImage struct { createAt time.Time } +func (self *SImage) GetMinRamSizeMb() int { + return 0 +} + func (self *SImage) getDatacenter() *object.Datacenter { return self.cache.datastore.datacenter.getDcObj() } diff --git a/pkg/util/huawei/host.go b/pkg/util/huawei/host.go index 86b9f77807..663b2d58d0 100644 --- a/pkg/util/huawei/host.go +++ b/pkg/util/huawei/host.go @@ -244,7 +244,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD vmId, err := self.zone.region.CreateInstance(name, imgId, instanceType, networkId, secgroupId, secgroup.VpcID, self.zone.GetId(), desc, disks, ipAddr, keypair, passwd, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceType, err) - return "", fmt.Errorf("Failed to create, specification %s not supported", instanceType) + return "", fmt.Errorf("Failed to create specification %s.%s", instanceType, err.Error()) } else { return vmId, nil } @@ -259,10 +259,11 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD return "", fmt.Errorf("instance type %dC%dMB not avaiable", cpu, memMB) } + var vmId string for _, instType := range instanceTypes { instanceTypeId := instType.Name log.Debugf("Try instancetype : %s", instanceTypeId) - vmId, err := self.zone.region.CreateInstance(name, imgId, instanceType, networkId, secgroupId, secgroup.VpcID, self.zone.GetId(), desc, disks, ipAddr, keypair, passwd, userData, bc) + vmId, err = self.zone.region.CreateInstance(name, imgId, instanceType, networkId, secgroupId, secgroup.VpcID, self.zone.GetId(), desc, disks, ipAddr, keypair, passwd, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceTypeId, err) } else { @@ -270,5 +271,5 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD } } - return "", fmt.Errorf("Failed to create, specification not supported") + return "", fmt.Errorf("Failed to create, %s", err.Error()) } diff --git a/pkg/util/huawei/image.go b/pkg/util/huawei/image.go index 10152ddd58..bd9104fbd3 100644 --- a/pkg/util/huawei/image.go +++ b/pkg/util/huawei/image.go @@ -48,7 +48,7 @@ type SImage struct { SupportKVMFPGAType string `json:"__support_kvm_fpga_type"` ID string `json:"id"` Isregistered string `json:"__isregistered"` - MinRAM int64 `json:"min_ram"` + MinRamMB int `json:"min_ram"` Lazyloading string `json:"__lazyloading"` Owner string `json:"owner"` OSType string `json:"__os_type"` @@ -66,6 +66,10 @@ type SImage struct { Status string `json:"status"` } +func (self *SImage) GetMinRamSizeMb() int { + return self.MinRamMB +} + func (self *SImage) GetId() string { return self.ID } diff --git a/pkg/util/huawei/region.go b/pkg/util/huawei/region.go index 62a49486a3..4b0a395553 100644 --- a/pkg/util/huawei/region.go +++ b/pkg/util/huawei/region.go @@ -381,7 +381,7 @@ func (self *SRegion) CreateEIP(name string, bwMbps int, chargeType string, bgpTy bgpType = "5_sbgp" case "cn-northeast-1": bgpType = "5_telcom" - case "cn-north-4","ap-southeast-1", "ap-southeast-2", "eu-west-0": + case "cn-north-4", "ap-southeast-1", "ap-southeast-2", "eu-west-0": bgpType = "5_bgp" default: bgpType = "5_bgp" diff --git a/pkg/util/openstack/image.go b/pkg/util/openstack/image.go index d5dd500862..07df63def9 100644 --- a/pkg/util/openstack/image.go +++ b/pkg/util/openstack/image.go @@ -52,6 +52,10 @@ type SImage struct { visibility string } +func (image *SImage) GetMinRamSizeMb() int { + return image.MinRAM +} + func (region *SRegion) GetImages(name string, status string, imageIds []string) ([]SImage, error) { params := url.Values{} if utils.IsInStringArray(status, []string{QUEUED, SAVING, ACTIVE, KILLED, DELETED, PENDING_DELETE, DEACTIVATED, UPLOADING, IMPORTING}) { diff --git a/pkg/util/qcloud/host.go b/pkg/util/qcloud/host.go index 85a10d8b2b..c00b1711a0 100644 --- a/pkg/util/qcloud/host.go +++ b/pkg/util/qcloud/host.go @@ -136,7 +136,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD vmId, err := self.zone.region.CreateInstance(name, imgId, instanceType, secgroupId, self.zone.Zone, desc, passwd, disks, networkId, ipAddr, keypair, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceType, err) - return "", fmt.Errorf("Failed to create, specification %s not supported", instanceType) + return "", fmt.Errorf("Failed to create specification %s.%s", instanceType, err.Error()) } return vmId, nil } @@ -149,10 +149,11 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD return "", fmt.Errorf("instance type %dC%dMB not avaiable", cpu, memMB) } + var vmId string for _, instType := range instanceTypes { instanceTypeId := instType.InstanceType log.Debugf("Try instancetype : %s", instanceTypeId) - vmId, err := self.zone.region.CreateInstance(name, imgId, instanceTypeId, secgroupId, self.zone.Zone, desc, passwd, disks, networkId, ipAddr, keypair, userData, bc) + vmId, err = self.zone.region.CreateInstance(name, imgId, instanceTypeId, secgroupId, self.zone.Zone, desc, passwd, disks, networkId, ipAddr, keypair, userData, bc) if err != nil { log.Errorf("Failed for %s: %s", instanceTypeId, err) } else { @@ -160,7 +161,7 @@ func (self *SHost) _createVM(name string, imgId string, sysDisk cloudprovider.SD } } - return "", fmt.Errorf("Failed to create, specification not supported") + return "", fmt.Errorf("Failed to create, %s", err.Error()) } func (self *SHost) Refresh() error { diff --git a/pkg/util/qcloud/image.go b/pkg/util/qcloud/image.go index 269df6358e..84bd67ab7d 100644 --- a/pkg/util/qcloud/image.go +++ b/pkg/util/qcloud/image.go @@ -43,6 +43,10 @@ type SImage struct { IsSupportCloudinit bool // 镜像是否支持cloud-init } +func (self *SImage) GetMinRamSizeMb() int { + return 0 +} + func (self *SRegion) GetImages(status string, owner string, imageIds []string, name string, offset int, limit int) ([]SImage, int, error) { if limit > 50 || limit <= 0 { limit = 50