rsyslog/tests/mmkubernetes-basic-vg.sh
Rich Megginson fb4a41ca47 mmkubernetes: stops working with non-kubernetes container names
When mmkubernetes encounters a record with a CONTAINER_NAME field,
but the value does not match the rulebase, mmkubernetes returns
an error, and mmkubernetes does not do any further processing
of any records.
The fix is to check the return value of ln_normalize to see if
it is a "hard" error or a "does not match" error.
This also adds a test for pod names with dots in them.
2018-07-26 14:21:55 -06:00

107 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
# added 2018-04-06 by richm, released under ASL 2.0
#
# Note: on buidbot 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
#export RSYSLOG_DEBUG="debug"
. $srcdir/diag.sh init
. $srcdir/diag.sh check-command-available timeout
testsrv=mmk8s-test-server
timeout 3m python ./mmkubernetes_test_server.py 18443 rsyslog${testsrv}.pid rsyslogd${testsrv}.started > mmk8s_srv.log 2>&1 &
BGPROCESS=$!
. $srcdir/diag.sh wait-startup $testsrv
echo background mmkubernetes_test_server.py process id is $BGPROCESS
pwd=$( pwd )
generate_conf
add_conf '
module(load="../plugins/imfile/.libs/imfile")
module(load="../plugins/mmjsonparse/.libs/mmjsonparse")
module(load="../contrib/mmkubernetes/.libs/mmkubernetes" token="dummy" kubernetesurl="http://localhost:18443"
filenamerules=["rule=:'$pwd'/%pod_name:char-to:.%.%container_hash:char-to:_%_%namespace_name:char-to:_%_%container_name_and_id:char-to:.%.log",
"rule=:'$pwd'/%pod_name:char-to:_%_%namespace_name:char-to:_%_%container_name_and_id:char-to:.%.log"]
)
template(name="mmk8s_template" type="list") {
property(name="$!all-json-plain")
constant(value="\n")
}
input(type="imfile" file="'$pwd'/pod-*.log" tag="kubernetes" addmetadata="on")
action(type="mmjsonparse" cookie="")
action(type="mmkubernetes")
action(type="omfile" file="rsyslog.out.log" template="mmk8s_template")
'
cat > pod-error1.log <<EOF
{"log":"not in right format","stream":"stdout","time":"2018-04-06T17:26:34.492083106Z"}
EOF
cat > pod-error2.log <<EOF
{"message":"not in right format","CONTAINER_NAME":"not in right format","CONTAINER_ID_FULL":"id3"}
EOF
cat > pod-name1_namespace-name1_container-name1-id1.log <<EOF
{"log":"{\"type\":\"response\",\"@timestamp\":\"2018-04-06T17:26:34Z\",\"tags\":[],\"pid\":75,\"method\":\"head\",\"statusCode\":200,\"req\":{\"url\":\"/\",\"method\":\"head\",\"headers\":{\"user-agent\":\"curl/7.29.0\",\"host\":\"localhost:5601\",\"accept\":\"*/*\"},\"remoteAddress\":\"127.0.0.1\",\"userAgent\":\"127.0.0.1\"},\"res\":{\"statusCode\":200,\"responseTime\":1,\"contentLength\":9},\"message\":\"HEAD1 / 200 1ms - 9.0B\"}\n","stream":"stdout","time":"2018-04-06T17:26:34.492083106Z"}
EOF
cat > pod-name2.container-hash2_namespace-name2_container-name2-id2.log <<EOF
{"log":"{\"type\":\"response\",\"@timestamp\":\"2018-04-06T17:26:34Z\",\"tags\":[],\"pid\":75,\"method\":\"head\",\"statusCode\":200,\"req\":{\"url\":\"/\",\"method\":\"head\",\"headers\":{\"user-agent\":\"curl/7.29.0\",\"host\":\"localhost:5601\",\"accept\":\"*/*\"},\"remoteAddress\":\"127.0.0.1\",\"userAgent\":\"127.0.0.1\"},\"res\":{\"statusCode\":200,\"responseTime\":1,\"contentLength\":9},\"message\":\"HEAD2 / 200 1ms - 9.0B\"}\n","stream":"stdout","time":"2018-04-06T17:26:34.492083106Z"}
EOF
cat > pod-name3.log <<EOF
{"message":"a message from container 3","CONTAINER_NAME":"some-prefix_container-name3.container-hash3_pod-name3_namespace-name3_unused3_unused33","CONTAINER_ID_FULL":"id3"}
EOF
cat > pod-name4.log <<EOF
{"message":"a message from container 4","CONTAINER_NAME":"some-prefix_container-name4_pod-name4_namespace-name4_unused4_unused44","CONTAINER_ID_FULL":"id4"}
EOF
cat > pod-name5.log <<EOF
{"message":"a message from container 5","CONTAINER_NAME":"some-prefix_container-name5_pod-name5.with.dot.in.pod.name_namespace-name5_unused5_unused55","CONTAINER_ID_FULL":"id5"}
EOF
rm -f imfile-state\:*
startup_vg_noleak
sleep 10 || :
shutdown_when_empty
wait_shutdown_vg
. $srcdir/diag.sh check-exit-vg
kill $BGPROCESS
. $srcdir/diag.sh wait-pid-termination rsyslog${testsrv}.pid
cat mmk8s_srv.log
# for each record in mmkubernetes-basic.out.json, see if the matching
# record is found in rsyslog.out.log
python -c 'import sys,json
expected = {}
for hsh in json.load(open(sys.argv[1])):
if "kubernetes" in hsh and "pod_name" in hsh["kubernetes"]:
expected[hsh["kubernetes"]["pod_name"]] = hsh
rc = 0
actual = {}
for line in open(sys.argv[2]):
hsh = json.loads(line)
if "kubernetes" in hsh and "pod_name" in hsh["kubernetes"]:
actual[hsh["kubernetes"]["pod_name"]] = hsh
for pod,hsh in expected.items():
if not pod in actual:
print("Error: record for pod {0} not found in output".format(pod))
rc = 1
else:
for kk,vv in hsh.items():
if not kk in actual[pod]:
print("Error: key {0} in record for pod {1} not found in output".format(kk, pod))
rc = 1
elif not vv == actual[pod][kk]:
print("Error: value {0} for key {1} in record for pod {2} does not match the expected value {3}".format(actual[pod][kk], kk, pod, vv))
rc = 1
sys.exit(rc)
' mmkubernetes-basic.out.json rsyslog.out.log
if [ $? -ne 0 ]; then
echo
echo "FAIL: expected data not found. rsyslog.out.log is:"
cat rsyslog.out.log
error_exit 1
fi
exit_test