diff --git a/pkg/apis/scheduler/api.go b/pkg/apis/scheduler/api.go index 83d0602a6b..9645e64569 100644 --- a/pkg/apis/scheduler/api.go +++ b/pkg/apis/scheduler/api.go @@ -86,6 +86,11 @@ type ScheduleInput struct { // we don't need reallocate network ReuseNetwork bool `json:"reuse_network"` + // Change config + ChangeConfig bool + // guest who change config has isolated device + HasIsolatedDevice bool + PendingUsages []jsonutils.JSONObject } diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index 085e7a7f61..a1bc16371c 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -2542,7 +2542,7 @@ func (self *SGuest) PerformChangeConfig(ctx context.Context, userCred mcclient.T } // schedulr forecast - schedDesc := self.confToSchedDesc(addCpu, addMem, addDisk) + schedDesc := self.changeConfToSchedDesc(addCpu, addMem, addDisk) s := auth.GetAdminSession(ctx, options.Options.Region, "") canChangeConf, err := modules.SchedManager.DoScheduleForecast(s, schedDesc, 1) if err != nil { @@ -2588,7 +2588,7 @@ func (self *SGuest) PerformChangeConfig(ctx context.Context, userCred mcclient.T return nil, nil } -func (self *SGuest) confToSchedDesc(addCpu, addMem, addDisk int) *schedapi.ScheduleInput { +func (self *SGuest) changeConfToSchedDesc(addCpu, addMem, addDisk int) *schedapi.ScheduleInput { guestDisks := self.GetDisks() diskInfo := guestDisks[0].ToDiskConfig() diskInfo.SizeMb = addDisk @@ -2605,6 +2605,8 @@ func (self *SGuest) confToSchedDesc(addCpu, addMem, addDisk int) *schedapi.Sched Project: self.ProjectId, Domain: self.DomainId, }, + ChangeConfig: true, + HasIsolatedDevice: len(self.GetIsolatedDevices()) > 0, } return desc } diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index d14aeac4dd..4b8aa0dedd 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -200,7 +200,7 @@ func (h *PredicateHelper) UseReserved() bool { usable := false data := h.Unit.SchedData() isoDevs := data.IsolatedDevices - if len(isoDevs) > 0 { + if len(isoDevs) > 0 || (data.ChangeConfig && data.HasIsolatedDevice) { usable = true } return usable