futriix/tests/unit/cluster/announce-client-ip.tcl
Ping Xie ad0ede302c
Exclude '.' and ':' from isValidAuxChar's banned charset (#963)
Fix a bug in isValidAuxChar where valid characters '.' and ':' were
incorrectly included in the banned charset. This issue affected the
validation of auxiliary fields in the nodes.conf file used by Valkey in
cluster mode, particularly when handling IPv4 and IPv6 addresses. The
code now correctly allows '.' and ':' as valid characters, ensuring
proper handling of these fields. Comments were added to clarify the use
of the banned charset.
 
Related to #736

---------

Signed-off-by: Ping Xie <pingxie@google.com>
2024-08-28 23:35:31 -07:00

164 lines
5.7 KiB
Tcl

# Small cluster. No need for failovers.
start_cluster 2 2 {tags {external:skip cluster} overrides {cluster-replica-no-failover yes}} {
test "Set cluster announced IPv4 to invalid IP" {
catch {R 0 config set cluster-announce-client-ipv4 banana} e
assert_match "*Invalid IPv4 address*" $e
}
test "Set cluster announced IPv4 and check that it propagates" {
for {set j 0} {$j < [llength $::servers]} {incr j} {
set res [R $j config set cluster-announce-client-ipv4 "111.222.111.$j"]
}
# CLUSTER SLOTS
wait_for_condition 50 100 {
[are_cluster_announced_ips_propagated {111.222.111.*}]
} else {
fail "cluster-announce-client-ipv4 were not propagated"
}
# CLUSTER SHARDS
for {set j 0} {$j < [llength $::servers]} {incr j} {
foreach shard [R $j CLUSTER SHARDS] {
foreach node [dict get $shard "nodes"] {
set ip [dict get $node "ip"]
set endpoint [dict get $node "endpoint"]
assert_match "111.222.111*" $ip
assert_match "111.222.111*" $endpoint
}
}
}
# CLUSTER NODES
for {set j 0} {$j < [llength $::servers]} {incr j} {
set lines [split [R $j CLUSTER NODES] "\r\n"]
foreach l $lines {
set l [string trim $l]
if {$l eq {}} continue
assert_equal 1 [regexp {^[0-9a-f]+ 111\.222\.111\.[0-9]} $l]
}
}
# Redirects
catch {R 0 set foo foo} e
assert_match "MOVED * 111.222.111*:*" $e
# Now that everything is propagated, assert everyone agrees
wait_for_cluster_propagation
}
test "Clear announced client IPv4 and check that it propagates" {
for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-client-ipv4 ""
}
wait_for_condition 50 100 {
[are_cluster_announced_ips_propagated "127.0.0.1"] eq 1
} else {
fail "Cleared cluster-announce-client-ipv4 were not propagated"
}
# Redirect use the IP address
catch {R 0 set foo foo} e
assert_match "MOVED * 127.0.0.1:*" $e
# Now that everything is propagated, assert everyone agrees
wait_for_cluster_propagation
}
}
start_cluster 2 2 {tags {external:skip cluster ipv6} overrides {cluster-replica-no-failover yes bind {127.0.0.1 ::1}}} {
# Connecting to localhost as "::1" makes the clients use IPv6.
set clients {}
for {set j 0} {$j < [llength $::servers]} {incr j} {
set level [expr -1 * $j]
lappend clients [valkey ::1 [srv $level port] 0 $::tls]
}
test "Set cluster announced IPv6 to invalid IP" {
catch {R 0 config set cluster-announce-client-ipv6 banana} e
assert_match "*Invalid IPv6 address*" $e
}
test "Set cluster announced IPv6 and check that it propagates" {
for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-client-ipv6 "cafe:1234::$j"
}
# CLUSTER SLOTS
wait_for_condition 50 100 {
[are_cluster_announced_ips_propagated "cafe:1234::*" $clients] eq 1
} else {
fail "cluster-announce-client-ipv6 were not propagated"
}
# CLUSTER SHARDS
for {set j 0} {$j < [llength $::servers]} {incr j} {
foreach shard [[lindex $clients $j] CLUSTER SHARDS] {
foreach node [dict get $shard "nodes"] {
set ip [dict get $node "ip"]
set endpoint [dict get $node "endpoint"]
assert_match "cafe:1234::*" $ip
assert_match "cafe:1234::*" $endpoint
}
}
}
# CLUSTER NODES
for {set j 0} {$j < [llength $::servers]} {incr j} {
set lines [split [[lindex $clients $j] CLUSTER NODES] "\r\n"]
foreach l $lines {
set l [string trim $l]
if {$l eq {}} continue
assert_equal 1 [regexp {^[0-9a-f]+ cafe:1234::[0-9]} $l]
}
}
# Redirects
catch {[lindex $clients 0] set foo foo} e
assert_match "MOVED * cafe:1234::*:*" $e
# Now that everything is propagated, assert everyone agrees
wait_for_cluster_propagation
}
test "Clear announced client IPv6 and check that it propagates" {
for {set j 0} {$j < [llength $::servers]} {incr j} {
R $j config set cluster-announce-client-ipv6 ""
}
wait_for_condition 50 100 {
[are_cluster_announced_ips_propagated "127.0.0.1" $clients] eq 1
} else {
fail "Cleared cluster-announce-client-ipv6 were not propagated"
}
# Redirects
catch {[lindex $clients 0] set foo foo} e
assert_match "MOVED * 127.0.0.1:*" $e
# Now that everything is propagated, assert everyone agrees
wait_for_cluster_propagation
}
# Close clients
for {set j 0} {$j < [llength $::servers]} {incr j} {
[lindex $clients $j] close
}
}
start_cluster 1 0 {tags {external:skip cluster} overrides {cluster-replica-no-failover yes bind {127.0.0.1 ::1}}} {
test "Load cluster announced IPv4 config on server start" {
R 0 config set cluster-announce-client-ipv4 "1.1.1.1"
restart_server 0 true false
}
}
start_cluster 1 0 {tags {external:skip cluster ipv6} overrides {cluster-replica-no-failover yes bind {127.0.0.1 ::1}}} {
test "Load cluster announced IPv6 config on server start" {
R 0 config set cluster-announce-client-ipv6 "cafe:1234::0"
restart_server 0 true false
}
}