#!/usr/bin/env bash # Transaction functionality: restart single plugin and observe that only that plugin # gets callbacks # The test uses two backend plugins (main and nacm) that logs. # nacm is then restarted, not main # Magic line must be first in script (see README.md) s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi APPNAME=example cfg=$dir/conf_yang.xml fyang=$dir/trans.yang flog=$dir/backend.log touch $flog # Used as a trigger for user-validittion errors, eg $errnr is invalid errnr=42 cat < $fyang module trans{ yang-version 1.1; namespace "urn:example:clixon"; prefix ex; /* Generic config data */ container table{ list parameter{ key name; leaf name{ type string; } leaf value{ type string; } } } } EOF cat < $cfg $cfg ${YANG_INSTALLDIR} $fyang /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/backend /usr/local/lib/$APPNAME/netconf /usr/local/lib/$APPNAME/restconf /usr/local/lib/$APPNAME/cli $APPNAME $dir/$APPNAME.sock /usr/local/var/$APPNAME/$APPNAME.pidfile /usr/local/var/$APPNAME EOF # Check statements in log # arg1: a statement to look for # arg2: expected line number function checklog(){ s=$1 # statement l0=$2 # linenr new "Check $s in log" # echo "grep \"transaction_log $s line:$l0\" $flog" t=$(grep -n "transaction_log $s" $flog) if [ -z "$t" ]; then echo -e "\e[31m\nError in Test$testnr [$testname]:" if [ $# -gt 0 ]; then echo "Not found in log" echo fi echo -e "\e[0m" exit -1 fi l1=$(echo "$t" | awk -F ":" '{print $1}') if [ $l1 -ne $l0 ]; then echo -e "\e[31m\nError in Test$testnr [$testname]:" if [ $# -gt 0 ]; then echo "Expected match on line $l0, found on $l1" echo fi echo -e "\e[0m" exit -1 fi } new "test params: -f $cfg -l f$flog -- -t" # Fail on this # Bring your own backend if [ $BE -ne 0 ]; then # kill old backend (if any) new "kill old backend" sudo clixon_backend -zf $cfg if [ $? -ne 0 ]; then err fi new "start backend -s init -f $cfg -l f$flog -- -t /foo" start_backend -s init -f $cfg -l f$flog -- -t /foo # -t means transaction logging (foo is dummy) fi new "wait backend" wait_backend let nr=0 new "Basic transaction to add top-level x" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "$nr
" "" "" new "Commit base" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "" "" "" let line=13 # Skipping basic transaction. Sanity check, find one last transaction xml="0
" checklog "$nr nacm_end add: $xml" $line new "Send restart nacm plugin" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "example_backend_nacm" "" "" # Now analyze log: # all transactions come from nacm plugin only. let nr++ let line=14 for op in begin validate complete commit commit_done end; do checklog "$nr nacm_$op add: $xml" $line let line++ done # Negative test: restart a plugin that does not exist new "Send restart to nonexistatn plugin expect fail" expecteof_netconf "$clixon_netconf -qf $cfg" 0 "$DEFAULTHELLO" "xxx" "" "applicationbad-elementpluginerrorNo such plugin" if [ $BE -ne 0 ]; then new "Kill backend" # Check if premature kill pid=$(pgrep -u root -f clixon_backend) if [ -z "$pid" ]; then err "backend already dead" fi # kill backend stop_backend -f $cfg fi rm -rf $dir new "endtest" endtest