#!/bin/sh
# PCP QA Test No. 1602
# Exercise Redis protocol proxying using redis-cli(1).
#
# Copyright (c) 2019 Red Hat.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check
. ./common.redis

_check_series
_check_redis_server_version_offline

_cleanup()
{
    cd $here
    [ -n "$pmproxy_pid" ] && $signal -s TERM $pmproxy_pid
    _redis_cluster_3nodes_stop
    if $need_restore
    then
	need_restore=false
        _restore_config $PCP_SYSCONF_DIR/pmproxy
    fi
    $sudo rm -rf $tmp $tmp.*
}

status=1	# failure is the default!
signal=$PCP_BINADM_DIR/pmsignal

userid=`id -u`
groupid=`id -g`
username=`id -u -n`
hostname=`hostname`
machineid=`_machine_id`
domainname=`_domain_name`

need_restore=false
$sudo rm -rf $tmp $tmp.* $seq.full
trap "_cleanup; exit \$status" 0 1 2 3 15

_filter_redis()
{
    sed \
        -e "s,:$port1>,:PORT1>,g" \
    #end
}

# real QA test starts here
_save_config $PCP_SYSCONF_DIR/pmproxy
$sudo rm -f $PCP_SYSCONF_DIR/pmproxy/*
need_restore=true

# start Redis cluster
_redis_cluster_3nodes_start
echo

echo "== start pmproxy"
# start pmproxy 
cat >$tmp.conf <<EOF
[pmproxy]
pcp.enabled = true
redis.enabled = true
[pmseries]
servers = localhost:$redis_node1_port,localhost:$redis_node2_port,localhost:$redis_node3_port
EOF
proxyport=`_find_free_port`
proxyopts="-p $proxyport -c $tmp.conf"
pmproxy -f -t -U $username -x $seq.full -l $tmp.pmproxy.log $proxyopts &
pmproxy_pid=$!
echo "proxyport=$proxyport" >>$seq.full
echo "pmproxy_pid=$pmproxy_pid" >>$seq.full
which netstat >/dev/null && netstat -a | egrep "$redisport1|$proxyport" >>$seq.full
pmsleep 0.125
echo "PING_PROXY"
redis-cli -p $proxyport ping
echo

# check pmproxy has started and is available for requests
pmcd_wait -h localhost@localhost:$proxyport -v -t 5sec

# check redis protocol proxying
echo "== redis-cli set two keys"
redis-cli -p $proxyport set pcpqa:$seq:one 1
redis-cli -p $proxyport set pcpqa:$seq:ten 10
echo

# check pcp protocol proxying
echo "== pminfo get two metrics"
pminfo -f -h localhost@localhost:$proxyport sample.long.one sample.long.ten
echo

# check redis protocol proxying
echo "== redis-cli get two keys"
redis-cli -p $proxyport get pcpqa:$seq:one
redis-cli -p $proxyport get pcpqa:$seq:ten
echo

# check redis protocol error handling
echo "== redis-cli empty key set"
redis-cli -p $proxyport keys no-such-key
echo
echo "== redis-cli handle errors 1"
redis-cli -p $proxyport get foo bar baz
echo
echo "== redis-cli handle errors 2"
redis-cli -p $proxyport set foo bar baz
echo
echo "== redis-cli nonexistant key"
redis-cli -p $proxyport get abc
echo

# check key distribution
echo "== redis cluster key distribution"
echo "== node1"
redis-cli -p $redis_node1_port keys pcpqa:*
echo "== node2"
redis-cli -p $redis_node2_port keys pcpqa:*
echo "== node3"
redis-cli -p $redis_node3_port keys pcpqa:*
echo

cat $tmp.conf >> $seq.full
$PCP_PS_PROG $PCP_PS_ALL_FLAGS | grep pmproxy >> $seq.full
cat $tmp.pmproxy.log >> $seq.full

echo "== all done" | tee -a $seq.full
status=0
exit
