diff --git a/pkg/apis/compute/api.go b/pkg/apis/compute/api.go index b73072cb4c..7c84fdca0c 100644 --- a/pkg/apis/compute/api.go +++ b/pkg/apis/compute/api.go @@ -231,6 +231,9 @@ type BaremetalDiskConfig struct { } type ServerConfigs struct { + // 调度使用指定的云账号 + PreferManager string `json:"prefer_manager_id"` + // 调度到指定区域,优先级低于prefer_zone_id PreferRegion string `json:"prefer_region_id"` diff --git a/pkg/compute/models/guest_actions.go b/pkg/compute/models/guest_actions.go index a862793d3f..92078de608 100644 --- a/pkg/compute/models/guest_actions.go +++ b/pkg/compute/models/guest_actions.go @@ -476,7 +476,7 @@ func (self *SGuest) PerformClone(ctx context.Context, userCred mcclient.TokenCre createInput.EipBw = cloneInput.EipBw createInput.Eip = cloneInput.Eip createInput.EipChargeType = cloneInput.EipChargeType - if err := GuestManager.validateEip(userCred, createInput, createInput.PreferRegion); err != nil { + if err := GuestManager.validateEip(userCred, createInput, createInput.PreferRegion, createInput.PreferManager); err != nil { return nil, err } diff --git a/pkg/compute/models/guests.go b/pkg/compute/models/guests.go index a01a488cde..a7bc6f14c9 100644 --- a/pkg/compute/models/guests.go +++ b/pkg/compute/models/guests.go @@ -1255,7 +1255,7 @@ func (manager *SGuestManager) validateCreateData( } preferRegionId, _ := data.GetString("prefer_region_id") - if err := manager.validateEip(userCred, input, preferRegionId); err != nil { + if err := manager.validateEip(userCred, input, preferRegionId, input.PreferManager); err != nil { return nil, err } @@ -1311,7 +1311,8 @@ func (manager *SGuestManager) ValidateCreateData(ctx context.Context, userCred m return input.JSON(input), nil } -func (manager *SGuestManager) validateEip(userCred mcclient.TokenCredential, input *api.ServerCreateInput, preferRegionId string) error { +func (manager *SGuestManager) validateEip(userCred mcclient.TokenCredential, input *api.ServerCreateInput, + preferRegionId string, preferManagerId string) error { eipStr := input.Eip eipBw := input.EipBw if len(eipStr) > 0 || eipBw > 0 { @@ -1337,6 +1338,12 @@ func (manager *SGuestManager) validateEip(userCred mcclient.TokenCredential, inp } input.Eip = eipObj.GetId() + eipCloudprovider := eip.GetCloudprovider() + if len(preferManagerId) > 0 && preferManagerId != eipCloudprovider.Id { + return httperrors.NewConflictError("cannot assoicate with eip %s: different cloudprovider", eipStr) + } + input.PreferManager = eipCloudprovider.Id + eipRegion := eip.GetRegion() // preferRegionId, _ := data.GetString("prefer_region_id") if len(preferRegionId) > 0 && preferRegionId != eipRegion.Id { diff --git a/pkg/mcclient/options/servers.go b/pkg/mcclient/options/servers.go index d620bb1e74..70510833ca 100644 --- a/pkg/mcclient/options/servers.go +++ b/pkg/mcclient/options/servers.go @@ -124,6 +124,7 @@ func ParseServerDeployInfoList(list []string) ([]*computeapi.DeployConfig, error } type ServerConfigs struct { + Manager string `help:"Preferred cloudprovider where virtual server should bd created" json:"prefer_manager"` Region string `help:"Preferred region where virtual server should be created" json:"prefer_region"` Zone string `help:"Preferred zone where virtual server should be created" json:"prefer_zone"` Wire string `help:"Preferred wire where virtual server should be created" json:"prefer_wire"` @@ -148,6 +149,7 @@ type ServerConfigs struct { func (o ServerConfigs) Data() (*computeapi.ServerConfigs, error) { data := &computeapi.ServerConfigs{ + PreferManager: o.Manager, PreferRegion: o.Region, PreferZone: o.Zone, PreferWire: o.Wire, diff --git a/pkg/scheduler/data_manager/candidate_manager.go b/pkg/scheduler/data_manager/candidate_manager.go index 4beda4c0f9..ce5920da27 100644 --- a/pkg/scheduler/data_manager/candidate_manager.go +++ b/pkg/scheduler/data_manager/candidate_manager.go @@ -30,6 +30,7 @@ type CandidateGetArgs struct { ResType string RegionID string ZoneID string + ManagerID string HostTypes []string } @@ -205,7 +206,7 @@ func (cm *CandidateManager) GetCandidates(args CandidateGetArgs) ([]core.Candida result := []core.Candidater{} matchZone := func(r core.Candidater, zoneId string) bool { - if args.ZoneID != "" { + if zoneId != "" { if r.Getter().Zone().GetId() == zoneId { return true } @@ -215,7 +216,7 @@ func (cm *CandidateManager) GetCandidates(args CandidateGetArgs) ([]core.Candida } matchRegion := func(r core.Candidater, regionId string) bool { - if args.RegionID != "" { + if regionId != "" { if r.Getter().Region().GetId() == regionId { return true } @@ -224,6 +225,16 @@ func (cm *CandidateManager) GetCandidates(args CandidateGetArgs) ([]core.Candida return true } + matchCloudprovider := func(r core.Candidater, managerId string) bool { + if managerId != "" { + if r.Getter().Cloudprovider().GetId() == managerId { + return true + } + return false + } + return true + } + matchHostTypes := func(c core.Candidater, hostTypes []string) bool { if len(hostTypes) == 0 { return true @@ -242,6 +253,10 @@ func (cm *CandidateManager) GetCandidates(args CandidateGetArgs) ([]core.Candida continue } + if !matchCloudprovider(r, args.ManagerID) { + continue + } + if !matchHostTypes(r, args.HostTypes) { continue } diff --git a/pkg/scheduler/manager/scheduler.go b/pkg/scheduler/manager/scheduler.go index f69e3972f3..ee296ea552 100644 --- a/pkg/scheduler/manager/scheduler.go +++ b/pkg/scheduler/manager/scheduler.go @@ -40,6 +40,7 @@ func candidatesByProvider(provider CandidatesProvider, schedData *api.SchedInfo) ResType: provider.CandidateType(), ZoneID: schedData.PreferZone, RegionID: schedData.PreferRegion, + ManagerID: schedData.PreferManager, HostTypes: schedData.GetCandidateHostTypes(), } hosts, err = candidateManager.GetCandidates(args)