diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 0394d17c36..972fadb6a3 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -60,7 +60,10 @@ type SNetworkManager struct { var NetworkManager *SNetworkManager -func init() { +func GetNetworkManager() *SNetworkManager { + if NetworkManager != nil { + return NetworkManager + } NetworkManager = &SNetworkManager{ SSharableVirtualResourceBaseManager: db.NewSharableVirtualResourceBaseManager( SNetwork{}, @@ -70,6 +73,11 @@ func init() { ), } NetworkManager.SetVirtualObject(NetworkManager) + return NetworkManager +} + +func init() { + GetNetworkManager() } type SNetwork struct { diff --git a/pkg/scheduler/algorithm/predicates/network_predicate.go b/pkg/scheduler/algorithm/predicates/network_predicate.go index b6c1e9c7c9..390936a86e 100644 --- a/pkg/scheduler/algorithm/predicates/network_predicate.go +++ b/pkg/scheduler/algorithm/predicates/network_predicate.go @@ -41,15 +41,22 @@ type NetworkPredicate struct { networkFreePortCount map[string]int } -func NewNetworkPredicate(getter INetworkNicCountGetter) *NetworkPredicate { - if getter == nil { - getter = models.NetworkManager - } +func NewNetworkPredicate() *NetworkPredicate { return &NetworkPredicate{ - NetworkNicCountGetter: getter, + NetworkNicCountGetter: nil, + networkFreePortCount: make(map[string]int), } } +func NewNetworkPredicateWithNicCounter() *NetworkPredicate { + return NewNetworkPredicate().WithNetworkCountGetter(models.GetNetworkManager()) +} + +func (p *NetworkPredicate) WithNetworkCountGetter(getter INetworkNicCountGetter) *NetworkPredicate { + p.NetworkNicCountGetter = getter + return p +} + func (p *NetworkPredicate) Name() string { return "host_network" } @@ -57,6 +64,7 @@ func (p *NetworkPredicate) Name() string { func (p *NetworkPredicate) Clone() core.FitPredicate { return &NetworkPredicate{ NetworkNicCountGetter: p.NetworkNicCountGetter, + networkFreePortCount: p.networkFreePortCount, } } @@ -75,14 +83,16 @@ func (p *NetworkPredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, networkIds.Insert(net.GetId()) } } - netCounts, err := p.NetworkNicCountGetter.GetTotalNicCount(networkIds.UnsortedList()) - if err != nil { - return false, errors.Wrap(err, "unable to GetTotalNicCount") - } - p.networkFreePortCount = map[string]int{} - for i := range cs { - for _, net := range cs[i].Getter().Networks() { - p.networkFreePortCount[net.Id] = net.GetTotalAddressCount() - netCounts[net.Id] + + if p.NetworkNicCountGetter != nil { + netCounts, err := p.NetworkNicCountGetter.GetTotalNicCount(networkIds.UnsortedList()) + if err != nil { + return false, errors.Wrap(err, "unable to GetTotalNicCount") + } + for i := range cs { + for _, net := range cs[i].Getter().Networks() { + p.networkFreePortCount[net.Id] = net.GetTotalAddressCount() - netCounts[net.Id] + } } } @@ -266,7 +276,10 @@ func (p *NetworkPredicate) Execute(u *core.Unit, c core.Candidater) (bool, []cor d := u.SchedData() getFreePort := func(id string) int { - return p.networkFreePortCount[id] - c.Getter().GetPendingUsage().NetUsage.Get(id) + if _, ok := p.networkFreePortCount[id]; ok { + return p.networkFreePortCount[id] - c.Getter().GetPendingUsage().NetUsage.Get(id) + } + return c.Getter().GetFreePort(id) } for _, reqNet := range d.Networks { diff --git a/pkg/scheduler/algorithmprovider/baremetal.go b/pkg/scheduler/algorithmprovider/baremetal.go index fc31c5e5cb..5724169023 100644 --- a/pkg/scheduler/algorithmprovider/baremetal.go +++ b/pkg/scheduler/algorithmprovider/baremetal.go @@ -34,7 +34,7 @@ func baremetalPredicates() sets.String { factory.RegisterFitPredicate("c-BaremetalCPUFilter", &predicatebm.CPUPredicate{}), factory.RegisterFitPredicate("d-BaremetalMemoryFilter", &predicatebm.MemoryPredicate{}), factory.RegisterFitPredicate("e-BaremetalStorageFilter", &predicatebm.StoragePredicate{}), - factory.RegisterFitPredicate("f-BaremetalNetFilter", predicates.NewNetworkPredicate(nil)), + factory.RegisterFitPredicate("f-BaremetalNetFilter", predicates.NewNetworkPredicate()), factory.RegisterFitPredicate("g-BaremetalResourceTypeFilter", &predicates.ResourceTypePredicate{}), factory.RegisterFitPredicate("h-DiskschedtagFilter", &predicates.DiskSchedtagPredicate{}), factory.RegisterFitPredicate("i-NetschedtagFilter", &predicates.NetworkSchedtagPredicate{}), diff --git a/pkg/scheduler/algorithmprovider/defaults.go b/pkg/scheduler/algorithmprovider/defaults.go index 2db82de958..3e10cda8cd 100644 --- a/pkg/scheduler/algorithmprovider/defaults.go +++ b/pkg/scheduler/algorithmprovider/defaults.go @@ -39,7 +39,7 @@ func defaultPredicates() sets.String { factory.RegisterFitPredicate("g-GuestCPUFilter", &predicateguest.CPUPredicate{}), factory.RegisterFitPredicate("h-GuestMemoryFilter", &predicateguest.MemoryPredicate{}), factory.RegisterFitPredicate("i-GuestStorageFilter", &predicateguest.StoragePredicate{}), - factory.RegisterFitPredicate("j-GuestNetworkFilter", predicates.NewNetworkPredicate(nil)), + factory.RegisterFitPredicate("j-GuestNetworkFilter", predicates.NewNetworkPredicateWithNicCounter()), factory.RegisterFitPredicate("k-GuestIsolatedDeviceFilter", &predicates.IsolatedDevicePredicate{}), factory.RegisterFitPredicate("l-GuestResourceTypeFilter", &predicates.ResourceTypePredicate{}), factory.RegisterFitPredicate("m-GuestDiskschedtagFilter", &predicates.DiskSchedtagPredicate{}), diff --git a/pkg/scheduler/test/prepare.go b/pkg/scheduler/test/prepare.go index 423ed0f6e1..7044072a5e 100644 --- a/pkg/scheduler/test/prepare.go +++ b/pkg/scheduler/test/prepare.go @@ -201,7 +201,7 @@ func buildScheduler(ctrl *gomock.Controller, networkNicCount map[string]int, pre if networkNicGetter == nil { fmt.Printf("networkNicGetter is nil") } - ret["j-GuestNetworkFilter"] = pre.NewNetworkPredicate(networkNicGetter) + ret["j-GuestNetworkFilter"] = pre.NewNetworkPredicate().WithNetworkCountGetter(networkNicGetter) return ret, nil }) mockScheduler.EXPECT().PriorityConfigs().AnyTimes().DoAndReturn(func() ([]core.PriorityConfig, error) {