REGTESTS: add a few load balancing tests

This adds "balance-rr" to test round robin, "balance-uri" to test the
default balance-uri method, and "balance-uri-path-only" which mixes H1
and H2 through "balance uri path-only" and verifies that they reach
the same server.

Note that for the latter, "proto h2" explicitly had to be placed on
the listening socket otherwise it would timeout. This may indicate an
issue in the H1->H2 upgrade depending how the H2 preface is sent maybe.
This commit is contained in:
Willy Tarreau 2020-09-23 09:02:13 +02:00
parent 57a374131c
commit 19490907b3
3 changed files with 244 additions and 0 deletions

View File

@ -0,0 +1,73 @@
vtest "Test for balance roundrobin"
feature ignore_unknown_macro
server s1 {
rxreq
txresp -hdr "Server: s1"
} -repeat 2 -start
server s2 {
rxreq
txresp -hdr "Server: s2"
} -repeat 2 -start
server s3 {
rxreq
txresp -hdr "Server: s3"
} -repeat 2 -start
server s4 {
rxreq
txresp -hdr "Server: s4"
} -repeat 2 -start
haproxy h1 -arg "-L A" -conf {
defaults
mode http
timeout server 1s
timeout connect 1s
timeout client 1s
listen px
bind "fd@${px}"
balance roundrobin
server srv1 ${s1_addr}:${s1_port}
server srv2 ${s2_addr}:${s2_port}
server srv3 ${s3_addr}:${s3_port}
server srv4 ${s4_addr}:${s4_port}
} -start
client c1 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s1
} -run
client c2 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s2
} -run
client c3 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s3
} -run
client c4 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s4
} -run
client c5 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s1
} -run

View File

@ -0,0 +1,97 @@
vtest "Test for balance URI"
feature ignore_unknown_macro
#REQUIRE_VERSION=2.3
server s1 {
rxreq
txresp -hdr "Server: s1" -body "s1"
} -repeat 5 -start
server s2 {
rxreq
txresp -hdr "Server: s2" -body "s2"
} -repeat 5 -start
server s3 {
rxreq
txresp -hdr "Server: s3" -body "s3"
} -repeat 5 -start
server s4 {
rxreq
txresp -hdr "Server: s4" -body "s4"
} -repeat 5 -start
haproxy h1 -arg "-L A" -conf {
defaults
mode http
timeout server 1s
timeout connect 1s
timeout client 1s
listen px
bind "fd@${px}"
bind "fd@${pxh2}" proto h2
balance uri path-only
server srv1 ${s1_addr}:${s1_port}
server srv2 ${s2_addr}:${s2_port}
server srv3 ${s3_addr}:${s3_port}
server srv4 ${s4_addr}:${s4_port}
} -start
client c1 -connect ${h1_px_sock} {
txreq -url "http://${h1_px_addr}/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s2
} -run
client c2 -connect ${h1_px_sock} {
txreq -url "/url1?ignore=this-arg"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s2
} -run
client c3 -connect ${h1_px_sock} {
txreq -url "http://${h1_px_addr}/url2"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s3
} -run
client c4 -connect ${h1_px_sock} {
txreq -url "/url3"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s4
} -run
client c5 -connect ${h1_px_sock} {
txreq -url "/url4"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s1
} -run
client c6h2 -connect ${h1_pxh2_sock} {
txpri
stream 0 {
txsettings
rxsettings
txsettings -ack
rxsettings
expect settings.ack == true
} -run
stream 1 {
txreq \
-req "GET" \
-scheme "https" \
-url "/url1"
rxhdrs
expect resp.status == 200
rxdata -all
expect resp.body == "s2"
} -run
} -run

View File

@ -0,0 +1,74 @@
vtest "Test for balance URI"
feature ignore_unknown_macro
#REQUIRE_VERSION=2.0
server s1 {
rxreq
txresp -hdr "Server: s1"
} -repeat 2 -start
server s2 {
rxreq
txresp -hdr "Server: s2"
} -repeat 2 -start
server s3 {
rxreq
txresp -hdr "Server: s3"
} -repeat 2 -start
server s4 {
rxreq
txresp -hdr "Server: s4"
} -repeat 2 -start
haproxy h1 -arg "-L A" -conf {
defaults
mode http
timeout server 1s
timeout connect 1s
timeout client 1s
listen px
bind "fd@${px}"
balance uri
server srv1 ${s1_addr}:${s1_port}
server srv2 ${s2_addr}:${s2_port}
server srv3 ${s3_addr}:${s3_port}
server srv4 ${s4_addr}:${s4_port}
} -start
client c1 -connect ${h1_px_sock} {
txreq -url "/url1"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s2
} -run
client c2 -connect ${h1_px_sock} {
txreq -url "/url1?ignore=this-arg"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s2
} -run
client c3 -connect ${h1_px_sock} {
txreq -url "/url2"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s3
} -run
client c4 -connect ${h1_px_sock} {
txreq -url "/url3"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s4
} -run
client c5 -connect ${h1_px_sock} {
txreq -url "/url4"
rxresp
expect resp.status == 200
expect resp.http.Server ~ s1
} -run