]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
selftest: Add test for smb_prometheus_endpoint utility
authorShachar Sharon <ssharon@redhat.com>
Wed, 5 Feb 2025 14:20:10 +0000 (16:20 +0200)
committerGünther Deschner <gd@samba.org>
Fri, 11 Apr 2025 18:46:41 +0000 (18:46 +0000)
Basic test for smb_prometheus_endpoint utility. Requires valid metrics
output using 'curl'. Start/stop the endpoint utility from within the
test script itself.

Signed-off-by: Shachar Sharon <ssharon@redhat.com>
Reviewed-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Guenther Deschner <gd@samba.org>
selftest/selftesthelpers.py
source3/script/tests/test_smb_prometheus_endpoint.sh [new file with mode: 0755]
source3/selftest/tests.py

index 908fe79cb195a100e50688d02e7666c260c5af7c..54f007addbe4ebcc0a46d3720aea0b8b4623f541 100644 (file)
@@ -237,3 +237,4 @@ smbcacls = binpath('smbcacls')
 smbcontrol = binpath('smbcontrol')
 smbstatus = binpath('smbstatus')
 timelimit = binpath('timelimit')
+smb_prometheus_endpoint = binpath('smb_prometheus_endpoint')
diff --git a/source3/script/tests/test_smb_prometheus_endpoint.sh b/source3/script/tests/test_smb_prometheus_endpoint.sh
new file mode 100755 (executable)
index 0000000..e7057f4
--- /dev/null
@@ -0,0 +1,189 @@
+#!/bin/sh
+
+# This runs smbstatus tests
+
+if [ $# -lt 10 ]; then
+       echo "Usage: $0 SERVER SERVER_IP USERNAME PASSWORD LOCK_DIR PREFIX SMBPROMETHEUS SMBCLIENT CONFIGURATION PROTOCOL"
+       exit 1
+fi
+
+SERVER="${1}"
+SERVER_IP="${2}"
+USERNAME="${3}"
+PASSWORD="${4}"
+LOCK_DIR="${5}"
+PREFIX="${6}"
+SMBPROMETHEUS="${7}"
+SMBCLIENT="${8}"
+CONFIGURATION="${9}"
+PROTOCOL="${10}"
+
+shift 10
+
+RAWARGS="${CONFIGURATION} -m${PROTOCOL}"
+ADDARGS="${RAWARGS} $*"
+SMBPROFILE_TDB="${LOCK_DIR}/smbprofile.tdb"
+SMBPROMETHEUS_PORT=9922
+SMBPROMETHEUS_PID=0
+
+incdir=$(dirname $0)/../../../testprogs/blackbox
+. $incdir/subunit.sh
+
+failed=0
+
+start_smbprometheus()
+{
+       if [ ! -f "${SMBPROFILE_TDB}" ]; then
+               printf "'%s' doesn't exist\n" "${SMBPROFILE_TDB}"
+               return 1
+       fi
+
+       if [ ! -x "${SMBPROMETHEUS}" ]; then
+               printf "'%s' is not executable\n" "${SMBPROMETHEUS}"
+               return 1
+       fi
+
+       ${SMBPROMETHEUS} -a "${SERVER_IP}" -p "${SMBPROMETHEUS_PORT}" "${SMBPROFILE_TDB}" &
+       SMBPROMETHEUS_PID=$!
+       sleep 1
+
+       cmd='ps -p ${SMBPROMETHEUS_PID} --no-headers'
+       eval "$cmd"
+       ret=$?
+       if [ $ret != 0 ]; then
+               printf "failed to start: '%s' is not running\n" "${SMBPROMETHEUS}"
+               return 1
+       fi
+
+       sleep 1
+
+       return 0
+}
+
+stop_smbprometheus()
+{
+       cmd='ps -p ${SMBPROMETHEUS_PID} --no-headers'
+       eval "$cmd"
+       ret=$?
+       if [ $ret != 0 ]; then
+               printf "failed to stop: '%s' is not running\n" "${SMBPROMETHEUS}"
+               return 1
+       fi
+       kill $SMBPROMETHEUS_PID
+       return 0
+}
+
+make_some_smb_ops()
+{
+       tmpfile=$PREFIX/test_smb_prometheus
+
+       cat >$tmpfile <<EOF
+du
+dir
+quit
+EOF
+
+       cmd='CLI_FORCE_INTERACTIVE=yes ${SMBCLIENT} -U${USERNAME}%${PASSWORD} //${SERVER}/tmp -I ${SERVER_IP} ${ADDARGS} < $tmpfile 2>&1'
+       out=$(eval "$cmd")
+       ret=$?
+       rm -f "$tmpfile"
+
+       if [ $ret != 0 ]; then
+               printf "failed to issue smb commands: %s\n" "${ret}"
+               return 1
+       fi
+
+       return 0
+}
+
+
+# Read metrics with cURL, expect at least one tcon
+test_smbprometheus_tcon()
+{
+       if ! make_some_smb_ops; then return 1; fi
+
+       cmd='curl -s --connect-timeout 10 http://${SERVER_IP}:${SMBPROMETHEUS_PORT}/metrics'
+       out=$(eval "$cmd")
+       ret=$?
+       if [ $ret != 0 ]; then
+               printf "failed to read metrics %s\n" "$ret"
+               return 1
+       fi
+
+       cmd="echo $out | grep tcon | wc -l"
+       out=$(eval "$cmd")
+       if [ "$out" = "0" ]; then
+               printf "failed to read tcon metrics %s\n" "$ret"
+               return 1
+       fi
+
+       return 0
+}
+
+# Expect specific metrics info
+test_smbprometheus_info()
+{
+       if ! make_some_smb_ops; then return 1; fi
+
+       cmd='curl -s --connect-timeout 10 http://${SERVER_IP}:${SMBPROMETHEUS_PORT}/metrics'
+       out=$(eval "$cmd")
+       ret=$?
+       if [ $ret != 0 ]; then
+               printf "failed to read metrics %s\n" "$ret"
+               return 1
+       fi
+
+       subs="smb_worker_smbd_num smb_smb2_request_inbytes smb_smb2_request_outbytes smb_smb2_request_duration_microseconds_bucket"
+       for sub in ${subs}; do
+               cnt=$(echo "${out}" | grep -c "${sub}")
+               if [ "$cnt" = "0" ]; then
+                       printf "failed to read metrics %s\n" "$sub"
+                       return 1
+               fi
+       done
+}
+
+# Read metrics multiple times
+test_smbprometheus_many()
+{
+       if ! make_some_smb_ops; then return 1; fi
+
+       cmd='curl -s --connect-timeout 10 http://${SERVER_IP}:${SMBPROMETHEUS_PORT}/metrics'
+       for i in $(seq 0 100); do
+               out=$(eval "$cmd")
+               ret=$?
+               if [ $ret != 0 ]; then
+                       printf "failed to read metrics %s\n" "$ret"
+                       return 1
+               fi
+               cnt=$(echo "${out}" | grep -c "smb_worker_smbd_num")
+               if [ "$cnt" = "0" ]; then
+                       printf "failed to read metrics %s\n" "$out"
+                       return 1
+               fi
+       done
+
+       return 0
+}
+
+# Require curl utility
+if ! command -v curl > /dev/null; then exit 0; fi
+
+# Start smb_prometheus_endpoint from within test script
+start_smbprometheus || exit 1
+trap "stop_smbprometheus" EXIT
+
+# Actual tests
+testit "test_smbprometheus_tcon" \
+       test_smbprometheus_tcon ||
+       failed=$(expr $failed + 1)
+
+testit "test_smbprometheus_info" \
+       test_smbprometheus_info ||
+       failed=$(expr $failed + 1)
+
+testit "test_smbprometheus_many" \
+       test_smbprometheus_many ||
+       failed=$(expr $failed + 1)
+
+testok $0 $failed
index 437a4a8ee137bc2674755151e597eb60ab2ee292..98d7084048fe24ef2b42db08ad28239b90bb71be 100755 (executable)
@@ -35,6 +35,7 @@ from selftesthelpers import smbtorture4_options
 from selftesthelpers import smbcontrol
 from selftesthelpers import smbstatus
 from selftesthelpers import timelimit
+from selftesthelpers import smb_prometheus_endpoint
 smbtorture4_options.extend([
     '--option=torture:sharedelay=100000',
    '--option=torture:writetimeupdatedelay=500000',
@@ -955,6 +956,10 @@ for env in ["fileserver:local"]:
 
     plantestsuite("samba3.blackbox.smbstatus", env, [os.path.join(samba3srcdir, "script/tests/test_smbstatus.sh"), '$SERVER', '$SERVER_IP', '$DOMAIN', '$USERNAME', '$PASSWORD', '$USERID', '$LOCAL_PATH', '$PREFIX', smbclient3, smbstatus, configuration, "SMB3"])
     plantestsuite("samba3.blackbox.net_registry_import", env, [os.path.join(samba3srcdir, "script/tests/test_net_registry_import.sh"), '$SERVER', '$LOCAL_PATH', '$USERNAME', '$PASSWORD'])
+    plantestsuite("samba3.blackbox.smb_prometheus_endpoint", env,
+                  [os.path.join(samba3srcdir, "script/tests/test_smb_prometheus_endpoint.sh"),
+                   '$SERVER', '$SERVER_IP', '$USERNAME', '$PASSWORD', '$LOCK_DIR', '$PREFIX',
+                   smb_prometheus_endpoint, smbclient3, configuration, "SMB3"])
 
 env = 'ad_member'
 plantestsuite("samba3.blackbox.smbget",