mirror of
https://github.com/yunionio/cloudpods.git
synced 2026-09-24 16:03:43 +08:00
kvm elb fix
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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()))
|
||||
|
||||
Reference in New Issue
Block a user