summaryrefslogtreecommitdiffstats
path: root/tests/mmkubernetes-cache-expire.sh
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xtests/mmkubernetes-cache-expire.sh167
1 files changed, 167 insertions, 0 deletions
diff --git a/tests/mmkubernetes-cache-expire.sh b/tests/mmkubernetes-cache-expire.sh
new file mode 100755
index 0000000..fdb7226
--- /dev/null
+++ b/tests/mmkubernetes-cache-expire.sh
@@ -0,0 +1,167 @@
+#!/bin/bash
+# added 2018-04-06 by richm, released under ASL 2.0
+#
+# Note: on buildbot VMs (where there is no environment cleanup), the
+# kubernetes test server may be kept running if the script aborts or
+# is aborted (buildbot master failure!) for some reason. As such we
+# execute it under "timeout" control, which ensure it always is
+# terminated. It's not a 100% great method, but hopefully does the
+# trick. -- rgerhards, 2018-07-21
+. ${srcdir:=.}/diag.sh init
+check_command_available timeout
+pwd=$( pwd )
+k8s_srv_port=$( get_free_port )
+generate_conf
+cachettl=10
+add_conf '
+global(workDirectory="'$RSYSLOG_DYNNAME.spool'")
+module(load="../plugins/impstats/.libs/impstats" interval="1"
+ log.file="'"$RSYSLOG_DYNNAME.spool"'/mmkubernetes-stats.log" log.syslog="off" format="cee")
+module(load="../plugins/imfile/.libs/imfile")
+module(load="../plugins/mmjsonparse/.libs/mmjsonparse")
+module(load="../contrib/mmkubernetes/.libs/mmkubernetes")
+
+template(name="mmk8s_template" type="list") {
+ property(name="$!all-json-plain")
+ constant(value="\n")
+}
+
+input(type="imfile" file="'$RSYSLOG_DYNNAME.spool'/pod-*.log" tag="kubernetes" addmetadata="on")
+action(type="mmjsonparse" cookie="")
+action(type="mmkubernetes" token="dummy" kubernetesurl="http://localhost:'$k8s_srv_port'"
+ cacheexpireinterval="1" cacheentryttl="'$cachettl'"
+ filenamerules=["rule=:'$pwd/$RSYSLOG_DYNNAME.spool'/%pod_name:char-to:.%.%container_hash:char-to:_%_%namespace_name:char-to:_%_%container_name_and_id:char-to:.%.log",
+ "rule=:'$pwd/$RSYSLOG_DYNNAME.spool'/%pod_name:char-to:_%_%namespace_name:char-to:_%_%container_name_and_id:char-to:.%.log"]
+)
+action(type="omfile" file=`echo $RSYSLOG_OUT_LOG` template="mmk8s_template")
+'
+
+testsrv=mmk8s-test-server
+echo starting kubernetes \"emulator\"
+timeout 2m $PYTHON -u $srcdir/mmkubernetes_test_server.py $k8s_srv_port ${RSYSLOG_DYNNAME}${testsrv}.pid ${RSYSLOG_DYNNAME}${testsrv}.started > ${RSYSLOG_DYNNAME}.spool/mmk8s_srv.log 2>&1 &
+BGPROCESS=$!
+wait_process_startup ${RSYSLOG_DYNNAME}${testsrv} ${RSYSLOG_DYNNAME}${testsrv}.started
+echo background mmkubernetes_test_server.py process id is $BGPROCESS
+
+if [ "x${USE_VALGRIND:-NO}" == "xYES" ] ; then
+ export EXTRA_VALGRIND_SUPPRESSIONS="--suppressions=$srcdir/mmkubernetes.supp"
+ startup_vg
+else
+ startup
+ if [ -n "${USE_GDB:-}" ] ; then
+ echo attach gdb here
+ sleep 54321 || :
+ fi
+fi
+
+# add 3 logs - then wait $cachettl - the first log should prime the cache - the next two should be pulled from the cache
+cat > ${RSYSLOG_DYNNAME}.spool/pod-name.log <<EOF
+{"message":"msg1","CONTAINER_NAME":"some-prefix_container-name1_pod-name1_namespace-name1_unused1_unused11","CONTAINER_ID_FULL":"id1","testid":1}
+EOF
+sleep 2
+cat >> ${RSYSLOG_DYNNAME}.spool/pod-name.log <<EOF
+{"message":"msg2","CONTAINER_NAME":"some-prefix_container-name1_pod-name1_namespace-name1_unused1_unused11","CONTAINER_ID_FULL":"id1","testid":2}
+EOF
+sleep 2
+cat >> ${RSYSLOG_DYNNAME}.spool/pod-name.log <<EOF
+{"message":"msg3","CONTAINER_NAME":"some-prefix_container-name1_pod-name1_namespace-name1_unused1_unused11","CONTAINER_ID_FULL":"id1","testid":3}
+EOF
+sleep $cachettl
+# we should see
+# - namespacecachenumentries and podcachenumentries go from 0 to 1 then back to 0
+# - namespacecachehits and podcachehits go from 0 to 2
+# - namespacecachemisses and podcachemisses go from 0 to 1
+# add another record - should not be cached - should have expired
+cat >> ${RSYSLOG_DYNNAME}.spool/pod-name.log <<EOF
+{"message":"msg4","CONTAINER_NAME":"some-prefix_container-name1_pod-name1_namespace-name1_unused1_unused11","CONTAINER_ID_FULL":"id1","testid":4}
+EOF
+# we should see
+# - namespacecachenumentries and podcachenumentries back to 1
+# - namespacecachehits and podcachehits did not increase
+# - namespacecachemisses and podcachemisses increases
+
+# wait for the first batch of tests to complete
+wait_queueempty
+
+shutdown_when_empty
+if [ "x${USE_VALGRIND:-NO}" == "xYES" ] ; then
+ wait_shutdown_vg
+ check_exit_vg
+else
+ wait_shutdown
+fi
+kill $BGPROCESS
+wait_pid_termination ${RSYSLOG_DYNNAME}${testsrv}.pid
+
+rc=0
+# for each record in mmkubernetes-cache-expire.out.json, see if the matching
+# record is found in $RSYSLOG_OUT_LOG
+$PYTHON -c 'import sys,json
+k8s_srv_port = sys.argv[3]
+expected = {}
+for hsh in json.load(open(sys.argv[1])):
+ if "testid" in hsh:
+ if "kubernetes" in hsh and "master_url" in hsh["kubernetes"]:
+ hsh["kubernetes"]["master_url"] = hsh["kubernetes"]["master_url"].format(k8s_srv_port=k8s_srv_port)
+ expected[hsh["testid"]] = hsh
+rc = 0
+actual = {}
+for line in open(sys.argv[2]):
+ hsh = json.loads(line)
+ if "testid" in hsh:
+ actual[hsh["testid"]] = hsh
+for testid,hsh in expected.items():
+ if not testid in actual:
+ print("Error: record for testid {0} not found in output".format(testid))
+ rc = 1
+ else:
+ for kk,vv in hsh.items():
+ if not kk in actual[testid]:
+ print("Error: key {0} in record for testid {1} not found in output".format(kk, testid))
+ rc = 1
+ elif not vv == actual[testid][kk]:
+ print("Error: value {0} for key {1} in record for testid {2} does not match the expected value {3}".format(str(actual[testid][kk]), kk, testid, str(vv)))
+ rc = 1
+sys.exit(rc)
+' $srcdir/mmkubernetes-cache-expire.out.expected $RSYSLOG_OUT_LOG $k8s_srv_port || rc=$?
+
+if [ -f ${RSYSLOG_DYNNAME}.spool/mmkubernetes-stats.log ] ; then
+ $PYTHON <${RSYSLOG_DYNNAME}.spool/mmkubernetes-stats.log -c '
+import sys,json
+# key is recordseen, value is hash of stats for that record
+expectedvalues = {
+ 1: {"namespacecachenumentries": 1, "podcachenumentries": 1, "namespacecachehits": 0,
+ "podcachehits": 0, "namespacecachemisses": 1, "podcachemisses": 1},
+ 2: {"namespacecachenumentries": 1, "podcachenumentries": 1, "namespacecachehits": 0,
+ "podcachehits": 1, "namespacecachemisses": 1, "podcachemisses": 1},
+ 3: {"namespacecachenumentries": 1, "podcachenumentries": 1, "namespacecachehits": 0,
+ "podcachehits": 2, "namespacecachemisses": 1, "podcachemisses": 1},
+ 4: {"namespacecachenumentries": 1, "podcachenumentries": 1, "namespacecachehits": 0,
+ "podcachehits": 2, "namespacecachemisses": 2, "podcachemisses": 2},
+}
+for line in sys.stdin:
+ jstart = line.find("{")
+ if jstart >= 0:
+ hsh = json.loads(line[jstart:])
+ if hsh.get("origin") == "mmkubernetes" and hsh["recordseen"] in expectedvalues:
+ expected = expectedvalues[hsh["recordseen"]]
+ for key in expected:
+ if not expected[key] == hsh.get(key):
+ print("Error: expected value [%s] not equal to actual value [%s] in record [%d] for stat [%s]".format(
+ str(expected[key]), str(hsh[key]), hsh["recordseen"], key))
+' || { rc=$?; echo error: expected stats not found in ${RSYSLOG_DYNNAME}.spool/mmkubernetes-stats.log; }
+else
+ echo error: stats file ${RSYSLOG_DYNNAME}.spool/mmkubernetes-stats.log not found
+ rc=1
+fi
+
+if [ ${rc:-0} -ne 0 ]; then
+ echo
+ echo "FAIL: expected data not found. $RSYSLOG_OUT_LOG is:"
+ cat ${RSYSLOG_DYNNAME}.spool/mmk8s_srv.log
+ cat $RSYSLOG_OUT_LOG
+ cat ${RSYSLOG_DYNNAME}.spool/mmkubernetes-stats.log
+ error_exit 1
+fi
+
+exit_test