]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add a test case for checking zone transfers in statschannel
authorAram Sargsyan <aram@isc.org>
Tue, 30 May 2023 15:00:33 +0000 (15:00 +0000)
committerAram Sargsyan <aram@isc.org>
Fri, 22 Sep 2023 08:51:45 +0000 (08:51 +0000)
Use the named -T transferslowly test options to slow down a zone
transfer from the primary server, and test that it's correctly
exposed in the statistics channel of the secondary server, while
it's in-progress.

bin/tests/system/statschannel/clean.sh
bin/tests/system/statschannel/tests.sh

index b0ab571b24062d7f85c7a3fdbfe67d8cda0be385..d1c381e6299edfa99125157ab1cf4f3b56707ce4 100644 (file)
@@ -32,4 +32,5 @@ rm -f traffic traffic.out.* traffic.json.* traffic.xml.*
 rm -f xml.*mem json.*mem
 rm -f xml.*stats json.*stats
 rm -f zones zones.out.* zones.json.* zones.xml.* zones.expect.*
+rm -f xfrins xfrins.json.* xfrins.xml.*
 rm -rf ./__pycache__
index db8bcc263defee296256a31364e851bf6ba99a0e..c48d0ebffaeffb7b7539e5fdf941ab0cb9f4e5d3 100644 (file)
@@ -18,6 +18,7 @@ set -e
 
 DIGCMD="$DIG @10.53.0.2 -p ${PORT}"
 RNDCCMD="$RNDC -c ../_common/rndc.conf -p ${CONTROLPORT} -s"
+NS_PARAMS="-X named.lock -m record -c named.conf -d 99 -g -U 4 -T maxcachesize=2097152"
 
 if ! $FEATURETEST --have-json-c
 then
@@ -48,6 +49,32 @@ if [ ! "$PERL_JSON" ] && [ ! "$PERL_XML" ]; then
     exit 0
 fi
 
+retry_quiet_fast() {
+       __retries="${1}"
+       shift
+
+       while :; do
+               if "$@"; then
+                       return 0
+               fi
+               __retries=$((__retries-1))
+               if [ "${__retries}" -gt 0 ]; then
+                       # sleep for 0.1 seconds
+                       perl -e 'select(undef, undef, undef, .1)'
+               else
+                       return 1
+               fi
+       done
+}
+
+wait_for_log_fast() (
+       timeout="$1"
+       msg="$2"
+       file="$3"
+       retry_quiet_fast "$timeout" _search_log "$msg" "$file" && return 0
+       echo_i "exceeded time limit waiting for literal '$msg' in $file"
+        return 1
+)
 
 getzones() {
     sleep 1
@@ -63,6 +90,19 @@ getzones() {
     return $result
 }
 
+getxfrins() {
+    echo_i "... using $1"
+    case $1 in
+        xml) path='xml/v3/xfrins' ;;
+        json) path='json/v1/xfrins' ;;
+        *) return 1 ;;
+    esac
+    file=`$PERL fetch.pl -s 10.53.0.3 -p ${EXTRAPORT1} $path`
+    cp $file $file.$1.$3
+    result=$?
+    return $result
+}
+
 # TODO: Move loadkeys_on to conf.sh.common
 loadkeys_on() {
     nsidx=$1
@@ -655,5 +695,31 @@ if [ $ret != 0 ]; then echo_i "failed"; fi
 status=$((status + ret))
 n=$((n + 1))
 
+echo_i "Retransfering 'example' from ns1 to ns3 in slow mode ($n)"
+ret=0
+i=0
+# Restart ns1 with '-T transferslowly' to see the xfrins information in ns3's statschannel while it's ongoing
+stop_server ns1
+start_server --noclean --restart --port ${PORT} ns1 -- "-D statschannel-ns1 $NS_PARAMS -T transferslowly"
+# Request a retransfer of the "example" zone
+nextpart ns3/named.run > /dev/null
+$RNDCCMD 10.53.0.3 retransfer example | sed "s/^/ns3 /" | cat_i
+wait_for_log_fast 200 "zone example/IN: Transfer started" ns3/named.run || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=$((status + ret))
+n=$((n + 1))
+
+# We have now less than one second to catch the zone transfer in process
+echo_i "Checking zone transfer information in the statistics channel ($n)"
+ret=0
+i=0
+getxfrins xml example x$n || ret=1
+getxfrins json example j$n || ret=1
+grep -F '<state>Initial SOA</state>' xfrins.xml.x$n >/dev/null || ret=1
+grep -F '"state":"Initial SOA"' xfrins.json.j$n >/dev/null || ret=1
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=$((status + ret))
+n=$((n + 1))
+
 echo_i "exit status: $status"
 [ $status -eq 0 ] || exit 1