Skip to content

Commit

Permalink
lbbackends: allow backends of the same region (vs. zone)
Browse files Browse the repository at this point in the history
  • Loading branch information
yousong committed Jun 9, 2020
1 parent 333954a commit 1dc3123
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 14 deletions.
15 changes: 13 additions & 2 deletions pkg/compute/models/loadbalancerbackendgroups.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,8 +188,12 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
}
data.Update(jsonutils.Marshal(input))

lb := lbV.Model.(*SLoadbalancer)
backends := []cloudprovider.SLoadbalancerBackend{}
var (
lb = lbV.Model.(*SLoadbalancer)
lbRegion = lb.GetRegion()
lbIsManaged = lb.IsManaged()
backends = []cloudprovider.SLoadbalancerBackend{}
)
if data.Contains("backends") {
if err := data.Unmarshal(&backends, "backends"); err != nil {
return nil, err
Expand All @@ -208,6 +212,8 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
return nil, httperrors.NewMissingParameterError("Missing backend id")
}

var backendRegion *SCloudregion

switch backends[i].BackendType {
case api.LB_BACKEND_GUEST:
_guest, err := GuestManager.FetchByIdOrName(userCred, backends[i].ID)
Expand All @@ -233,6 +239,7 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
return nil, err
}
backends[i].Address = address
backendRegion = host.GetRegion()
case api.LB_BACKEND_HOST:
if !db.IsAdminAllowCreate(userCred, man) {
return nil, httperrors.NewForbiddenError("only sysadmin can specify host as backend")
Expand All @@ -249,9 +256,13 @@ func (man *SLoadbalancerBackendGroupManager) ValidateCreateData(ctx context.Cont
backends[i].Name = host.Name
backends[i].ExternalID = host.ExternalId
backends[i].Address = host.AccessIp
backendRegion = host.GetRegion()
default:
return nil, httperrors.NewInputParameterError("unexpected backend type %s", backends[i].BackendType)
}
if lbIsManaged && backendRegion.Id != lbRegion.Id {
return nil, httperrors.NewInputParameterError("region of backend %d does not match that of lb's", i)
}
}
}
data.Set("backends", jsonutils.Marshal(backends))
Expand Down
18 changes: 6 additions & 12 deletions pkg/compute/regiondrivers/kvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,15 +153,6 @@ func (self *SKVMRegionDriver) ValidateUpdateLoadbalancerCertificateData(ctx cont
}

func (self *SKVMRegionDriver) ValidateCreateLoadbalancerBackendGroupData(ctx context.Context, userCred mcclient.TokenCredential, data *jsonutils.JSONDict, lb *models.SLoadbalancer, backends []cloudprovider.SLoadbalancerBackend) (*jsonutils.JSONDict, error) {
for _, backend := range backends {
switch backend.BackendType {
case api.LB_BACKEND_GUEST:
if backend.ZoneId != lb.ZoneId {
return nil, fmt.Errorf("zone of host %q (%s) != zone of loadbalancer %q (%s)",
backend.HostName, backend.ZoneId, lb.Name, lb.ZoneId)
}
}
}
return data, nil
}

Expand Down Expand Up @@ -238,12 +229,15 @@ func (self *SKVMRegionDriver) ValidateCreateLoadbalancerBackendData(ctx context.
if host == nil {
return nil, httperrors.NewInputParameterError("error getting host of guest %s", guest.GetId())
}

if lb == nil {
return nil, httperrors.NewInputParameterError("error loadbalancer of backend group %s", backendGroup.GetId())
}
if host.ZoneId != lb.ZoneId {
return nil, httperrors.NewInputParameterError("zone of host %q (%s) != zone of loadbalancer %q (%s)",
var (
lbRegion = lb.GetRegion()
hostRegion = host.GetRegion()
)
if lbRegion.Id != hostRegion.Id {
return nil, httperrors.NewInputParameterError("region of host %q (%s) != region of loadbalancer %q (%s)",
host.Name, host.ZoneId, lb.Name, lb.ZoneId)
}
}
Expand Down

0 comments on commit 1dc3123

Please sign in to comment.