kvm elb fix

This commit is contained in:
TangBin
2019-08-06 17:28:10 +08:00
parent f6482ee3f1
commit 099e42483d
3 changed files with 29 additions and 6 deletions
+3 -3
View File
@@ -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 {
+3 -3
View File
@@ -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")
}
+23
View File
@@ -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()))