1
1
/*
2
- Copyright 2024 The Kubernetes Authors.
2
+ Copyright 2025 The Kubernetes Authors.
3
3
4
4
Licensed under the Apache License, Version 2.0 (the "License");
5
5
you may not use this file except in compliance with the License.
@@ -17,16 +17,8 @@ limitations under the License.
17
17
package tests
18
18
19
19
import (
20
- "cmp"
21
- "errors"
22
- "fmt"
23
- "math"
24
- "slices"
25
- "strings"
26
- "sync"
27
20
"testing"
28
21
29
- "golang.org/x/sync/errgroup"
30
22
"google.golang.org/grpc/codes"
31
23
"k8s.io/apimachinery/pkg/types"
32
24
@@ -65,11 +57,19 @@ var GRPCRouteWeight = suite.ConformanceTest{
65
57
Namespace : "gateway-conformance-infra" ,
66
58
}
67
59
68
- // Assert request succeeds before doing our distribution check
60
+ // Assert request succeeds before doing our distribution check
69
61
grpc .MakeRequestAndExpectEventuallyConsistentResponse (t , suite .GRPCClient , suite .TimeoutConfig , gwAddr , expected )
70
62
63
+ expectedWeights := map [string ]float64 {
64
+ "grpc-infra-backend-v1" : 0.7 ,
65
+ "grpc-infra-backend-v2" : 0.3 ,
66
+ "grpc-infra-backend-v3" : 0.0 ,
67
+ }
68
+
69
+ sender := newGRPCRequestSender (t , suite , gwAddr , expected )
70
+
71
71
for i := 0 ; i < 10 ; i ++ {
72
- if err := testGRPCDistribution ( t , suite , gwAddr , expected ); err != nil {
72
+ if err := testWeightedDistribution ( sender , expectedWeights ); err != nil {
73
73
t .Logf ("Traffic distribution test failed (%d/10): %s" , i + 1 , err )
74
74
} else {
75
75
return
@@ -79,80 +79,3 @@ var GRPCRouteWeight = suite.ConformanceTest{
79
79
})
80
80
},
81
81
}
82
-
83
- func testGRPCDistribution (t * testing.T , suite * suite.ConformanceTestSuite , gwAddr string , expected grpc.ExpectedResponse ) error {
84
- const (
85
- concurrentRequests = 10
86
- tolerancePercentage = 0.05
87
- totalRequests = 500.0
88
- )
89
- var (
90
- g errgroup.Group
91
- seenMutex sync.Mutex
92
- seen = make (map [string ]float64 , 3 /* number of backends */ )
93
- expectedWeights = map [string ]float64 {
94
- "grpc-infra-backend-v1" : 0.7 ,
95
- "grpc-infra-backend-v2" : 0.3 ,
96
- "grpc-infra-backend-v3" : 0.0 ,
97
- }
98
- grpcClient = & grpc.DefaultClient {}
99
- )
100
- g .SetLimit (concurrentRequests )
101
- for i := 0.0 ; i < totalRequests ; i ++ {
102
- g .Go (func () error {
103
- resp , err := grpcClient .SendRPC (t , gwAddr , expected , suite .TimeoutConfig .MaxTimeToConsistency )
104
- if err != nil {
105
- return fmt .Errorf ("failed to send gRPC request: %w" , err )
106
- }
107
- if resp .Code != codes .OK {
108
- return fmt .Errorf ("expected OK response, got %v" , resp .Code )
109
- }
110
-
111
- seenMutex .Lock ()
112
- defer seenMutex .Unlock ()
113
-
114
- podName := resp .Response .GetAssertions ().GetContext ().GetPod ()
115
- for expectedBackend := range expectedWeights {
116
- if strings .HasPrefix (podName , expectedBackend ) {
117
- seen [expectedBackend ]++
118
- return nil
119
- }
120
- }
121
-
122
- return fmt .Errorf ("request was handled by an unexpected pod %q" , podName )
123
- })
124
- }
125
-
126
- if err := g .Wait (); err != nil {
127
- return fmt .Errorf ("error while sending requests: %w" , err )
128
- }
129
-
130
- var errs []error
131
- if len (seen ) != 2 {
132
- errs = append (errs , fmt .Errorf ("expected only two backends to receive traffic" ))
133
- }
134
-
135
- for wantBackend , wantPercent := range expectedWeights {
136
- gotCount , ok := seen [wantBackend ]
137
-
138
- if ! ok && wantPercent != 0.0 {
139
- errs = append (errs , fmt .Errorf ("expect traffic to hit backend %q - but none was received" , wantBackend ))
140
- continue
141
- }
142
-
143
- gotPercent := gotCount / totalRequests
144
-
145
- if math .Abs (gotPercent - wantPercent ) > tolerancePercentage {
146
- errs = append (errs , fmt .Errorf ("backend %q weighted traffic of %v not within tolerance %v (+/-%f)" ,
147
- wantBackend ,
148
- gotPercent ,
149
- wantPercent ,
150
- tolerancePercentage ,
151
- ))
152
- }
153
- }
154
- slices .SortFunc (errs , func (a , b error ) int {
155
- return cmp .Compare (a .Error (), b .Error ())
156
- })
157
- return errors .Join (errs ... )
158
- }
0 commit comments