diff --git a/pkg/scheduler/algorithm/predicates/sku_predicate.go b/pkg/scheduler/algorithm/predicates/sku_predicate.go index e83e15513f..46149db707 100644 --- a/pkg/scheduler/algorithm/predicates/sku_predicate.go +++ b/pkg/scheduler/algorithm/predicates/sku_predicate.go @@ -45,13 +45,25 @@ func (p *InstanceTypePredicate) Execute(u *core.Unit, c core.Candidater) (bool, d := u.SchedData() + regionId := c.Getter().Region().Id + regionName := c.Getter().Region().Name zoneId := c.Getter().Zone().Id zoneName := c.Getter().Zone().Name instanceType := d.InstanceType - sku := skuman.GetByZone(instanceType, zoneId) - if sku == nil { - h.Exclude(fmt.Sprintf("Not found server sku %s at zone %s", instanceType, zoneName)) + reqRegion := d.PreferRegion + reqZone := d.PreferZone + + if reqRegion != "" && reqZone == "" { + sku := skuman.GetByRegion(instanceType, regionId) + if sku == nil { + h.Exclude(fmt.Sprintf("Not found server sku %s at region %s", instanceType, regionName)) + } + } else { + sku := skuman.GetByZone(instanceType, zoneId) + if sku == nil { + h.Exclude(fmt.Sprintf("Not found server sku %s at zone %s", instanceType, zoneName)) + } } return h.GetResult() diff --git a/pkg/scheduler/cache/candidate/base.go b/pkg/scheduler/cache/candidate/base.go index 7286b1f488..df88ad9a60 100644 --- a/pkg/scheduler/cache/candidate/base.go +++ b/pkg/scheduler/cache/candidate/base.go @@ -281,8 +281,11 @@ func newBaseHostDesc(b *baseBuilder, host *computemodels.SHost) (*BaseHostDesc, if err := desc.fillNetworks(host); err != nil { return nil, fmt.Errorf("Fill networks error: %v", err) } - if err := desc.fillOnecloudVpcNetworks(); err != nil { - return nil, fmt.Errorf("Fill onecloud vpc networks error: %v", err) + // only onecloud host should fill onecloud vpc networks + if host.HostType == computeapi.HOST_TYPE_HYPERVISOR { + if err := desc.fillOnecloudVpcNetworks(); err != nil { + return nil, fmt.Errorf("Fill onecloud vpc networks error: %v", err) + } } if err := desc.fillZone(host); err != nil { diff --git a/pkg/scheduler/data_manager/sku/sku.go b/pkg/scheduler/data_manager/sku/sku.go index e8e1466db3..9247e7c8c9 100644 --- a/pkg/scheduler/data_manager/sku/sku.go +++ b/pkg/scheduler/data_manager/sku/sku.go @@ -56,14 +56,19 @@ func GetByZone(instanceType, zoneId string) *ServerSku { return skuManager.GetByZone(instanceType, zoneId) } +func GetByRegion(instanceType, regionId string) *ServerSku { + return skuManager.GetByRegion(instanceType, regionId) +} + type skuMap struct { *sync.Map } type ServerSku struct { - Id string `json:"id"` - Name string `json:"name"` - ZoneId string `json:"zone_id"` + Id string `json:"id"` + Name string `json:"name"` + RegionId string `json:"cloudregion_id"` + ZoneId string `json:"zone_id"` } type skuList []*ServerSku @@ -81,6 +86,15 @@ func (l skuList) DebugString() string { return fmt.Sprintf("%s", jsonutils.Marshal(l).String()) } +func (l skuList) GetByRegion(regionId string) *ServerSku { + for _, s := range l { + if s.RegionId == regionId { + return s + } + } + return nil +} + func (l skuList) GetByZone(zoneId string) *ServerSku { for _, s := range l { if s.ZoneId == zoneId { @@ -124,7 +138,7 @@ func (m *SSkuManager) syncOnce() { startTime := time.Now() skus := make([]ServerSku, 0) - q := models.ServerSkuManager.Query("id", "name", "zone_id") + q := models.ServerSkuManager.Query("id", "name", "cloudregion_id", "zone_id") q = q.Filter( sqlchemy.OR( sqlchemy.Equals(q.Field("prepaid_status"), computeapi.SkuStatusAvailable), @@ -152,3 +166,11 @@ func (m *SSkuManager) GetByZone(instanceType, zoneId string) *ServerSku { } return l.GetByZone(zoneId) } + +func (m *SSkuManager) GetByRegion(instanceType, regionId string) *ServerSku { + l := m.skuMap.Get(instanceType) + if l == nil { + return nil + } + return l.GetByRegion(regionId) +}