Add comprehensive integration tests for DNS query statistics covering basic counters, query type classification, cache performance, error tracking, and output format validation.
Tests use OVN's existing DNS test infrastructure and verify statistics are correctly incremented during packet processing. Signed-off-by: Ketan Supanekar <[email protected]> --- tests/automake.mk | 40 +-- tests/ovn-dns-stats.at | 551 +++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 3 +- 3 files changed, 561 insertions(+), 33 deletions(-) create mode 100644 tests/ovn-dns-stats.at diff --git a/tests/automake.mk b/tests/automake.mk index c8047371b..16f7019b0 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -29,6 +29,7 @@ TESTSUITE_AT = \ tests/checkpatch.at \ tests/network-functions.at \ tests/ovn.at \ + tests/ovn-dns-stats.at \ tests/ovn-northd.at \ tests/ovn-nbctl.at \ tests/ovn-sbctl.at \ @@ -46,9 +47,7 @@ TESTSUITE_AT = \ tests/ovn-lflow-conj-ids.at \ tests/ovn-ipsec.at \ tests/ovn-vif-plug.at \ - tests/ovn-util.at \ - tests/ovn-br-controller.at \ - tests/ovn-inc-proc-graph-dump.at + tests/ovn-util.at SYSTEM_DPDK_TESTSUITE_AT = \ tests/system-dpdk-testsuite.at \ @@ -65,15 +64,13 @@ SYSTEM_USERSPACE_TESTSUITE_AT = \ SYSTEM_TESTSUITE_AT = \ tests/system-common-macros.at \ - tests/system-ovn.at \ - tests/system-ovn-netlink.at + tests/system-ovn.at PERF_TESTSUITE_AT = \ tests/perf-testsuite.at \ tests/perf-northd.at MULTINODE_TESTSUITE_AT = \ - tests/multinode-bgp-macros.at \ tests/multinode-testsuite.at \ tests/multinode-macros.at \ tests/multinode.at @@ -93,10 +90,9 @@ DISTCLEANFILES += tests/atconfig tests/atlocal MULTINODE_TESTSUITE = $(srcdir)/tests/multinode-testsuite MULTINODE_TESTSUITE_DIR = $(abs_top_builddir)/tests/multinode-testsuite.dir MULTINODE_TESTSUITE_RESULTS = $(MULTINODE_TESTSUITE_DIR)/results -AUTOTEST_PATH = $(ovs_builddir)/utilities:$(ovs_builddir)/vswitchd:$(ovs_builddir)/ovsdb:$(ovs_builddir)/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller:ic:br-controller +AUTOTEST_PATH = $(ovs_builddir)/utilities:$(ovs_builddir)/vswitchd:$(ovs_builddir)/ovsdb:$(ovs_builddir)/vtep:tests:$(PTHREAD_WIN32_DIR_DLL):$(SSL_DIR):controller-vtep:northd:utilities:controller:ic export ovs_srcdir -export ovs_builddir check-local: set $(SHELL) '$(TESTSUITE)' -C tests AUTOTEST_PATH=$(AUTOTEST_PATH); \ @@ -288,30 +284,13 @@ tests_ovstest_SOURCES = \ tests/test-utils.c \ tests/test-utils.h \ tests/test-ovn.c \ - tests/test-sparse-array.c \ - tests/test-vector.c \ controller/test-lflow-cache.c \ + controller/test-lflow-conj-ids.c \ + controller/test-ofctrl-seqno.c \ controller/test-vif-plug.c \ - lib/test-lflow-conj-ids.c \ lib/test-ovn-features.c \ - lib/test-ofctrl-seqno.c \ northd/test-ipam.c -if HAVE_NETLINK -tests_ovstest_SOURCES += \ - controller/host-if-monitor.c \ - controller/host-if-monitor.h \ - controller/neighbor-exchange-netlink.c \ - controller/neighbor-exchange-netlink.h \ - controller/neighbor-table-notify.c \ - controller/neighbor-table-notify.h \ - controller/neighbor.c \ - controller/neighbor.h \ - controller/route-exchange-netlink.c \ - controller/route-exchange-netlink.h \ - tests/test-ovn-netlink.c -endif - tests_ovstest_LDADD = $(OVS_LIBDIR)/daemon.lo \ $(OVS_LIBDIR)/libopenvswitch.la lib/libovn.la \ controller/binding.$(OBJEXT) \ @@ -320,11 +299,12 @@ tests_ovstest_LDADD = $(OVS_LIBDIR)/daemon.lo \ controller/ha-chassis.$(OBJEXT) \ controller/if-status.$(OBJEXT) \ controller/lflow-cache.$(OBJEXT) \ + controller/lflow-conj-ids.$(OBJEXT) \ controller/local_data.$(OBJEXT) \ controller/lport.$(OBJEXT) \ + controller/ofctrl-seqno.$(OBJEXT) \ controller/ovsport.$(OBJEXT) \ controller/patch.$(OBJEXT) \ - controller/route.$(OBJEXT) \ controller/vif-plug.$(OBJEXT) \ northd/ipam.$(OBJEXT) @@ -334,9 +314,7 @@ CHECK_PYFILES = \ tests/uuidfilt.py \ tests/test-tcp-rst.py \ tests/check_acl_log.py \ - tests/scapy-server.py \ - tests/client.py \ - tests/server.py + tests/scapy-server.py EXTRA_DIST += $(CHECK_PYFILES) PYCOV_CLEAN_FILES += $(CHECK_PYFILES:.py=.py,cover) .coverage diff --git a/tests/ovn-dns-stats.at b/tests/ovn-dns-stats.at new file mode 100644 index 000000000..cd9e99c41 --- /dev/null +++ b/tests/ovn-dns-stats.at @@ -0,0 +1,551 @@ +AT_BANNER([OVN DNS Statistics]) + +# DNS Statistics - Basic functionality +OVN_FOR_EACH_NORTHD([ +AT_SETUP([dns statistics - basic counters]) +ovn_start + +# Define helper functions +set_dns_params() { + local hname=$1 + local ttl=00000e10 + an_count=0001 + type=0001 + case $hname in + vm1) + query_name=03766d31036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}00040a000004 + ;; + vm2) + query_name=03766d32036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}00040a000006 + expected_dns_answer=${expected_dns_answer}${query_name}00010001${ttl}000414000004 + an_count=0002 + ;; + vm3) + query_name=03766d33036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}000428000004 + ;; + vm1_ipv6_only) + query_name=03766d31036f766e036f726700 + type=001c + expected_dns_answer=${query_name}${type}0001${ttl}0010aef00000000000000000000000000004 + ;; + vm1_ipv4_v6) + query_name=03766d31036f766e036f726700 + type=00ff + an_count=0002 + expected_dns_answer=${query_name}00010001${ttl}00040a000004 + expected_dns_answer=${expected_dns_answer}${query_name}001c0001${ttl}0010 + expected_dns_answer=${expected_dns_answer}aef00000000000000000000000000004 + ;; + vm1_invalid_type) + query_name=03766d31036f766e036f726700 + type=0002 + ;; + esac + local dns_req_header=010201200001000000000000 + local dns_resp_header=010281200001${an_count}00000000 + dns_req_data=${dns_req_header}${query_name}${type}0001 + dns_resp_data=${dns_resp_header}${query_name}${type}0001${expected_dns_answer} +} + +test_dns() { + local inport=$1 src_mac=$2 dst_mac=$3 src_ip=$4 dst_ip=$5 dns_reply=$6 + local dns_query_data=$7 + shift; shift; shift; shift; shift; shift; shift; + ip_len=`expr 28 + ${#dns_query_data} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local request=${dst_mac}${src_mac}0800450000${ip_len}0000000080110000 + request=${request}${src_ip}${dst_ip}9234003500${udp_len}0000 + request=${request}${dns_query_data} + + if test $dns_reply != 0; then + local dns_reply=$1 + ip_len=`expr 28 + ${#dns_reply} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local reply=${src_mac}${dst_mac}0800450000${ip_len}0000000080110000 + reply=${reply}${dst_ip}${src_ip}0035923400${udp_len}0000${dns_reply} + echo $reply >> $inport.expected + else + for outport; do + echo $request >> $outport.expected + done + fi + as hv1 ovs-appctl netdev-dummy/receive hv1-vif$inport $request +} + +check ovn-nbctl ls-add ls1 + +check ovn-nbctl lsp-add ls1 ls1-lp1 \ +-- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +check ovn-nbctl lsp-set-port-security ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +DNS1=`ovn-nbctl create DNS records={}` + +check ovn-nbctl set DNS $DNS1 records:vm1.ovn.org="10.0.0.4" +check ovn-nbctl set DNS $DNS1 records:vm2.ovn.org="10.0.0.6" + +check ovn-nbctl set Logical_switch ls1 dns_records="$DNS1" + +net_add n1 +sim_add hv1 + +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=ls1-lp1 \ + options:tx_pcap=hv1/vif1-tx.pcap \ + options:rxq_pcap=hv1/vif1-rx.pcap \ + ofport-request=1 + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +# Check initial statistics (should be all zeros) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [0 +]) + +# Start monitoring OpenFlow +AT_CAPTURE_FILE([ofctl_monitor0.log]) +as hv1 ovs-ofctl -t 300 monitor br-int resume --detach --no-chdir \ +--pidfile=ovs-ofctl0.pid 2> ofctl_monitor0.log + +# Send DNS query using existing test helper +set_dns_params vm1 +src_ip=`ip_to_hex 10 0 0 4` +dst_ip=`ip_to_hex 10 0 0 1` +dns_reply=1 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data + +# Wait for NXT_RESUME +OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Check statistics after one query +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "A (IPv4)" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Cache hits" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Responses sent" | awk '{print $NF}'], [0], [1 +]) + +# Send another query +set_dns_params vm2 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data + +OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Check statistics after two queries +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [2 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "A (IPv4)" | awk '{print $NF}'], [0], [2 +]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +]) + +# DNS Statistics - Query types +OVN_FOR_EACH_NORTHD([ +AT_SETUP([dns statistics - query type classification]) +ovn_start + +# Define helper functions +set_dns_params() { + local hname=$1 + local ttl=00000e10 + an_count=0001 + type=0001 + case $hname in + vm1) + query_name=03766d31036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}00040a000004 + ;; + vm1_ipv6_only) + query_name=03766d31036f766e036f726700 + type=001c + expected_dns_answer=${query_name}${type}0001${ttl}0010aef00000000000000000000000000004 + ;; + vm1_ipv4_v6) + query_name=03766d31036f766e036f726700 + type=00ff + an_count=0002 + expected_dns_answer=${query_name}00010001${ttl}00040a000004 + expected_dns_answer=${expected_dns_answer}${query_name}001c0001${ttl}0010 + expected_dns_answer=${expected_dns_answer}aef00000000000000000000000000004 + ;; + esac + local dns_req_header=010201200001000000000000 + local dns_resp_header=010281200001${an_count}00000000 + dns_req_data=${dns_req_header}${query_name}${type}0001 + dns_resp_data=${dns_resp_header}${query_name}${type}0001${expected_dns_answer} +} + +test_dns() { + local inport=$1 src_mac=$2 dst_mac=$3 src_ip=$4 dst_ip=$5 dns_reply=$6 + local dns_query_data=$7 + shift; shift; shift; shift; shift; shift; shift; + ip_len=`expr 28 + ${#dns_query_data} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local request=${dst_mac}${src_mac}0800450000${ip_len}0000000080110000 + request=${request}${src_ip}${dst_ip}9234003500${udp_len}0000 + request=${request}${dns_query_data} + + if test $dns_reply != 0; then + local dns_reply=$1 + ip_len=`expr 28 + ${#dns_reply} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local reply=${src_mac}${dst_mac}0800450000${ip_len}0000000080110000 + reply=${reply}${dst_ip}${src_ip}0035923400${udp_len}0000${dns_reply} + echo $reply >> $inport.expected + else + for outport; do + echo $request >> $outport.expected + done + fi + as hv1 ovs-appctl netdev-dummy/receive hv1-vif$inport $request +} + +check ovn-nbctl ls-add ls1 + +check ovn-nbctl lsp-add ls1 ls1-lp1 \ +-- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.0.0.4 aef0::4" + +check ovn-nbctl lsp-set-port-security ls1-lp1 "f0:00:00:00:00:01 10.0.0.4 aef0::4" + +DNS1=`ovn-nbctl create DNS records={}` +check ovn-nbctl set DNS $DNS1 records:vm1.ovn.org="10.0.0.4 aef0::4" + +check ovn-nbctl set Logical_switch ls1 dns_records="$DNS1" + +net_add n1 +sim_add hv1 + +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=ls1-lp1 \ + options:tx_pcap=hv1/vif1-tx.pcap \ + options:rxq_pcap=hv1/vif1-rx.pcap \ + ofport-request=1 + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +AT_CAPTURE_FILE([ofctl_monitor0.log]) +as hv1 ovs-ofctl -t 300 monitor br-int resume --detach --no-chdir \ +--pidfile=ovs-ofctl0.pid 2> ofctl_monitor0.log + +src_ip=`ip_to_hex 10 0 0 4` +dst_ip=`ip_to_hex 10 0 0 1` +dns_reply=1 + +# Send A record query +set_dns_params vm1 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data +OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Send AAAA record query +set_dns_params vm1_ipv6_only +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data +OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Send ANY record query +set_dns_params vm1_ipv4_v6 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data +OVS_WAIT_UNTIL([test 3 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Check query type statistics +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [3 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "A (IPv4)" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "AAAA (IPv6)" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "ANY" | awk '{print $NF}'], [0], [1 +]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +]) + +# DNS Statistics - Cache misses +OVN_FOR_EACH_NORTHD([ +AT_SETUP([dns statistics - cache hits and misses]) +ovn_start + +# Define helper functions +set_dns_params() { + local hname=$1 + local ttl=00000e10 + an_count=0001 + type=0001 + case $hname in + vm1) + query_name=03766d31036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}00040a000004 + ;; + vm3) + query_name=03766d33036f766e036f726700 + expected_dns_answer=${query_name}00010001${ttl}000428000004 + ;; + esac + local dns_req_header=010201200001000000000000 + local dns_resp_header=010281200001${an_count}00000000 + dns_req_data=${dns_req_header}${query_name}${type}0001 + dns_resp_data=${dns_resp_header}${query_name}${type}0001${expected_dns_answer} +} + +test_dns() { + local inport=$1 src_mac=$2 dst_mac=$3 src_ip=$4 dst_ip=$5 dns_reply=$6 + local dns_query_data=$7 + shift; shift; shift; shift; shift; shift; shift; + ip_len=`expr 28 + ${#dns_query_data} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local request=${dst_mac}${src_mac}0800450000${ip_len}0000000080110000 + request=${request}${src_ip}${dst_ip}9234003500${udp_len}0000 + request=${request}${dns_query_data} + + if test $dns_reply != 0; then + local dns_reply=$1 + ip_len=`expr 28 + ${#dns_reply} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local reply=${src_mac}${dst_mac}0800450000${ip_len}0000000080110000 + reply=${reply}${dst_ip}${src_ip}0035923400${udp_len}0000${dns_reply} + echo $reply >> $inport.expected + else + for outport; do + echo $request >> $outport.expected + done + fi + as hv1 ovs-appctl netdev-dummy/receive hv1-vif$inport $request +} + +check ovn-nbctl ls-add ls1 + +check ovn-nbctl lsp-add ls1 ls1-lp1 \ +-- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +check ovn-nbctl lsp-set-port-security ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +DNS1=`ovn-nbctl create DNS records={}` +check ovn-nbctl set DNS $DNS1 records:vm1.ovn.org="10.0.0.4" + +check ovn-nbctl set Logical_switch ls1 dns_records="$DNS1" + +net_add n1 +sim_add hv1 + +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=ls1-lp1 \ + options:tx_pcap=hv1/vif1-tx.pcap \ + options:rxq_pcap=hv1/vif1-rx.pcap \ + ofport-request=1 + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +AT_CAPTURE_FILE([ofctl_monitor0.log]) +as hv1 ovs-ofctl -t 300 monitor br-int resume --detach --no-chdir \ +--pidfile=ovs-ofctl0.pid 2> ofctl_monitor0.log + +src_ip=`ip_to_hex 10 0 0 4` +dst_ip=`ip_to_hex 10 0 0 1` +dns_reply=1 + +# Query for existing record (cache hit) +set_dns_params vm1 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data $dns_resp_data +OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Query for non-existing record (cache miss) +set_dns_params vm3 +dns_reply=0 +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip $dns_reply $dns_req_data +OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Check cache statistics +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [2 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Cache hits" | awk '{print $NF}'], [0], [1 +]) +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Cache misses" | awk '{print $NF}'], [0], [1 +]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +]) + +# DNS Statistics - Error counters +OVN_FOR_EACH_NORTHD([ +AT_SETUP([dns statistics - error counters]) +ovn_start + +# Define helper functions +set_dns_params() { + local hname=$1 + local ttl=00000e10 + an_count=0001 + type=0001 + case $hname in + vm1_invalid_type) + query_name=03766d31036f766e036f726700 + type=0002 + ;; + esac + local dns_req_header=010201200001000000000000 + local dns_resp_header=010281200001${an_count}00000000 + dns_req_data=${dns_req_header}${query_name}${type}0001 + dns_resp_data=${dns_resp_header}${query_name}${type}0001${expected_dns_answer} +} + +test_dns() { + local inport=$1 src_mac=$2 dst_mac=$3 src_ip=$4 dst_ip=$5 dns_reply=$6 + local dns_query_data=$7 + shift; shift; shift; shift; shift; shift; shift; + ip_len=`expr 28 + ${#dns_query_data} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local request=${dst_mac}${src_mac}0800450000${ip_len}0000000080110000 + request=${request}${src_ip}${dst_ip}9234003500${udp_len}0000 + request=${request}${dns_query_data} + + if test $dns_reply != 0; then + local dns_reply=$1 + ip_len=`expr 28 + ${#dns_reply} / 2` + udp_len=`expr $ip_len - 20` + ip_len=$(printf "%x" $ip_len) + udp_len=$(printf "%x" $udp_len) + local reply=${src_mac}${dst_mac}0800450000${ip_len}0000000080110000 + reply=${reply}${dst_ip}${src_ip}0035923400${udp_len}0000${dns_reply} + echo $reply >> $inport.expected + else + for outport; do + echo $request >> $outport.expected + done + fi + as hv1 ovs-appctl netdev-dummy/receive hv1-vif$inport $request +} + +check ovn-nbctl ls-add ls1 + +check ovn-nbctl lsp-add ls1 ls1-lp1 \ +-- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +check ovn-nbctl lsp-set-port-security ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +DNS1=`ovn-nbctl create DNS records={}` +check ovn-nbctl set DNS $DNS1 records:vm1.ovn.org="10.0.0.4" + +check ovn-nbctl set Logical_switch ls1 dns_records="$DNS1" + +net_add n1 +sim_add hv1 + +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=ls1-lp1 \ + options:tx_pcap=hv1/vif1-tx.pcap \ + options:rxq_pcap=hv1/vif1-rx.pcap \ + ofport-request=1 + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +AT_CAPTURE_FILE([ofctl_monitor0.log]) +as hv1 ovs-ofctl -t 300 monitor br-int resume --detach --no-chdir \ +--pidfile=ovs-ofctl0.pid 2> ofctl_monitor0.log + +src_ip=`ip_to_hex 10 0 0 4` +dst_ip=`ip_to_hex 10 0 0 1` +dns_reply=1 + +# Test with invalid query type (should increment unsupported counter) +set_dns_params vm1_invalid_type +test_dns 1 f00000000001 f000000000f0 $src_ip $dst_ip 0 $dns_req_data +OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c NXT_RESUME`]) + +# Check that error counter incremented +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats | grep "Total queries received" | awk '{print $NF}'], [0], [1 +]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +]) + +# DNS Statistics - Output format verification +OVN_FOR_EACH_NORTHD([ +AT_SETUP([dns statistics - output format]) +ovn_start + +check ovn-nbctl ls-add ls1 +check ovn-nbctl lsp-add ls1 ls1-lp1 \ +-- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.0.0.4" + +net_add n1 +sim_add hv1 + +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=ls1-lp1 \ + ofport-request=1 + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +# Verify output format and all sections are present +AT_CHECK([as hv1 ovs-appctl -t ovn-controller dns/show-stats], [0], [stdout]) +AT_CHECK([grep "DNS Query Statistics" stdout], [0], [ignore]) +AT_CHECK([grep "Total queries received" stdout], [0], [ignore]) +AT_CHECK([grep "Query Types:" stdout], [0], [ignore]) +AT_CHECK([grep "A (IPv4)" stdout], [0], [ignore]) +AT_CHECK([grep "AAAA (IPv6)" stdout], [0], [ignore]) +AT_CHECK([grep "PTR (Reverse DNS)" stdout], [0], [ignore]) +AT_CHECK([grep "ANY" stdout], [0], [ignore]) +AT_CHECK([grep "Other/Unsupported" stdout], [0], [ignore]) +AT_CHECK([grep "Cache Performance:" stdout], [0], [ignore]) +AT_CHECK([grep "Cache hits" stdout], [0], [ignore]) +AT_CHECK([grep "Cache misses" stdout], [0], [ignore]) +AT_CHECK([grep "Processing Errors (packets reinjected):" stdout], [0], [ignore]) +AT_CHECK([grep "Truncated/malformed packets" stdout], [0], [ignore]) +AT_CHECK([grep "Skipped (not DNS request)" stdout], [0], [ignore]) +AT_CHECK([grep "No query section" stdout], [0], [ignore]) +AT_CHECK([grep "Query parse failure" stdout], [0], [ignore]) +AT_CHECK([grep "OVN-owned unsupported type" stdout], [0], [ignore]) +AT_CHECK([grep "Responses:" stdout], [0], [ignore]) +AT_CHECK([grep "Responses sent" stdout], [0], [ignore]) +AT_CHECK([grep "Total processed" stdout], [0], [ignore]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +]) diff --git a/tests/testsuite.at b/tests/testsuite.at index 6216ac761..914b4a500 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -24,6 +24,7 @@ m4_include([tests/network-functions.at]) m4_include([tests/ovn-ipam.at]) m4_include([tests/ovn.at]) +m4_include([tests/ovn-dns-stats.at]) m4_include([tests/ovn-performance.at]) m4_include([tests/ovn-northd.at]) m4_include([tests/ovn-nbctl.at]) @@ -41,5 +42,3 @@ m4_include([tests/checkpatch.at]) m4_include([tests/ovn-ipsec.at]) m4_include([tests/ovn-vif-plug.at]) m4_include([tests/ovn-util.at]) -m4_include([tests/ovn-br-controller.at]) -m4_include([tests/ovn-inc-proc-graph-dump.at]) -- 2.50.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
