diff --git a/pkg/compute/guestdrivers/base.go b/pkg/compute/guestdrivers/base.go index 7349311210..bee24acdde 100644 --- a/pkg/compute/guestdrivers/base.go +++ b/pkg/compute/guestdrivers/base.go @@ -32,7 +32,18 @@ import ( "yunion.io/x/onecloud/pkg/util/billing" ) +type SBaseGuestScheduleDriver struct{} + +func (d SBaseGuestScheduleDriver) DoScheduleSKUFilter() bool { return true } + +func (d SBaseGuestScheduleDriver) DoScheduleCPUFilter() bool { return true } + +func (d SBaseGuestScheduleDriver) DoScheduleMemoryFilter() bool { return true } + +func (d SBaseGuestScheduleDriver) DoScheduleStorageFilter() bool { return true } + type SBaseGuestDriver struct { + SBaseGuestScheduleDriver } func (self *SBaseGuestDriver) StartGuestCreateTask(guest *models.SGuest, ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict, pendingUsage quotas.IQuota, parentTaskId string) error { diff --git a/pkg/compute/guestdrivers/esxi.go b/pkg/compute/guestdrivers/esxi.go index 87a8129fad..2e33e7936c 100644 --- a/pkg/compute/guestdrivers/esxi.go +++ b/pkg/compute/guestdrivers/esxi.go @@ -42,6 +42,10 @@ func init() { models.RegisterGuestDriver(&driver) } +func (self *SESXiGuestDriver) DoScheduleSKUFilter() bool { + return false +} + func (self *SESXiGuestDriver) GetHypervisor() string { return api.HYPERVISOR_ESXI } diff --git a/pkg/compute/guestdrivers/managedvirtual.go b/pkg/compute/guestdrivers/managedvirtual.go index b1e21eb5a4..42d7e706dc 100644 --- a/pkg/compute/guestdrivers/managedvirtual.go +++ b/pkg/compute/guestdrivers/managedvirtual.go @@ -42,6 +42,14 @@ type SManagedVirtualizedGuestDriver struct { SVirtualizedGuestDriver } +func (d SManagedVirtualizedGuestDriver) DoScheduleCPUFilter() bool { return false } + +func (d SManagedVirtualizedGuestDriver) DoScheduleSKUFilter() bool { return true } + +func (d SManagedVirtualizedGuestDriver) DoScheduleMemoryFilter() bool { return false } + +func (d SManagedVirtualizedGuestDriver) DoScheduleStorageFilter() bool { return false } + func (self *SManagedVirtualizedGuestDriver) GetJsonDescAtHost(ctx context.Context, userCred mcclient.TokenCredential, guest *models.SGuest, host *models.SHost) jsonutils.JSONObject { config := cloudprovider.SManagedVMCreateConfig{} config.Name = guest.Name diff --git a/pkg/compute/guestdrivers/openstack.go b/pkg/compute/guestdrivers/openstack.go index 71b9d727d3..ccd2ae08ae 100644 --- a/pkg/compute/guestdrivers/openstack.go +++ b/pkg/compute/guestdrivers/openstack.go @@ -36,6 +36,10 @@ func init() { models.RegisterGuestDriver(&driver) } +func (self *SOpenStackGuestDriver) DoScheduleCPUFilter() bool { return true } + +func (self *SOpenStackGuestDriver) DoScheduleMemoryFilter() bool { return true } + func (self *SOpenStackGuestDriver) GetHypervisor() string { return api.HYPERVISOR_OPENSTACK } diff --git a/pkg/compute/guestdrivers/virtualization.go b/pkg/compute/guestdrivers/virtualization.go index 418bfcdd04..f5bc43efa7 100644 --- a/pkg/compute/guestdrivers/virtualization.go +++ b/pkg/compute/guestdrivers/virtualization.go @@ -34,6 +34,10 @@ type SVirtualizedGuestDriver struct { SBaseGuestDriver } +func (d *SVirtualizedGuestDriver) DoScheduleSKUFilter() bool { + return false +} + func (self *SVirtualizedGuestDriver) GetMaxVCpuCount() int { return 128 } diff --git a/pkg/compute/models/guestdrivers.go b/pkg/compute/models/guestdrivers.go index 5780cfb1ed..f2d1fb5363 100644 --- a/pkg/compute/models/guestdrivers.go +++ b/pkg/compute/models/guestdrivers.go @@ -29,7 +29,16 @@ import ( "yunion.io/x/onecloud/pkg/util/billing" ) +type IGuestScheduleDriver interface { + DoScheduleSKUFilter() bool + DoScheduleCPUFilter() bool + DoScheduleMemoryFilter() bool + DoScheduleStorageFilter() bool +} + type IGuestDriver interface { + IGuestScheduleDriver + GetHypervisor() string GetProvider() string GetQuotaPlatformID() []string diff --git a/pkg/scheduler/algorithm/predicates/guest/cpu_predicate.go b/pkg/scheduler/algorithm/predicates/guest/cpu_predicate.go index 0a05292d81..6abdd32f17 100644 --- a/pkg/scheduler/algorithm/predicates/guest/cpu_predicate.go +++ b/pkg/scheduler/algorithm/predicates/guest/cpu_predicate.go @@ -34,7 +34,7 @@ func (f *CPUPredicate) Clone() core.FitPredicate { } func (f *CPUPredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, error) { - if u.IsPublicCloudProvider() { + if !u.GetHypervisorDriver().DoScheduleCPUFilter() { return false, nil } diff --git a/pkg/scheduler/algorithm/predicates/guest/memory_predicate.go b/pkg/scheduler/algorithm/predicates/guest/memory_predicate.go index 62ed6967cd..0402496540 100644 --- a/pkg/scheduler/algorithm/predicates/guest/memory_predicate.go +++ b/pkg/scheduler/algorithm/predicates/guest/memory_predicate.go @@ -35,7 +35,7 @@ func (p *MemoryPredicate) Clone() core.FitPredicate { } func (p *MemoryPredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, error) { - if u.IsPublicCloudProvider() { + if !u.GetHypervisorDriver().DoScheduleMemoryFilter() { return false, nil } diff --git a/pkg/scheduler/algorithm/predicates/guest/storage_predicate.go b/pkg/scheduler/algorithm/predicates/guest/storage_predicate.go index 4e7606e900..f6c3a88a01 100644 --- a/pkg/scheduler/algorithm/predicates/guest/storage_predicate.go +++ b/pkg/scheduler/algorithm/predicates/guest/storage_predicate.go @@ -41,7 +41,7 @@ func (p *StoragePredicate) Clone() core.FitPredicate { } func (p *StoragePredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, error) { - if u.IsPublicCloudProvider() { + if !u.GetHypervisorDriver().DoScheduleStorageFilter() { return false, nil } return true, nil diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index 12e3b65a5e..2fd31d9b55 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -336,10 +336,7 @@ func (p *BaseSchedtagPredicate) PreExecute(sp ISchedtagPredicateInstance, u *cor return false, nil } - p.Hypervisor = computeapi.HOSTTYPE_HYPERVISOR[u.SchedData().Hypervisor] - if len(p.Hypervisor) == 0 { - p.Hypervisor = u.SchedData().Hypervisor - } + p.Hypervisor = u.GetHypervisor() // always do select step u.AppendSelectPlugin(sp) diff --git a/pkg/scheduler/algorithm/predicates/sku_predicate.go b/pkg/scheduler/algorithm/predicates/sku_predicate.go index 416eca614b..e83e15513f 100644 --- a/pkg/scheduler/algorithm/predicates/sku_predicate.go +++ b/pkg/scheduler/algorithm/predicates/sku_predicate.go @@ -34,7 +34,7 @@ func (p *InstanceTypePredicate) Clone() core.FitPredicate { } func (p *InstanceTypePredicate) PreExecute(u *core.Unit, cs []core.Candidater) (bool, error) { - if u.SchedData().InstanceType == "" || !u.IsPublicCloudProvider() { + if u.SchedData().InstanceType == "" || !u.GetHypervisorDriver().DoScheduleSKUFilter() { return false, nil } return true, nil diff --git a/pkg/scheduler/api/sched.go b/pkg/scheduler/api/sched.go index b1ad6aa95c..160823cd04 100644 --- a/pkg/scheduler/api/sched.go +++ b/pkg/scheduler/api/sched.go @@ -124,8 +124,7 @@ func (data *SchedInfo) reviseData() { } func (d *SchedInfo) SkipDirtyMarkHost() bool { - isSharePublicCloudProvider := d.IsPublicCloudProvider() && (d.ResourceType == "" || d.ResourceType == computeapi.HostResourceTypeShared) - skipByHypervisor := isSharePublicCloudProvider || d.IsContainer || d.Hypervisor == SchedTypeContainer + skipByHypervisor := d.IsContainer || d.Hypervisor == SchedTypeContainer skipByBackup := d.Backup return skipByHypervisor || skipByBackup } @@ -139,10 +138,6 @@ func (d *SchedInfo) GetCandidateHostTypes() []string { } } -func (d *SchedInfo) IsPublicCloudProvider() bool { - return PublicCloudProviders.Has(d.Hypervisor) -} - func (d *SchedInfo) getDiskSize(backend string) int64 { total := int64(0) for _, disk := range d.Disks { diff --git a/pkg/scheduler/api/types.go b/pkg/scheduler/api/types.go index db76efa9b7..3e59259429 100644 --- a/pkg/scheduler/api/types.go +++ b/pkg/scheduler/api/types.go @@ -19,7 +19,6 @@ import ( "yunion.io/x/pkg/util/sets" - computeapi "yunion.io/x/onecloud/pkg/apis/compute" "yunion.io/x/onecloud/pkg/compute/models" ) @@ -62,8 +61,6 @@ var ( AggregateStrategyAvoid, ) - PublicCloudProviders = sets.NewString(computeapi.PUBLIC_CLOUD_HYPERVISORS...) - ValidGpuTypes = sets.NewString( GPU_HPC_TYPE, GPU_VGA_TYPE, diff --git a/pkg/scheduler/core/context.go b/pkg/scheduler/core/context.go index a128bf6d87..ffd0e5fc1b 100644 --- a/pkg/scheduler/core/context.go +++ b/pkg/scheduler/core/context.go @@ -19,6 +19,8 @@ import ( "sort" "strings" "sync" + "yunion.io/x/onecloud/pkg/apis/compute" + "yunion.io/x/onecloud/pkg/compute/models" "yunion.io/x/pkg/tristate" "yunion.io/x/log" @@ -432,12 +434,16 @@ func (u *Unit) ShouldExecuteSchedtagFilter(hostId string) bool { return true } -func (u *Unit) IsPublicCloudProvider() bool { - return u.SchedData().IsPublicCloudProvider() +func (u *Unit) GetHypervisor() string { + hypervisor := compute.HOSTTYPE_HYPERVISOR[u.SchedData().Hypervisor] + if hypervisor == "" { + hypervisor = u.SchedData().Hypervisor + } + return hypervisor } -func (u *Unit) SkipDirtyMarkHost() bool { - return u.SchedData().SkipDirtyMarkHost() +func (u *Unit) GetHypervisorDriver() models.IGuestDriver { + return models.GetDriver(u.GetHypervisor()) } func (u *Unit) AppendFailedCandidates(fcs []FailedCandidate) { diff --git a/pkg/scheduler/handler/handler.go b/pkg/scheduler/handler/handler.go index abe8b1e378..34d2610e6d 100644 --- a/pkg/scheduler/handler/handler.go +++ b/pkg/scheduler/handler/handler.go @@ -292,15 +292,20 @@ func doSyncSchedule(c *gin.Context) { resp = transToRegionSchedResult(result.Data, count, sid) } - if err := setSchedPendingUsage(schedInfo, resp); err != nil { + driver := result.Unit.GetHypervisorDriver() + if err := setSchedPendingUsage(driver, schedInfo, resp); err != nil { c.AbortWithError(http.StatusInternalServerError, err) return } c.JSON(http.StatusOK, resp) } -func setSchedPendingUsage(req *api.SchedInfo, resp *schedapi.ScheduleOutput) error { - if req.IsSuggestion || req.SkipDirtyMarkHost() { +func IsDriverSkipScheduleDirtyMark(driver computemodels.IGuestDriver) bool { + return driver.DoScheduleCPUFilter() || driver.DoScheduleMemoryFilter() || driver.DoScheduleStorageFilter() +} + +func setSchedPendingUsage(driver computemodels.IGuestDriver, req *api.SchedInfo, resp *schedapi.ScheduleOutput) error { + if req.IsSuggestion || IsDriverSkipScheduleDirtyMark(driver) || req.SkipDirtyMarkHost() { return nil } for _, item := range resp.Candidates {