mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-07-01 02:24:47 +08:00
scheduler: select networks by project domain order
This commit is contained in:
@@ -51,6 +51,7 @@ type NetworkConfig struct {
|
||||
StandbyAddrCount int `json:"standby_addr_count"`
|
||||
|
||||
Project string `json:"project_id"`
|
||||
Domain string `json:"domain_id"`
|
||||
Ifname string `json:"ifname"`
|
||||
Schedtags []*SchedtagConfig `json:"schedtags"`
|
||||
}
|
||||
|
||||
@@ -1069,6 +1069,8 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m
|
||||
if len(netConfig.Driver) == 0 {
|
||||
netConfig.Driver = osProf.NetDriver
|
||||
}
|
||||
netConfig.Project = ownerId.GetProjectId()
|
||||
netConfig.Domain = ownerId.GetProjectDomainId()
|
||||
input.Networks[idx] = netConfig
|
||||
}
|
||||
|
||||
|
||||
@@ -1803,3 +1803,12 @@ func (network *SNetwork) ClearSchedDescCache() error {
|
||||
}
|
||||
return wire.clearHostSchedDescCache()
|
||||
}
|
||||
|
||||
func (network *SNetwork) PerformChangeOwner(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, data jsonutils.JSONObject) (jsonutils.JSONObject, error) {
|
||||
ret, err := network.SSharableVirtualResourceBase.PerformChangeOwner(ctx, userCred, query, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
network.ClearSchedDescCache()
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ package predicates
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/util/netutils"
|
||||
@@ -151,12 +152,62 @@ func (p *NetworkSchedtagPredicate) GetCandidateResourceSortScore(selectRes ISche
|
||||
return int64(cnt)
|
||||
}
|
||||
|
||||
type SortNetworks struct {
|
||||
requireNet *netW
|
||||
nets []*api.CandidateNetwork
|
||||
}
|
||||
|
||||
func newSortNetworks(req *netW, nets []*api.CandidateNetwork) *SortNetworks {
|
||||
return &SortNetworks{
|
||||
requireNet: req,
|
||||
nets: nets,
|
||||
}
|
||||
}
|
||||
|
||||
func (ns *SortNetworks) Len() int {
|
||||
return len(ns.nets)
|
||||
}
|
||||
|
||||
func (ns *SortNetworks) Swap(i, j int) {
|
||||
ns.nets[i], ns.nets[j] = ns.nets[j], ns.nets[i]
|
||||
}
|
||||
|
||||
func (ns *SortNetworks) Less(i, j int) bool {
|
||||
// match order by project_id, domain_id
|
||||
n1 := ns.nets[i]
|
||||
n2 := ns.nets[j]
|
||||
reqProject := ns.requireNet.Project
|
||||
reqDomain := ns.requireNet.Domain
|
||||
if n1.ProjectId == reqProject && n2.ProjectId != reqProject {
|
||||
return true
|
||||
}
|
||||
if n1.DomainId == reqDomain && n2.DomainId != reqDomain {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (ns *SortNetworks) Results() []ISchedtagCandidateResource {
|
||||
res := make([]ISchedtagCandidateResource, 0)
|
||||
for _, n := range ns.nets {
|
||||
res = append(res, n)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (p *NetworkSchedtagPredicate) DoSelect(
|
||||
c core.Candidater,
|
||||
input ISchedtagCustomer,
|
||||
res []ISchedtagCandidateResource,
|
||||
) []ISchedtagCandidateResource {
|
||||
return res
|
||||
networks := make([]*api.CandidateNetwork, 0)
|
||||
reqNet := input.(*netW)
|
||||
for _, netObj := range res {
|
||||
networks = append(networks, netObj.(*api.CandidateNetwork))
|
||||
}
|
||||
sNets := newSortNetworks(reqNet, networks)
|
||||
sort.Sort(sNets)
|
||||
return sNets.Results()
|
||||
}
|
||||
|
||||
func (p *NetworkSchedtagPredicate) AddSelectResult(index int, selectRes []ISchedtagCandidateResource, output *core.AllocatedResource) {
|
||||
|
||||
Reference in New Issue
Block a user