#! /bin/sh
# PCP QA Test No. 571
#
# #676245 - dynamic indoms for pmlogger, uses sample.dynamic.*
# Check that when the instance domain changes for logged metrics
# the new indom is only added once. The bug was for pmlogger 
# adding the indom once for each metric using it.
#
# Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
#
# check-group-include: pmlogger

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

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

signal=$PCP_BINADM_DIR/pmsignal
status=1	# failure is the default!
control=$PCP_PMDAS_DIR/sample/dynamic.indom
logger_pid=-1

PMLOGGER=pmlogger
SLEEPY=5

_cleanup()
{
    if [ $logger_pid -gt 0 ]
    then
	$signal -s TERM $logger_pid
	logger_pid=-1
    fi
   
   $sudo rm -f $control

   pmdumplog -a $tmp.logfile >>$here/$seq.full

    [ -f $control.qa-$seq ] && $sudo mv $control.qa-$seq $control
    rm -f $tmp.*
}

$sudo rm -f $control.qa-$seq $seq.full

trap "_cleanup; exit \$status" 0 1 2 3 15

[ -f $control ] && $sudo mv $control $control.qa-$seq

# real QA test starts here

_start_logger()
{
    cat >$tmp.logconf <<End-of-File
log advisory on 2 sec {
    sample.dynamic
}
End-of-File

    $PMLOGGER -c $tmp.logconf -l $tmp.log $tmp.logfile &
    logger_pid=$!
}

# - replace timestamps by TIMESTAMP-n
# - skip InDom 2.1 (pmcd.pmlogger.* metrics) where instances are not
#   deterministic
#
_filter()
{
    cat >$tmp.tmp
    sed -n -e '/^[0-9]/p' <$tmp.tmp \
    | sort \
    | uniq >$tmp.stamps

    ( cat $tmp.stamps \
      ; echo "---" \
      ; cat $tmp.tmp \
    ) \
    | $PCP_AWK_PROG '
BEGIN		{ state = 0; i = 0 }
$1 == "---"	{ state = 1; next }
/InDom: 2.1/	{ skip = 2; next }
skip > 0	{ skip--; next }
state == 0	{ stamp[$1] = "TIMESTAMP-" i; i++; next }
/^[0-9]/	{ if ($0 ~ /^[0-9]/) {
		    if (stamp[$1] != "")
			$1 = stamp[$1]
		    else
			$1 = $1 "-BOTCHED-MATCH"
		  }
		  print
		  next
		}
		{ print }'
}

_dumplog()
{
    sleep $SLEEPY
    pmdumplog -i $tmp.logfile | _filter
    pmdumplog -im $tmp.logfile sample.dynamic.instant | _filter >>$here/$seq.full
}

# start the pmlogger
#
_start_logger

# do the first instance dump
#
_dumplog

# Change the instances
#
cat >$tmp.indom <<End-of-File
10 one
20 two
30 three
200 twenty
End-of-File
$sudo rm -f $control
$sudo cp $tmp.indom $control

# do the instance dump
#
_dumplog

# Add an instance
#
cat >$tmp.indom <<End-of-File
10 one
20 two
30 three
200 twenty
400 fourty
End-of-File
$sudo rm -f $control
$sudo cp $tmp.indom $control

# do the instance dump
#
_dumplog

# Change an instance
#
cat >$tmp.indom <<End-of-File
10 one
20 two
30 three
200 twenty
500 fifty
End-of-File
$sudo rm -f $control
$sudo cp $tmp.indom $control

# do the instance dump
#
_dumplog

# Remove some instances
#
cat >$tmp.indom <<End-of-File
10 one
20 two
30 three
End-of-File
$sudo rm -f $control
$sudo cp $tmp.indom $control

# do the instance dump
#
_dumplog

# success, all done
status=0
exit
