From 099e42483d15166a817ddb2bf3fadb242c24424e Mon Sep 17 00:00:00 2001 From: TangBin Date: Tue, 6 Aug 2019 17:28:10 +0800 Subject: [PATCH] kvm elb fix --- pkg/compute/models/loadbalancerclusters.go | 6 +++--- pkg/compute/models/loadbalancers.go | 6 +++--- pkg/compute/regiondrivers/kvm.go | 23 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/pkg/compute/models/loadbalancerclusters.go b/pkg/compute/models/loadbalancerclusters.go index fce4dc317f..5af16c73b3 100644 --- a/pkg/compute/models/loadbalancerclusters.go +++ b/pkg/compute/models/loadbalancerclusters.go @@ -127,7 +127,7 @@ func (lbc *SLoadbalancerCluster) Delete(ctx context.Context, userCred mcclient.T return nil } -func (man *SLoadbalancerClusterManager) findByZoneId(zoneId string) []SLoadbalancerCluster { +func (man *SLoadbalancerClusterManager) FindByZoneId(zoneId string) []SLoadbalancerCluster { r := []SLoadbalancerCluster{} q := man.Query().Equals("zone_id", zoneId) if err := db.FetchModelObjects(man, q, &r); err != nil { @@ -140,7 +140,7 @@ func (man *SLoadbalancerClusterManager) findByZoneId(zoneId string) []SLoadbalan func (man *SLoadbalancerClusterManager) findByVrrpRouterIdInZone(zoneId string, routerId int) (*SLoadbalancerCluster, error) { var r *SLoadbalancerCluster - peerClusters := man.findByZoneId(zoneId) + peerClusters := man.FindByZoneId(zoneId) for i := range peerClusters { peerCluster := &peerClusters[i] peerClusterLbagents, err := man.getLoadbalancerAgents(peerCluster.Id) @@ -194,7 +194,7 @@ func (man *SLoadbalancerClusterManager) InitializeData() error { } lbc, ok := zoneCluster[zoneId] if !ok { - lbcs := man.findByZoneId(zoneId) + lbcs := man.FindByZoneId(zoneId) if len(lbcs) == 0 { m, err := db.NewModelObject(man) if err != nil { diff --git a/pkg/compute/models/loadbalancers.go b/pkg/compute/models/loadbalancers.go index 243cae9956..21f86c55aa 100644 --- a/pkg/compute/models/loadbalancers.go +++ b/pkg/compute/models/loadbalancers.go @@ -118,21 +118,21 @@ func (man *SLoadbalancerManager) ListItemFilter(ctx context.Context, q *sqlchemy func (man *SLoadbalancerManager) ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) { var region *SCloudregion if id, _ := data.GetString("vpc"); len(id) > 0 { - vpc, err := db.FetchById(VpcManager, id) + vpc, err := db.FetchByIdOrName(VpcManager, userCred, id) if err != nil { return nil, fmt.Errorf("getting vpc failed") } region, _ = vpc.(*SVpc).GetRegion() } else if id, _ := data.GetString("zone"); len(id) > 0 { - zone, err := db.FetchById(ZoneManager, id) + zone, err := db.FetchByIdOrName(ZoneManager, userCred, id) if err != nil { return nil, fmt.Errorf("getting zone failed") } region = zone.(*SZone).GetRegion() } else if id, _ := data.GetString("network"); len(id) > 0 { - network, err := db.FetchById(NetworkManager, strings.Split(id, ",")[0]) + network, err := db.FetchByIdOrName(NetworkManager, userCred, strings.Split(id, ",")[0]) if err != nil { return nil, fmt.Errorf("getting network failed") } diff --git a/pkg/compute/regiondrivers/kvm.go b/pkg/compute/regiondrivers/kvm.go index 47f1717927..5ed5d51804 100644 --- a/pkg/compute/regiondrivers/kvm.go +++ b/pkg/compute/regiondrivers/kvm.go @@ -61,10 +61,12 @@ func (self *SKVMRegionDriver) ValidateCreateLoadbalancerData(ctx context.Context ownerId := ctx.Value("ownerId").(mcclient.IIdentityProvider) networkV := validators.NewModelIdOrNameValidator("network", "network", ownerId) addressV := validators.NewIPv4AddrValidator("address") + clusterV := validators.NewModelIdOrNameValidator("cluster", "loadbalancercluster", ownerId) keyV := map[string]validators.IValidator{ "status": validators.NewStringChoicesValidator("status", api.LB_STATUS_SPEC).Default(api.LB_STATUS_ENABLED), "address": addressV.Optional(true), "network": networkV, + "cluster": clusterV.Optional(true), } if err := RunValidators(keyV, data); err != nil { return nil, err @@ -76,6 +78,27 @@ func (self *SKVMRegionDriver) ValidateCreateLoadbalancerData(ctx context.Context return nil, err } + if zone == nil { + return nil, httperrors.NewInputParameterError("zone info missing") + } + + if clusterV.Model == nil { + clusters := models.LoadbalancerClusterManager.FindByZoneId(zone.Id) + if len(clusters) == 0 { + return nil, httperrors.NewInputParameterError("zone %s(%s) has no lbcluster", zone.Name, zone.Id) + } + if len(clusters) > 1 { + log.Warningf("found %d lbclusters, randomly select 1", len(clusters)) + } + data.Set("cluster_id", jsonutils.NewString(clusters[0].Id)) + } else { + cluster := clusterV.Model.(*models.SLoadbalancerCluster) + if cluster.ZoneId != zone.Id { + return nil, httperrors.NewInputParameterError("cluster zone %s does not match network zone %s ", + cluster.ZoneId, zone.Id) + } + } + data.Set("cloudregion_id", jsonutils.NewString(region.GetId())) data.Set("zone_id", jsonutils.NewString(zone.GetId())) data.Set("vpc_id", jsonutils.NewString(vpc.GetId()))