Fix canary-weight-total annotation ignored in rule backends (#9729)
* Missed canary weight total - added canary weight total for spec rules * - added e2e test
This commit is contained in:
parent
a84cfe5cfa
commit
e4a66fd2f6
2 changed files with 42 additions and 15 deletions
|
@ -33,6 +33,7 @@ import (
|
|||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/ingress-nginx/internal/ingress/annotations"
|
||||
"k8s.io/ingress-nginx/internal/ingress/annotations/canary"
|
||||
"k8s.io/ingress-nginx/internal/ingress/annotations/log"
|
||||
"k8s.io/ingress-nginx/internal/ingress/annotations/parser"
|
||||
"k8s.io/ingress-nginx/internal/ingress/annotations/proxy"
|
||||
|
@ -968,14 +969,7 @@ func (n *NGINXController) createUpstreams(data []*ingress.Ingress, du *ingress.B
|
|||
// configure traffic shaping for canary
|
||||
if anns.Canary.Enabled {
|
||||
upstreams[defBackend].NoServer = true
|
||||
upstreams[defBackend].TrafficShapingPolicy = ingress.TrafficShapingPolicy{
|
||||
Weight: anns.Canary.Weight,
|
||||
WeightTotal: anns.Canary.WeightTotal,
|
||||
Header: anns.Canary.Header,
|
||||
HeaderValue: anns.Canary.HeaderValue,
|
||||
HeaderPattern: anns.Canary.HeaderPattern,
|
||||
Cookie: anns.Canary.Cookie,
|
||||
}
|
||||
upstreams[defBackend].TrafficShapingPolicy = newTrafficShapingPolicy(anns.Canary)
|
||||
}
|
||||
|
||||
if len(upstreams[defBackend].Endpoints) == 0 {
|
||||
|
@ -1040,13 +1034,7 @@ func (n *NGINXController) createUpstreams(data []*ingress.Ingress, du *ingress.B
|
|||
// configure traffic shaping for canary
|
||||
if anns.Canary.Enabled {
|
||||
upstreams[name].NoServer = true
|
||||
upstreams[name].TrafficShapingPolicy = ingress.TrafficShapingPolicy{
|
||||
Weight: anns.Canary.Weight,
|
||||
Header: anns.Canary.Header,
|
||||
HeaderValue: anns.Canary.HeaderValue,
|
||||
HeaderPattern: anns.Canary.HeaderPattern,
|
||||
Cookie: anns.Canary.Cookie,
|
||||
}
|
||||
upstreams[name].TrafficShapingPolicy = newTrafficShapingPolicy(anns.Canary)
|
||||
}
|
||||
|
||||
if len(upstreams[name].Endpoints) == 0 {
|
||||
|
@ -1819,3 +1807,15 @@ func (n *NGINXController) getStreamSnippets(ingresses []*ingress.Ingress) []stri
|
|||
}
|
||||
return snippets
|
||||
}
|
||||
|
||||
// newTrafficShapingPolicy creates new ingress.TrafficShapingPolicy instance using canary configuration
|
||||
func newTrafficShapingPolicy(cfg canary.Config) ingress.TrafficShapingPolicy {
|
||||
return ingress.TrafficShapingPolicy{
|
||||
Weight: cfg.Weight,
|
||||
WeightTotal: cfg.WeightTotal,
|
||||
Header: cfg.Header,
|
||||
HeaderValue: cfg.HeaderValue,
|
||||
HeaderPattern: cfg.HeaderPattern,
|
||||
Cookie: cfg.Cookie,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -830,6 +830,33 @@ var _ = framework.DescribeAnnotation("canary-*", func() {
|
|||
|
||||
TestMainlineCanaryDistribution(f, host)
|
||||
})
|
||||
|
||||
ginkgo.It("should route requests split between mainline and canary if canary weight is 100 and weight total is 200", func() {
|
||||
host := "foo"
|
||||
annotations := map[string]string{}
|
||||
|
||||
ing := framework.NewSingleIngress(host, "/", host,
|
||||
f.Namespace, framework.EchoService, 80, annotations)
|
||||
f.EnsureIngress(ing)
|
||||
|
||||
f.WaitForNginxServer(host,
|
||||
func(server string) bool {
|
||||
return strings.Contains(server, "server_name foo")
|
||||
})
|
||||
|
||||
canaryIngName := fmt.Sprintf("%v-canary", host)
|
||||
canaryAnnotations := map[string]string{
|
||||
"nginx.ingress.kubernetes.io/canary": "true",
|
||||
"nginx.ingress.kubernetes.io/canary-weight": "100",
|
||||
"nginx.ingress.kubernetes.io/canary-weight-total": "200",
|
||||
}
|
||||
|
||||
canaryIng := framework.NewSingleIngress(canaryIngName, "/", host,
|
||||
f.Namespace, canaryService, 80, canaryAnnotations)
|
||||
f.EnsureIngress(canaryIng)
|
||||
|
||||
TestMainlineCanaryDistribution(f, host)
|
||||
})
|
||||
})
|
||||
|
||||
ginkgo.Context("Single canary Ingress", func() {
|
||||
|
|
Loading…
Reference in a new issue