#!/usr/bin/env bash # RFC 6241: # 7.3 - Even if it advertises the :writable-running capability, a device # MAY choose not to support the configuration datastore # as the parameter of a operation. # - If the and parameters identify the same URL or # configuration datastore, an error MUST be returned with an error- # tag containing "invalid-value". # 8.3.5.1 The candidate configuration can be used as a source or target # 8.4.1 If :startup capability is advertized, from running to # startup is also necessary # 8.8.5.2 :url capability accepts element as value of # the and the parameters. # # The test checks that these are allowed: # running->startup # running->candidate # candidate->startup # startup->candidate # And checks that copying to running is not allowed # 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 # include err() and new() functions and creates $dir cfg=$dir/conf_yang.xml # Use yang in example cat < $cfg $cfg ietf-netconf:startup 42 /usr/local/share/clixon $IETFRFC clixon-example /usr/local/lib/$APPNAME/clispec /usr/local/lib/$APPNAME/backend example_backend.so$ /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 $dir EOF # Create empty startup cat < $dir/startup_db EOF # rm candidate and running rm -f $dir/running_db rm -f $dir/candidate_db new "test params: -f $cfg" # 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" start_backend -s init -f $cfg new "waiting" wait_backend fi new "Add config to candidate" expecteof "$clixon_netconf -qf $cfg" 0 'eth/0/0ex:ethnone ]]>]]>' "^]]>]]>$" new "netconf commit to running" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "Delete candidate" expecteof "$clixon_netconf -qf $cfg" 0 'eth/0/0ex:ethnone ]]>]]>' '^]]>]]>$' # Here startup and candidate are empty, only running has content # test running->startup and running->candidate new "Check candidate empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' new "Check startup empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' new "copy running->startup" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "copy running->candidate" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" # Here startup and candidate have content new "Check candidate content" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^eth/0/0ex:ethtrue]]>]]>$' new "Check startup content" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^eth/0/0ex:ethtrue]]>]]>$' new "Delete startup" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" # Here startup is empty and candidate has content # test candidate->startup new "Check startup empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' new "copy candidate->startup" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "Check startup content" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^eth/0/0ex:ethtrue]]>]]>$' new "Delete candidate" expecteof "$clixon_netconf -qf $cfg" 0 'eth/0/0ex:ethnone ]]>]]>' '^]]>]]>$' # Here candidate is empty and startup has content # test startup->candidate new "Check candidate empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' new "copy startup->candidate" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" new "Check candidate content" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^eth/0/0ex:ethtrue]]>]]>$' # Negative test: check copying to running is not allowed new "Delete candidate" expecteof "$clixon_netconf -qf $cfg" 0 'eth/0/0ex:ethnone ]]>]]>' '^]]>]]>$' new "netconf commit to running" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" # Here running is empty new "Check running empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' # Add to candidate new "copy startup->candidate" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^]]>]]>$" if ! $YANG_UNKNOWN_ANYDATA ; then new "copy startup->running not allowed" expecteof "$clixon_netconf -qf $cfg" 0 "]]>]]>" "^applicationunknown-elementrunningerrorFailed to find YANG spec of XML node: running with parent: target in namespace: urn:ietf:params:xml:ns:netconf:base:1.0]]>]]>$" fi # Here running is empty new "Check running empty" expecteof "$clixon_netconf -qf $cfg" 0 ']]>]]>' '^]]>]]>$' if [ $BE -eq 0 ]; then exit # BE fi 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 sudo clixon_backend -z -f $cfg if [ $? -ne 0 ]; then err "kill backend" fi rm -rf $dir