Skip to content

Commit e4a66fd

Browse files
authored
Fix canary-weight-total annotation ignored in rule backends (#9729)
* Missed canary weight total - added canary weight total for spec rules * - added e2e test
1 parent a84cfe5 commit e4a66fd

File tree

2 files changed

+42
-15
lines changed

2 files changed

+42
-15
lines changed

internal/ingress/controller/controller.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/apimachinery/pkg/util/wait"
3434
clientset "k8s.io/client-go/kubernetes"
3535
"k8s.io/ingress-nginx/internal/ingress/annotations"
36+
"k8s.io/ingress-nginx/internal/ingress/annotations/canary"
3637
"k8s.io/ingress-nginx/internal/ingress/annotations/log"
3738
"k8s.io/ingress-nginx/internal/ingress/annotations/parser"
3839
"k8s.io/ingress-nginx/internal/ingress/annotations/proxy"
@@ -968,14 +969,7 @@ func (n *NGINXController) createUpstreams(data []*ingress.Ingress, du *ingress.B
968969
// configure traffic shaping for canary
969970
if anns.Canary.Enabled {
970971
upstreams[defBackend].NoServer = true
971-
upstreams[defBackend].TrafficShapingPolicy = ingress.TrafficShapingPolicy{
972-
Weight: anns.Canary.Weight,
973-
WeightTotal: anns.Canary.WeightTotal,
974-
Header: anns.Canary.Header,
975-
HeaderValue: anns.Canary.HeaderValue,
976-
HeaderPattern: anns.Canary.HeaderPattern,
977-
Cookie: anns.Canary.Cookie,
978-
}
972+
upstreams[defBackend].TrafficShapingPolicy = newTrafficShapingPolicy(anns.Canary)
979973
}
980974

981975
if len(upstreams[defBackend].Endpoints) == 0 {
@@ -1040,13 +1034,7 @@ func (n *NGINXController) createUpstreams(data []*ingress.Ingress, du *ingress.B
10401034
// configure traffic shaping for canary
10411035
if anns.Canary.Enabled {
10421036
upstreams[name].NoServer = true
1043-
upstreams[name].TrafficShapingPolicy = ingress.TrafficShapingPolicy{
1044-
Weight: anns.Canary.Weight,
1045-
Header: anns.Canary.Header,
1046-
HeaderValue: anns.Canary.HeaderValue,
1047-
HeaderPattern: anns.Canary.HeaderPattern,
1048-
Cookie: anns.Canary.Cookie,
1049-
}
1037+
upstreams[name].TrafficShapingPolicy = newTrafficShapingPolicy(anns.Canary)
10501038
}
10511039

10521040
if len(upstreams[name].Endpoints) == 0 {
@@ -1819,3 +1807,15 @@ func (n *NGINXController) getStreamSnippets(ingresses []*ingress.Ingress) []stri
18191807
}
18201808
return snippets
18211809
}
1810+
1811+
// newTrafficShapingPolicy creates new ingress.TrafficShapingPolicy instance using canary configuration
1812+
func newTrafficShapingPolicy(cfg canary.Config) ingress.TrafficShapingPolicy {
1813+
return ingress.TrafficShapingPolicy{
1814+
Weight: cfg.Weight,
1815+
WeightTotal: cfg.WeightTotal,
1816+
Header: cfg.Header,
1817+
HeaderValue: cfg.HeaderValue,
1818+
HeaderPattern: cfg.HeaderPattern,
1819+
Cookie: cfg.Cookie,
1820+
}
1821+
}

test/e2e/annotations/canary.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,33 @@ var _ = framework.DescribeAnnotation("canary-*", func() {
830830

831831
TestMainlineCanaryDistribution(f, host)
832832
})
833+
834+
ginkgo.It("should route requests split between mainline and canary if canary weight is 100 and weight total is 200", func() {
835+
host := "foo"
836+
annotations := map[string]string{}
837+
838+
ing := framework.NewSingleIngress(host, "/", host,
839+
f.Namespace, framework.EchoService, 80, annotations)
840+
f.EnsureIngress(ing)
841+
842+
f.WaitForNginxServer(host,
843+
func(server string) bool {
844+
return strings.Contains(server, "server_name foo")
845+
})
846+
847+
canaryIngName := fmt.Sprintf("%v-canary", host)
848+
canaryAnnotations := map[string]string{
849+
"nginx.ingress.kubernetes.io/canary": "true",
850+
"nginx.ingress.kubernetes.io/canary-weight": "100",
851+
"nginx.ingress.kubernetes.io/canary-weight-total": "200",
852+
}
853+
854+
canaryIng := framework.NewSingleIngress(canaryIngName, "/", host,
855+
f.Namespace, canaryService, 80, canaryAnnotations)
856+
f.EnsureIngress(canaryIng)
857+
858+
TestMainlineCanaryDistribution(f, host)
859+
})
833860
})
834861

835862
ginkgo.Context("Single canary Ingress", func() {

0 commit comments

Comments
 (0)