#!/usr/bin/env bash # Restconf direct start/stop using RPC and config enable flag (as alternative to systemd or other) # According tot he following behaviour: # - on RPC start, if enable is true, start the service, if false, error or ignore it # - on RPC stop, stop the service # - on backend start make the state as configured # - on enable change, make the state as configured # - No restconf config means enable: false (extra rule) # See test_restconf_netns for network namespaces # 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.xml startupdb=$dir/startup_db cat < $cfg $cfg ietf-netconf:startup /usr/local/share/clixon $IETFRFC $dir /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/backend example_backend.so$ /usr/local/lib/$APPNAME/restconf false /usr/local/lib/$APPNAME/cli $APPNAME /usr/local/var/$APPNAME/$APPNAME.sock /usr/local/var/$APPNAME/$APPNAME.pidfile $dir true true $RESTCONFIG EOF # Subroutine send a process control RPC and tricks to echo process-id returned # Args: # 1: operation # 2: expectret 0: means expect pi 0 as return, else something else testrpc() { operation=$1 expectret=$2 new "send rpc $operation" ret=$($clixon_netconf -qf $cfg< restconf $operation ]]>]]> EOF ) expect1="" match=$(echo "$ret" | grep --null -Go "$expect1") if [ -z "$match" ]; then err "$expect1" "$ret" fi expect2="]]>]]>" match=$(echo "$ret" | grep --null -Go "$expect2") if [ -z "$match" ]; then err "$expect2" "$ret" fi new "check rpc $operation get pid" pid=$(echo "$ret" | awk -F'[<>]' '{print $5}') if [ -z "$pid" ]; then err "Running process" "$ret" fi new "check restconf retvalue" if [ $expectret -eq 0 ]; then if [ $pid -ne 0 ]; then err "No process" "$pid" fi else if [ $pid -eq 0 ]; then err "Running process" fi fi >&2 echo "pid:$pid" # debug echo $pid # cant use return that only uses 0-255 } new "ENABLE true" # First basic operation with restconf enable is true cat< $startupdb true EOF new "kill old restconf" stop_restconf_pre new "test params: -f $cfg" if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -z -f $cfg if [ $? -ne 0 ]; then err fi new "start backend -s startup -f $cfg" start_backend -s startup -f $cfg new "wait backend" wait_backend fi # Get pid of running process and check return xml new "Get rpc status" pid0=$(testrpc status 1) if [ $? -ne 0 ]; then exit -1; fi new "check restconf process running using ps pid0:$pid0" ps=$(ps -hp $pid0) if [ -z "$ps" ]; then err "A restconf running" fi new "stop restconf RPC" pid1=$(testrpc stop 0) if [ $? -ne 0 ]; then exit -1; fi new "Get rpc status stopped" pid2=$(testrpc status 0) if [ $? -ne 0 ]; then exit -1; fi new "Start rpc again" pid3=$(testrpc start 1) if [ $? -ne 0 ]; then exit -1; fi new "check restconf process running using ps" ps=$(ps -hp $pid3) if [ -z "$ps" ]; then err "A restconf running" fi if [ $pid0 -eq $pid3 ]; then err "A different pid" "$pid3" fi new "kill restconf" stop_restconf_pre new "start restconf RPC" pid4=$(testrpc start 1) if [ $? -ne 0 ]; then exit -1; fi new "check status RPC on" pid5=$(testrpc status 1) if [ $? -ne 0 ]; then exit -1; fi new "restart restconf RPC" pid6=$(testrpc restart 1) if [ $? -ne 0 ]; then exit -1; fi new "Get restconf status rpc" pid7=$(testrpc status 1) if [ $? -ne 0 ]; then exit -1; fi if [ $pid5 -eq $pid7 ]; then err "A different pid" "$pid7" fi #if [ $valgrindtest -eq 0 ]; then # Cant get pgrep to work properly # new "check new pid" # sleep $DEMWAIT # Slows the tests down considerably, but needed in eg docker test # pid1=$(pgrep clixon_restconf) # if [ -z "$pid0" -o -z "$pid1" ]; then # err "Pids expected" "pid0:$pid0 = pid1:$pid1" # fi # if [ $pid0 -eq $pid1 ]; then# # err "Different pids" "pid0:$pid0 = pid1:$pid1" # fi #fi 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 # So far, no restconf config enable flag has been true. Now change enable flag. new "ENABLE false" # Second basic operation with restconf enable is false cat< $startupdb false EOF new "kill old restconf" stop_restconf_pre new "test params: -f $cfg" if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -z -f $cfg if [ $? -ne 0 ]; then err fi new "start backend -s startup -f $cfg" start_backend -s startup -f $cfg new "waiting" wait_backend fi new "check status RPC off" pid=$(testrpc status 0) if [ $? -ne 0 ]; then exit -1; fi new "start restconf RPC" pid=$(testrpc start 0) if [ $? -ne 0 ]; then exit -1; fi new "check status RPC off" pid=$(testrpc status 0) if [ $? -ne 0 ]; then exit -1; fi new "Enable restconf" expecteof "$clixon_netconf -qf $cfg" 0 "mergetrue]]>]]>" "^]]>]]>$" new "netconf commit" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "check status RPC on" pid=$(testrpc status 1) if [ $? -ne 0 ]; then exit -1; fi new "Disable restconf" expecteof "$clixon_netconf -qf $cfg" 0 "mergefalse]]>]]>" "^]]>]]>$" new "netconf commit" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "check status RPC off" pid=$(testrpc status 0) if [ $? -ne 0 ]; then exit -1; fi # Negative validation checks of clixon-restconf / socket new "netconf edit config invalid ssl" expecteof "$clixon_netconf -qf $cfg" 0 "truedefault
0.0.0.0
80true
]]>]]>" "^]]>]]>$" new "netconf validate should fail" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^applicationoperation-failederrorSSL enabled but server-cert-path not set]]>]]>$" unset pid sleep $DEMWAIT # Lots of processes need to die before next test new "endtest" endtest rm -rf $dir