add more testing for mergeAlternativeBackends

- fix edge cases caught by new testing
This commit is contained in:
Conor Landry 2018-11-20 17:13:21 -05:00
parent b65b85cd99
commit 988189cf9f
2 changed files with 304 additions and 41 deletions

View file

@ -1115,6 +1115,24 @@ func (n *NGINXController) createServers(data []*ingress.Ingress,
return servers
}
func canMergeBackend(primary *ingress.Backend, alternative *ingress.Backend) bool {
return primary.Name != alternative.Name && !primary.NoServer
}
// Performs the merge action and checks to ensure that one two alternative backends do not merge into each other
func mergeAlternativeBackend(priUps *ingress.Backend, altUps *ingress.Backend) bool {
if priUps.NoServer {
glog.Warningf("unable to merge alternative backend %v into primary backend %v because %v is a primary backend",
altUps.Name, priUps.Name, priUps.Name)
return false
}
priUps.AlternativeBackends =
append(priUps.AlternativeBackends, altUps.Name)
return true
}
// Compares an Ingress of a potential alternative backend's rules with each existing server and finds matching host + path pairs.
// If a match is found, we know that this server should back the alternative backend and add the alternative backend
// to a backend's alternative list.
@ -1126,49 +1144,59 @@ func mergeAlternativeBackends(ing *ingress.Ingress, upstreams map[string]*ingres
if ing.Spec.Backend != nil {
upsName := upstreamName(ing.Namespace, ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort)
ups := upstreams[upsName]
altUps := upstreams[upsName]
for _, defLoc := range servers[defServerName].Locations {
if !upstreams[defLoc.Backend].NoServer {
merged := false
for _, loc := range servers[defServerName].Locations {
priUps := upstreams[loc.Backend]
if canMergeBackend(priUps, altUps) {
glog.Infof("matching backend %v found for alternative backend %v",
upstreams[defLoc.Backend].Name, ups.Name)
priUps.Name, altUps.Name)
upstreams[defLoc.Backend].AlternativeBackends =
append(upstreams[defLoc.Backend].AlternativeBackends, ups.Name)
merged = mergeAlternativeBackend(priUps, altUps)
}
}
if !merged {
glog.Warningf("unable to find real backend for alternative backend %v. Deleting.", altUps.Name)
delete(upstreams, altUps.Name)
}
}
for _, rule := range ing.Spec.Rules {
for _, path := range rule.HTTP.Paths {
upsName := upstreamName(ing.Namespace, path.Backend.ServiceName, path.Backend.ServicePort)
ups := upstreams[upsName]
altUps := upstreams[upsName]
merged := false
server := servers[rule.Host]
server, ok := servers[rule.Host]
if !ok {
glog.Errorf("cannot merge alternative backend %s into hostname %s that does not exist",
altUps.Name,
rule.Host)
continue
}
// find matching paths
for _, location := range server.Locations {
if location.Backend == defUpstreamName {
continue
}
for _, loc := range server.Locations {
priUps := upstreams[loc.Backend]
if location.Path == path.Path && !upstreams[location.Backend].NoServer {
if canMergeBackend(priUps, altUps) && loc.Path == path.Path {
glog.Infof("matching backend %v found for alternative backend %v",
upstreams[location.Backend].Name, ups.Name)
priUps.Name, altUps.Name)
upstreams[location.Backend].AlternativeBackends =
append(upstreams[location.Backend].AlternativeBackends, ups.Name)
merged = true
merged = mergeAlternativeBackend(priUps, altUps)
}
}
if !merged {
glog.Warningf("unable to find real backend for alternative backend %v. Deleting.", ups.Name)
delete(upstreams, ups.Name)
glog.Warningf("unable to find real backend for alternative backend %v. Deleting.", altUps.Name)
delete(upstreams, altUps.Name)
}
}
}