#!/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
$cfgietf-netconf:startup42/usr/local/share/clixon$IETFRFCclixon-example/usr/local/lib/$APPNAME/clispec/usr/local/lib/$APPNAME/backendexample_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