Skip to content

Commit 372a5b0

Browse files
authored
added entropy to HTTPRoute-weight (#3880)
Signed-off-by: carsontham <[email protected]>
1 parent b167eed commit 372a5b0

File tree

3 files changed

+59
-56
lines changed

3 files changed

+59
-56
lines changed

conformance/tests/httproute-weight.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ func testDistribution(t *testing.T, suite *suite.ConformanceTestSuite, gwAddr st
9191
g errgroup.Group
9292
seenMutex sync.Mutex
9393
seen = make(map[string]float64, 3 /* number of backends */)
94-
req = http.MakeRequest(t, &expected, gwAddr, "HTTP", "http")
9594
expectedWeights = map[string]float64{
9695
"infra-backend-v1": 0.7,
9796
"infra-backend-v2": 0.3,
@@ -101,6 +100,11 @@ func testDistribution(t *testing.T, suite *suite.ConformanceTestSuite, gwAddr st
101100
g.SetLimit(concurrentRequests)
102101
for i := 0.0; i < totalRequests; i++ {
103102
g.Go(func() error {
103+
uniqueExpected := expected
104+
if err := http.AddEntropy(&uniqueExpected); err != nil {
105+
return fmt.Errorf("error adding entropy: %w", err)
106+
}
107+
req := http.MakeRequest(t, &uniqueExpected, gwAddr, "HTTP", "http")
104108
cReq, cRes, err := roundTripper.CaptureRoundTrip(req)
105109
if err != nil {
106110
return fmt.Errorf("failed to roundtrip request: %w", err)

conformance/tests/mesh/httproute-weight.go

Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,13 @@ package meshtests
1818

1919
import (
2020
"cmp"
21-
"crypto/rand"
2221
"errors"
2322
"fmt"
2423
"math"
25-
"math/big"
2624
"slices"
2725
"strings"
2826
"sync"
2927
"testing"
30-
"time"
3128

3229
"golang.org/x/sync/errgroup"
3330

@@ -93,7 +90,7 @@ func testDistribution(t *testing.T, client echo.MeshPod, expected http.ExpectedR
9390
for i := 0.0; i < totalRequests; i++ {
9491
g.Go(func() error {
9592
uniqueExpected := expected
96-
if err := addEntropy(&uniqueExpected); err != nil {
93+
if err := http.AddEntropy(&uniqueExpected); err != nil {
9794
return fmt.Errorf("error adding entropy: %w", err)
9895
}
9996
_, cRes, err := client.CaptureRequestResponseAndCompare(t, uniqueExpected)
@@ -148,54 +145,3 @@ func testDistribution(t *testing.T, client echo.MeshPod, expected http.ExpectedR
148145
})
149146
return errors.Join(errs...)
150147
}
151-
152-
// addEntropy adds jitter to the request by adding either a delay up to 1 second, or a random header value, or both.
153-
func addEntropy(exp *http.ExpectedResponse) error {
154-
randomNumber := func(limit int64) (*int64, error) {
155-
number, err := rand.Int(rand.Reader, big.NewInt(limit))
156-
if err != nil {
157-
return nil, err
158-
}
159-
n := number.Int64()
160-
return &n, nil
161-
}
162-
163-
// adds a delay
164-
delay := func(limit int64) error {
165-
randomSleepDuration, err := randomNumber(limit)
166-
if err != nil {
167-
return err
168-
}
169-
time.Sleep(time.Duration(*randomSleepDuration) * time.Millisecond)
170-
return nil
171-
}
172-
// adds random header value
173-
randomHeader := func(limit int64) error {
174-
randomHeaderValue, err := randomNumber(limit)
175-
if err != nil {
176-
return err
177-
}
178-
exp.Request.Headers = make(map[string]string)
179-
exp.Request.Headers["X-Jitter"] = fmt.Sprintf("%d", *randomHeaderValue)
180-
return nil
181-
}
182-
183-
random, err := randomNumber(3)
184-
if err != nil {
185-
return err
186-
}
187-
188-
switch *random {
189-
case 0:
190-
return delay(1000)
191-
case 1:
192-
return randomHeader(10000)
193-
case 2:
194-
if err := delay(1000); err != nil {
195-
return err
196-
}
197-
return randomHeader(10000)
198-
default:
199-
return fmt.Errorf("invalid random value: %d", *random)
200-
}
201-
}

conformance/utils/http/http.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ limitations under the License.
1717
package http
1818

1919
import (
20+
"crypto/rand"
2021
"fmt"
22+
"math/big"
2123
"net"
2224
"net/url"
2325
"strings"
@@ -478,3 +480,54 @@ func setRedirectRequestDefaults(req *roundtripper.Request, cRes *roundtripper.Ca
478480
expected.RedirectRequest.Path = req.URL.Path
479481
}
480482
}
483+
484+
// addEntropy adds jitter to the request by adding either a delay up to 1 second, or a random header value, or both.
485+
func AddEntropy(exp *ExpectedResponse) error {
486+
randomNumber := func(limit int64) (*int64, error) {
487+
number, err := rand.Int(rand.Reader, big.NewInt(limit))
488+
if err != nil {
489+
return nil, err
490+
}
491+
n := number.Int64()
492+
return &n, nil
493+
}
494+
495+
// adds a delay
496+
delay := func(limit int64) error {
497+
randomSleepDuration, err := randomNumber(limit)
498+
if err != nil {
499+
return err
500+
}
501+
time.Sleep(time.Duration(*randomSleepDuration) * time.Millisecond)
502+
return nil
503+
}
504+
// adds random header value
505+
randomHeader := func(limit int64) error {
506+
randomHeaderValue, err := randomNumber(limit)
507+
if err != nil {
508+
return err
509+
}
510+
exp.Request.Headers = make(map[string]string)
511+
exp.Request.Headers["X-Jitter"] = fmt.Sprintf("%d", *randomHeaderValue)
512+
return nil
513+
}
514+
515+
random, err := randomNumber(3)
516+
if err != nil {
517+
return err
518+
}
519+
520+
switch *random {
521+
case 0:
522+
return delay(1000)
523+
case 1:
524+
return randomHeader(10000)
525+
case 2:
526+
if err := delay(1000); err != nil {
527+
return err
528+
}
529+
return randomHeader(10000)
530+
default:
531+
return fmt.Errorf("invalid random value: %d", *random)
532+
}
533+
}

0 commit comments

Comments
 (0)